我使用 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 ,那么应该如何 获取并 修改网页呢?

解决方案 »

  1.   

    1 动态脚本要CreateElement之后AppendChild
    2 遗憾的是,不行。
      

  2.   

    请教楼上的 大侠:
    CreateElement 和 AppendChild  好像都不是  IHTMLElement  的 方法,在 msdn 上也都没有 找到 他们的介绍。是不是 先   IHTMLElement->get_document( dom )  ;   再  dom ->CreateElemen()  ?能不能给一个具体的实例  ,小弟愚笨   有劳大侠 了。
      

  3.   

    var script = document.createElement('script');script.src = 'server.js';script.type = 'text/javascript';script.defer = true;
    var head = document.getElementsByTagName('head').item(0);head.appendChild(script);
    http://www.dotvoid.com/view.php?id=13
      

  4.   

    jiangsheng(蒋晟) :我根据你的提示, 又 察看了一些 其他的资料, 已经基本 搞明白是 怎么回事了?
    但是又遇到一个问题:
    我无法使用 IHTMLDOMNode 等函数, 我的 mshtml.h  里没有 声明此函数。  而且 ,我的 msdn 中也找不到这个函数,  使用因为  版本太老吗?  不好意思,我是第一次使用 vc ,当前使用的版本 是 6.0 , 安装在一个叫 /VC98/ 的目录下面,是否说明  这个版本  就是 98年的,  是不是  升级到 .net  才能使用 上面提及的函数, 或者 可不可以 在不升级  vc 的情况下,  更新 库文件?
       
      

  5.   

    嗯,98年的东西是该升级了,最新的平台SDK也不支持VC6了,还是升级到VC2005吧
      

  6.   

    我升级到 vc.net
    但是 使用 CreateElement、AppendChild 的方法,还是遇到老问题了:
    可以  添加一幅图片,但是不能 运行 添加的 <script>
      

  7.   

    我使用的代码如下:[code]
    // 创建 一个 <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]
      

  8.   

    1、用 createElement 函数创建了  <div> 元素  pEleDiv 2、通过 put_innerHTML 在  pEleDiv 中加入了  <img> 和 <script> ,3、通过 QueryInterface 得到 pEleDiv 的 IHTMLDOMNode 接口4、然后用 appendChild 添加到 pNodeBody 中,  pNodeBody 就是 body 节点
    运行的结果是  <img> 出现了,但是 <script> 中的内容还是 没有执行 ... ...