首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在IE6/7中使用IHTMLElement5/6 (针对IE8/9)时会发生什么?它会转移到IHTMLElement的行为吗?

在IE6/7中使用IHTMLElement5/6 (针对IE8/9)时会发生什么?它会转移到IHTMLElement的行为吗?
EN

Stack Overflow用户
提问于 2012-03-08 14:49:40
回答 2查看 658关注 0票数 2

基本上,IHTMLElement5和IHTMLElement6都是主IHTMLElement的扩展接口,如下所示:

代码语言:javascript
运行
复制
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启动/工作,还是我会得到一个空引用异常或其他运行时错误?谢谢大家。

回复越多,越好,即使这是你的意见,你不知道是事实,我鼓励你继续评论,同时让我们知道你是否知道这是一个事实,如果这只是意见/猜测等。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)例外)。

票数 4
EN

Stack Overflow用户

发布于 2012-03-08 16:37:44

如果您支持像IE6这样的旧浏览器,那么按照规范,.getAttribute将失败,并将在IE6上的js中弹出一个错误。为了避免这种情况发生,您必须以这样一种方式处理,即如果代码失败,那么它就应该无声地失败。

因此,无论您在何处使用.getAttribut,只需设置一个if条件,检查该属性是否存在,如果不存在,则使用旧属性,即.getAttributeNode使用.getAttribute

如:

代码语言:javascript
运行
复制
if(obj.getAttribute){
   return obj.getAttribute;
}else{
   return obj.getAttributeNode;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9619502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档