我使用 bho 制作ie 的插件,希望在浏览的每个网页中,插入特定的 内容,
目前使用的方法是:在 DISPID_DOCUMENTCOMPLETE 以后,通过 IHTMLDocument2 的 get_body 方法 获得 网页的 <body> 然后通过 IHTMLElement 的 put_innerHTML 方法 和 get_innerHTML 方法修改网页。但是这样做 有两个 不足:
1、如果 通过 put_innerHTML 插入的内容 包含 <script>...</script> ,那么 脚本中的内容 是不会不执行的,但是我正好需要通过 script 来为用户提供服务。
2、对于 有些网页,会出现 “ie 无法打开internet 站点” 的提示框。
所以 我打算 采用 另外的方案来实现:
在 网页下载完毕,并且是 documentComplete 以前,获得网页内容,实现对网页的修改, 然后 由浏览器 显示修改后的网页, 而不是 documentComplete 以后再修改。
好像 应该在 DOWNLOADCOMPLETE 后进行, 但是此时 无法调用 get_Document 得到 IHTMLDocument2 ,那么应该如何 获取并 修改网页呢?
目前使用的方法是:在 DISPID_DOCUMENTCOMPLETE 以后,通过 IHTMLDocument2 的 get_body 方法 获得 网页的 <body> 然后通过 IHTMLElement 的 put_innerHTML 方法 和 get_innerHTML 方法修改网页。但是这样做 有两个 不足:
1、如果 通过 put_innerHTML 插入的内容 包含 <script>...</script> ,那么 脚本中的内容 是不会不执行的,但是我正好需要通过 script 来为用户提供服务。
2、对于 有些网页,会出现 “ie 无法打开internet 站点” 的提示框。
所以 我打算 采用 另外的方案来实现:
在 网页下载完毕,并且是 documentComplete 以前,获得网页内容,实现对网页的修改, 然后 由浏览器 显示修改后的网页, 而不是 documentComplete 以后再修改。
好像 应该在 DOWNLOADCOMPLETE 后进行, 但是此时 无法调用 get_Document 得到 IHTMLDocument2 ,那么应该如何 获取并 修改网页呢?
2 遗憾的是,不行。
CreateElement 和 AppendChild 好像都不是 IHTMLElement 的 方法,在 msdn 上也都没有 找到 他们的介绍。是不是 先 IHTMLElement->get_document( dom ) ; 再 dom ->CreateElemen() ?能不能给一个具体的实例 ,小弟愚笨 有劳大侠 了。
var head = document.getElementsByTagName('head').item(0);head.appendChild(script);
http://www.dotvoid.com/view.php?id=13
但是又遇到一个问题:
我无法使用 IHTMLDOMNode 等函数, 我的 mshtml.h 里没有 声明此函数。 而且 ,我的 msdn 中也找不到这个函数, 使用因为 版本太老吗? 不好意思,我是第一次使用 vc ,当前使用的版本 是 6.0 , 安装在一个叫 /VC98/ 的目录下面,是否说明 这个版本 就是 98年的, 是不是 升级到 .net 才能使用 上面提及的函数, 或者 可不可以 在不升级 vc 的情况下, 更新 库文件?
但是 使用 CreateElement、AppendChild 的方法,还是遇到老问题了:
可以 添加一幅图片,但是不能 运行 添加的 <script>
// 创建 一个 <div> 元素
IHTMLElement *pEleDiv;
if( S_OK != m_spHtmlDoc->createElement( L"div", &pEleDiv ) )
return false;
pEleDiv->put_innerHTML(
L"<script defer>alert('test')</script><img src=http://pics.taobao.com/2k5/chl/v1/lady/760x150_051101_lady.jpg>");
IHTMLDOMNode *pNodeDiv;
if( pEleDiv->QueryInterface(IID_IHTMLDOMNode, (void**)&pNodeDiv) != S_OK )
return false;//pNodeDiv->insertBefore( pNodeScript );if( pNodeBody->appendChild(pNodeDiv, NULL) != S_OK )
return false;[/code]
运行的结果是 <img> 出现了,但是 <script> 中的内容还是 没有执行 ... ...