Hi, all,    我想监视网页的变化, 现在通过 IHTMLChangeSink 能够得到大部分网页变化的通知.    但是我发现页面js调用document.write或者document.writeln写网页 IHTMLChangeSink 似乎没有通知.    试过document.parentWindow.execScript("document.write = function (text) ... 定向到我的函数, 但是有些非常复杂的javascript, 再加上弹出窗, 多frame之类, 容易出错.    如何能得到document.write产生的页面变化通知呢?     谢谢!

解决方案 »

  1.   

    可以尝试挂接IHTMLDocument2或者连接点的onreadystatechange事件。
      

  2.   

    我用下面的网页测试onreadystatechange, 不过似乎按下按钮后, 没有触发onreadystatechange事件?
    <html>
    <head>
    <script language="javascript">
    function Generate()
    {
    document.write("<table>");
    document.write("<tr><td><input type='text' value='text1'>");
    document.write("<tr><td><input type='text' value='text2'>");
    document.write("</table>");
    }
    </script>
    </head>
    <body>
    <input type="button" value="GenerateTable" onclick="Generate()">

    </body>
    </html>
      

  3.   

    我挂载了这个IHTMLDocument的onreadystatechange事件.
      

  4.   

    document.write仅仅在当前位置写入内容,在onclick事件发生的时候,整个HTML已经解析完毕,指针在</html>标签之后,所以write的内容也放到了</html>之后,这对文档没有影响。
      

  5.   

    您的意思是, 我这个测试页面, 按下按钮后, 实际上是产生了一个"新的对象", 它并不是对原来IHTMLDocument2进行的修改, 所以没有事件产生?那么, 像我测试页面的这种情况, 用什么办法可以得到这个table产生的消息呢?非常感谢!
      

  6.   

    其实也不一定要得到IHTMLTable产生的消息.我的目标是要能够得到通知, 告诉我这个页面 "变化" 了, 我需要实时做一些事情.只要能够达到这个目标就可以了, 什么方法都可以. 希望能指点一下, 谢谢.
      

  7.   

    通常write方法是直接放到脚本片段中的,这样在解析脚本元素的时候马上在当前位置写入目标内容,但这个时候整个文档还没有解析完成。
    在文档完成之后,基本上很少会再次执行write操作,例外情况是可以在末尾write脚本标签以加载新的脚本。DOM改变不会调用write方法完成,而是通过其它的DOM操作。
      

  8.   

    似乎还是没有很好的办法.目前我只有SetWindowEventHook, 拦截OBJ_Destory消息.这个消息会在IHTMLDocument2被销毁时触发. 我的测试页面document.write的时候, 会销毁原来的IHTMLDocument2, 会有这个消息.这样可以知道document.write发生了.但是, 不完美, 我想请教各位有没有好办法知道测试页面产生了新的元素?