基本上,IHTMLElement5和IHTMLElement6都是主IHTMLElement的扩展接口,如下所示:
IHTMLElement IE4
IHTMLElement2 IE5
IHTMLElement3 IE5.5
IHTMLElement4 IE6
IHTMLElement5 IE8
IHTMLElement6 IE9
当然,每个新的扩展接口都有旧成员在其中+自己的新成员、属性等。但是,一些成员(例如,.getAttribute)同名,但是已经更新了。所以,我的问题是,如果我使用(比方说) IHTMLElement6来声明我的IE6元素,并在一个只安装了IE6的客户机上运行代码,那么当我设置它时,我的对象什么时候会失败并保持为空/空,或者mshtml.dll是否聪明到能够意识到正在发生什么并默认为IHTMLElement4 (实际上,IHTMLElement)行为?
为了澄清括号中的最后一条语句,.getAttribute是在IHTMLElement中添加的,并在IHTMLElement5和IHTMLElement6中更新--因此,如果某人只安装了IE6,那么我希望行为会默认/恢复为IHTMLElement (而不是IHTMLElement4) --如果它不这样做,那么我的代码就会崩溃。基本上,我的问题是,究竟会发生什么?
现在,因为我害怕得像疯了一样,我只是宣布一切为IHTMLElement,有什么想法吗?
谢谢。
问题摘要(如果您认为有必要,只需对需要的人进行重新澄清):基本上希望能够将某些内容声明为IHTMLElement6,这样我就可以使用IHTMLElement和IHTMLElement6之间同名的更新方法(例如.getAttribute)。这样,在IE9用户的IHTMLElement 6版本的.getAttribute中将被利用,同时IHTMLElement的.getAttribute版本仍然适用于(比如说) IE6用户而不破坏我的代码--这就是我的问题所在,当使用IHTMLElement6对象时,即使它是IE9接口,IHTMLElement的(IE4接口)版本的.getAttribute启动/工作,还是我会得到一个空引用异常或其他运行时错误?谢谢大家。
回复越多,越好,即使这是你的意见,你不知道是事实,我鼓励你继续评论,同时让我们知道你是否知道这是一个事实,如果这只是意见/猜测等。谢谢。
发布于 2012-03-08 19:57:26
我怀疑在不支持IHTMLElement6
的早期IE版本中,将DOM元素转换为IHTMLElement6
会导致InvalidCastException
失败。您将没有机会调用IHTMLElement6.getAttribute()
,因为您一开始就无法获得有效的IHTMLElement6
引用。
如果这是正确的,那么您已经在做的事情(使用IHTMLElement
)似乎是正确的行动路线。
更新:我的怀疑是正确的。我编写了一个WinForms应用程序,它引用了IE9附带的mshtml.dll版本。在使用IE9的系统上,应用程序成功地将一个<img>
元素转换为IHTMLElement6
。但是在使用IE8的系统上,相同的转换失败了:
System.InvalidCastException:无法将'mshtml.HTMLImgClass‘类型的COM对象转换为接口类型'mshtml.IHTMLElement6’。此操作失败,因为QueryInterface对IID‘{305106F8-98B5-11CF-BB82-00AA00BDCE0B}接口的COM组件调用失败:不支持此类接口( HRESULT: 0x80004002 (E_NOINTERFACE)例外)。
发布于 2012-03-08 16:37:44
如果您支持像IE6这样的旧浏览器,那么按照规范,.getAttribute将失败,并将在IE6上的js中弹出一个错误。为了避免这种情况发生,您必须以这样一种方式处理,即如果代码失败,那么它就应该无声地失败。
因此,无论您在何处使用.getAttribut,只需设置一个if条件,检查该属性是否存在,如果不存在,则使用旧属性,即.getAttributeNode使用.getAttribute
如:
if(obj.getAttribute){
return obj.getAttribute;
}else{
return obj.getAttributeNode;
}
https://stackoverflow.com/questions/9619502
复制相似问题