none
IE如何动态添加外部JS RRS feed

  • 问题

  • 各位好, 我现在在做一个BHO,需要向每个IE加载的页面注入自己的js.通过一些探索,我目前是用 IHTMLWindow2->execScript 在documentcomlpete事件中来添加外部JS的,但下面这段JS却会在执行时出错:

     

    CComBSTR innerCode ;

    innerCode.Append(TEXT("var _doc = document.getElementsByTagName('head')[0];"));

    innerCode.Append(TEXT("var js = document.createElement('script');"));

    innerCode.Append(TEXT("js.setAttribute('type', 'text/javascript');"));

    innerCode.Append(TEXT("_doc.appendChild(js);"));

    innerCode.Append(TEXT("js.setAttribute('src', '"));

    innerCode.Append(path);

    innerCode.Append(TEXT("');"));

    innerCode.Append(TEXT("js.onreadystatechange=function(){if(js.readyState=='loaded'||js.readyState=='complete') { alert('loaded!');make_wyzz('__textfield');}};"));

    innerCode.Append(TEXT("alert('Hello');"));

    CComVariant vt ;

    CComPtr<IHTMLWindow2> window ;

    doc->get_parentWindow( &window) ;

    window->execScript(innerCode,TEXT("javascript"), &vt) ;

    最终的错误是'Object Expected',而错误是发生在准备执行make_wyzz的时候。这是因为外部js还是没有正确的加载进来吗?还是其他?若没有正确的加载,该如何加载呢?

    另:不知道有什么办法能在IE未解析HTML之前向HTML里面写东西的呢?就像js里面的write方法?

    多谢了!

     

    2011年1月16日 14:47

全部回复

  • 1) 关于脚本错误,我建议先尝试在readyState为"complete"的时候去执行make_wyzz()。因为"loaded"状态可能是告知脚本已经下载完毕,但可能还没有parse。

    2)我认为不能在解析HTML之前向HTML里面写东西。因为所有所谓向“HTML”里写东西,其实是向IE的DOM tree里写东西。在IE开始解析HTML之前,是没有可供使用的DOM tree的。

    2011年1月17日 4:00
  • 您好,

    我试过您的建议,检测readyState的complete事件,但发现这个事件没有发生而loaded的发生了,不知道这意味着什么?

    2011年1月17日 8:09
  • 不好意思,错过了这个问题。建议尝试把script element添加到body里面,而不是head里。

    2011年3月2日 5:48