2012-03-23 86 views
1

我有以下问题: 我正在为Internet Explorer编写扩展。在这个过程中,我遍历DOM并搜索某些关键字。这些关键字应该突出显示,并在点击时调用javascript函数。 遍历和突出显示作品。但是我坚持使用onclick事件。 我尝试了几种不同的方法:Internet Explorer BHO add onclick event

IHTMLAttributeCollection attributes = element.attributes; 
     if (attributes != null) 
     { 
      for (int i = 0; i < attributes.length; i++) 
      { 
       IHTMLDOMAttribute a = attributes.item(i); 

       if (a.nodeName.Equals("onclick")) 
       { 
        a.nodeValue = "alert()"; 
       } 
      } 
     } 


element.setAttribute("onclick", "javascript:alert()"); 

这两个创建在DOM右侧的文本,但功能没有给出。

另一种方法是使用innerHTML属性。这一个工作,但它是非常可怕的使用,因为我不能区分文本和新的开始。

好像IE不解析属性

我感谢所有支持

欢呼

回答

0

相反联事件处理程序,使用attachEventaddEventListener(非IE浏览器),这是事件注册的JavaScript API。

if (element.addEventListener) { // all browsers except IE before version 9 
    element.addEventListener("click", function(){ alert('clicked'); }); 
} 
else if (element.attachEvent) { // IE before version 9 
    element.attachEvent("onclick", function(){ alert('clicked'); }); 
} 
+0

大概我不够具体。我正在用C#编写一个BHO。还有功能的addEventListener和附加事件不存在IHTMLElement也不IHTMLDOMNode 我利用IHTMLSpanElement中的attachEvent尝试过,但是这一次需要一个PDISP对象 – 2012-03-26 09:03:08

0

我不认为你可以设置的“onClick”处理程序,也没有我不认为你可以的attachEvent,除非互操作层是做魔法我不知道的。

从IHTMLElement获取事件的本地方法是对IConnectionPointContainer的QueryInterface(支持事件的COM中的所有内容实现此接口),然后使用方法FindConnectionPoint。您正在查找的连接点具有disp接口ID:DIID_HTMLElementEvents2。一旦你获得连接点,你建议(即调用advise方法)。你给它一个回调对象(在COM中,它被称为“sink”),它实现了disp接口IHTMLElementEvents2 - 你应该实现的方法之一是点击。

在C#土地,你将广泛地使用互操作服务(System.Runtime.InteropServices命名空间)。首先,你需要引用MSHTML(不确定,但我认为它已经有一个互操作程序集,否则只是从COM引用)。看看这篇文章COM连接点:http://msdn.microsoft.com/en-us/magazine/cc163361.aspx