受到这个周末一些SO问题的启发,我决定看看我是否能够弄清楚如何将一些JavaScript添加到加载在TWebBrowser中的HTML元素中。 在这样做时,我遇到了一个奇怪的问题,也许有人可以解释一下。
这是我的HTML文档:
<html>
<body>
Something
<br>
<div id="forscript">some more text</div>
</body>
</html>
我想将我的Javascript元素添加到其中
<script type="text/javascript" defer="false">{alert('hello');}</script>
我将其作为脚本参数传递给下面的AddScript()函数。
这是我的代码(doc2是从WebBrowser获取的IHtmlDocument2):
procedure TForm1.AddScript(const Script : String);
var
Element : IHtmlElement;
Doc3 : IHtmlDocument3;
begin
Doc2.QueryInterface(IHtmlDocument3, Doc3);
Element := Doc3.GetElementByID('forscript');
Element.innerHTML := Element.innerHTML + Script;
end;
这个方法很好用,但是……
在赋值的右侧使用Element.innerHTML的原因是我发现如果右侧只有Script js,js就不会执行。我的问题是,为什么不会执行?是否有更简单的替代方法,比如在代码中创建一个IHtmlScriptElement并将其插入DOM中?显然,我这个简单的解决方法只是在元素已经包含文本的情况下添加文本,但我有点难以相信那些真正知道自己在做什么的人会认为这是必要的。
FWIW #1:我尝试使用Element.insertAdjacentHtml添加脚本,但得到了与我刚才描述的相同的行为,需要在脚本之外插入其他内容才能使脚本执行,所以我想知道这是否与对DOM进行更改后如何处理有关。
FWIW #2:我使用Element.innerHtml路线,因为TWebBrowser/MSHTML.Pas抵制了我在代码中创建IHtmlScriptElement的尝试;据我所知,尝试使用MSHTML.Pas中的任何CohtmlXXXElement例程都会引发“未注册类”异常,这似乎证实了我在某个地方遇到的@kobik的评论。
(顺便说一句,在Win7 64位上使用D7 + IE11)
IHtmlScriptElement
的使用 :) - whosrdaddy