求助一个关于替换HTML页面JS脚本的问题

yunshao 2009-10-14 09:43:44
各位大哥好,我的意图是:制作一个BHO插件,当IE浏览器打开某网页时,搜索到网页加载的一个JS脚本,替换掉这行HTML代码,使之调用我本地的一个JS脚本。

我已初步实现该功能,但遇到一个关于刷新的问题,还请各位高手帮忙指点指点,非常感谢!

测试代码如下:

测试页面:
<html>
<script type="text/javascript" src="F://a.js"></script>
<input type="submit" name="btnLogin" value="测试" onclick="showa()">
<body>
</body>
</html>

a.js(假设这个是页面原本要加载的js):
function showa()
{
alert('a');
}

b.js(假设这个是我要替换为我本地的js):
function showa() // 与 a.js 的函数保持一致
{
alert('b'); // 但执行的是另一段内容
}

实现方法:
响应 OnDocumentComplete 事件,首先 get_Document,然后 get_scripts,接着遍历得到的 IHTMLElementCollection,最后查找需要替换的 IHTMLElement ,设置其属性 src="F://b.js" 。

经测试,已可以实现替换JS的效果(点击按钮时,弹出"b"),但问题是:如果此时页面刷新,再点击按钮时又恢复了a.js(点击按钮时,弹出"a"),而且页面刷新时,不会再次响应 OnDocumentComplete 事件!

不知哪位大哥有这方面的经验和心得,还望不吝指点,万份感谢!


PS:我以前做过一个类似的项目,将页面上的一段HTML替换为某种自定义协议的link,当点击该link时,调用我们的一个软件(类似于迅雷下载),当时页面刷新没什么问题的,不知为何现在不行了
...全文
614 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunshao 2010-02-25
  • 打赏
  • 举报
回复
不好意思,楼上的几位朋友,年前忙过头了,都忘了结贴了,实际上我想做的这个事情没有搞成功。程序方面是搞定了,在本地测试没有问题,但实际应用时就不行了(因为不仅仅是替换js,还有认证等东西,所以最后没搞成功)。不管怎样,都非常感谢各位的指点!
norsd 2010-01-12
  • 打赏
  • 举报
回复
你要替换js , 我做过类似的,不过不是替换js,而是添加js

我没有使用 DownloadComplete,

我是用了 NavigateComplete .

NavigateComplete 含有一个 IDispatch* 的对象 pDisp , 就是一个WebBrowser.
你可以比较是否是顶层WebBrowser, 如果是就可以进行替换js .
pagou 2010-01-05
  • 打赏
  • 举报
回复
如何让js运行前替换一个js代码呢。
例如alert("a")?我试了几个事件,只有navigatecompelete2事件可以在js运行前替换,但是有一个严重问题就是这个事件发生时,整个html还没有下载完,所以网页后面部分的js脚本根本检测不到。
等下载完,又不发生这个事件了,其他事件发生时,例如downloadcompelete事件发生时,js已经运行了,我指的运行就是alert()函数已经弹出了。
winvxd 2009-10-18
  • 打赏
  • 举报
回复
替换什么呢,根本不用替换,比如原来的html里有函数,比如
function test()
{
....
}
你只要通过接口执行方法execScript来执行自己的一段脚本来覆盖原来的test方法。
yunshao 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
处理DownloadComplete,刷新不会触发DocumentComplete
[/Quote]

非常感谢楼上的大哥,不过还是有点小问题,DownloadComplete 好像进入很频繁,比如 frame 加载完毕时它也会进入,所以我在这里加了这行代码判断:

READYSTATE readyState;
m_spWebBrowser->get_ReadyState(&readyState);

if (readyState == READYSTATE_COMPLETE)
{
// 开始替换js
}

但是发现使用那个测试页面,怎么也进不来,状态只会是 READYSTATE_LOADING(第一次打开时) 或 READYSTATE_INTERACTIVE(刷新时),不知道 DownloadComplete 这个事件具体的触发条件是什么?在何时进行替换是最安全的(文档下载完毕)?

非常感谢!
MoXiaoRab 2009-10-14
  • 打赏
  • 举报
回复
处理DownloadComplete,刷新不会触发DocumentComplete

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧