编写Internet Explorer插件:使用浏览器帮助程序对象修改DOM时出现问题

时间:2010-11-30 08:03:43

标签: c# .net internet-explorer dom mshtml

目前我正在为C#中的Internet Explorer编写插件。 这是我第一次使用.net和Internet Explorer插件。 与Java相比,C#具有很好的语言功能。

然而,我被卡住了。我无法找到一种简单/或一般的方法来修改DOM。

我的插件应该有一个功能来显示网站的Html标题。

在Javascript中我会做这样的事情:

var a = document.createElement('a');
var text_node = document.createTextNode(text);
var href = document.createAttribute("href");
href.nodeValue = url;
a.setAttributeNode(href);
a.appendChild(text_node); 
var my_dom = document.createElement('div');
my_dom.appendChild(a);
my_dom.style.background = '#36b';;
document.body.insertBefore(my_dom, document.body.firstChild);

我使用了www.codeproject.com/KB/cs/Attach_BHO_with_C_.aspx上的教程来熟悉BHO和Internet Explorer开发。但是在这个插件中,包mshtml用于访问dom。我找不到通过api添加新元素到dom的好方法。 在网上搜索时,我发现System.Windows.Forms.HtmlDocument有一个appendChild函数。但是,当我将程序转换为System.Windows.Forms时,它根本不起作用。

有人可以告诉我如何修改(在身体的开头插入一个html元素)dom吗?

以下是我的程序https://gist.github.com/fd4459dc65acd7d167b6骨架的链接 首先,它足以向我展示如何在OnDocumentComplete函数中添加到正文的开头。

谢谢

2 个答案:

答案 0 :(得分:1)

搜索和搜索后,我找到了解决方案。 我没有找到通过mshtml修改DOM的方法,而是通过javascript。 Javascript可以通过

注入
document.parentWindow.execScript("alert('hello world')");

我可以重复使用现有的javascripts来解决这个问题。

答案 1 :(得分:1)

如果你有多行Javascript代码,你可以拥有多行execScript。示例:

document.parentWindow.execScript("var trends_dom = document.createElement('div')");
document.parentWindow.execScript("var title_dom = document.createElement('strong')");
document.parentWindow.execScript("var text_dom = document.createTextNode('test')");
document.parentWindow.execScript("title_dom.innerText = 'This text is placed over a web page'");
document.parentWindow.execScript("trends_dom.appendChild(title_dom)");
document.parentWindow.execScript("trends_dom.appendChild(text_dom)");
document.parentWindow.execScript("trends_dom.style.background = '#36b'");
document.parentWindow.execScript("trends_dom.style.color = '#fff'");
document.parentWindow.execScript("trends_dom.style.padding = '10px'");
document.parentWindow.execScript("trends_dom.style.position = 'fixed'");
document.parentWindow.execScript("trends_dom.style.zIndex = '123456'");
document.parentWindow.execScript("trends_dom.style.top = '20px'");
document.parentWindow.execScript("trends_dom.style.font = '14px Arial'");
//document.body.appendChild(trends_dom);
document.parentWindow.execScript("document.body.insertBefore(trends_dom, document.body.firstChild)");