我们有一个用C#编写的浏览器帮助对象(BHO)在IE8中工作得很好。但是,访问命名空间中的标记和属性不再适用于IE9。例如,使用
<p xmlns:acme="http://www.acme.com/2007/acme">
<input type="text" id="input1" value="" acme:initial="initial"/>
</p>
以下在IE8中有效:
IHTMLElement element = doc.getElementById("input1");
String initial = element.getAttribute("evsp:initial", 0) as String;
IE8将“acme:initial”视为一个文本标记,而IE9则尝试更多名称空间感知,并将“acme”作为名称空间前缀。
使用getAttributeNS似乎合适,但它似乎不起作用:
IHTMLElement6 element6 = (IHTMLElement6)element;
String initial6 = (String)element6.getAttributeNS("http://www.acme.com/2007/acme",
"initial");
在上面,element6设置为mshtml.HTMLInputElementClass,但initial6为null。
由于旧的文本标记和命名空间方法都不起作用,看起来我们被卡住了。
如果包含带有名称空间前缀的属性,则迭代元素的实际属性也是可以的。
是否有安装IE9的方法来获取名称空间前缀属性的值?
一些细节: Microsoft.mshtml.dll的默认PIA是版本7。 IE9使用mshtml.dll版本9。 我们使用c:\ C:\ Windows \ System32 \ mshtml.tlb(与IE9一起安装)来生成缺少的接口,例如IHTMLElement6,并将它们包含在我们的项目中。 我们过去已成功地将此技术用于其他IE(N-1),IE(N)差异。
答案 0 :(得分:1)
这是一种蛮力方法,迭代所有属性:
// find your input element
IHTMLElement element = Doc3.getElementById("input1");
// get a collection of all attributes
IHTMLAttributeCollection attributes = (IHTMLAttributeCollection)((IHTMLDOMNode)Element).attributes;
// iterate all attributes
for (integer i = 0; i < attributes.length; i++)
{
IDispatch attribute = attributes.item(i);
// this eventually lists your attribute
System.Diagnostics.Debug.Writeln( ((IHTMLDOMAttribute) attribute).nodeName );
}
(抱歉语法错误,这来自我的头脑。)
这会将您的input元素视为原始DOM节点并迭代其属性。缺点是:您获得的每个属性,不仅仅是您在HTML中看到的属性。
答案 1 :(得分:-1)
更简单
IHTMLElementCollection InputCollection = Doc3.getElementsByTagName("input1");
foreach (IHTMLInputElement InputTag in InputCollection) { Console.WriteLine(InputTag.name); }