在IE6 / 7中使用IHTMLElement5 / 6(IE8 / 9)时会发生什么? 它会转向IHTMLElement行为吗?

基本上,IHTMLElement5和IHTMLElement6都是主IHTMLElement的扩展接口,符合以下版本规则:

IHTMLElement IE4 IHTMLElement2 IE5 IHTMLElement3 IE5.5 IHTMLElement4 IE6 IHTMLElement5 IE8 IHTMLElement6 IE9 

当然,每个新的扩展接口都包含旧成员+自己的新成员,属性等。但是,某些成员(例如.getAttribute)名称相同但已更新。 所以,我的问题是,如果我使用(比方说)IHTMLElement6来声明我的HTML元素并在只安装了IE6的客户端上运行代码,我的对象何时失败并在我设置时保持为Null / Nothing,或者是mshtml.dll足够聪明,可以实现最新情况并默认为IHTMLElement4(实际上是IHTMLElement)行为?

为了澄清括号中的最后一个语句,.getAttribute是在IHTMLElement中添加的,并在IHTMLElement5和IHTMLElement6中更新 – 所以,如果有人只安装了IE6,那么我希望行为默认/恢复为IHTMLElement(不是IHTMLElement4) – 并且如果它不这样做,那么我希望我的代码崩溃。 基本上,我的问题是,究竟会发生什么?

现在,因为我害怕疯了,我只是宣称一切都是IHTMLElement,任何想法?

谢谢。

问题摘要(如果您认为有必要,请阅读,只需要对需要的人进行重新说明):基本上,我希望能够将某些内容声明为IHTMLElement6,以便我可以使用IHTMLElement和IHTMLElement6之间具有相同名称的更新方法(例如.getAttribute)。 这样,在IE9用户上,IHTMLElement6的.getAttribute版本将被利用,同时IHTMLElement的.getAttribute版本仍然适用于(比如说)IE6用户而不会破坏我的代码 – 这就是我的问题所在,当使用IHTMLElement6对象时,即使它是一个IE9接口,IHTMLElement的(IE4接口)版本的.getAttribute会进入/工作还是会得到空引用exception或其他运行时错误? 谢谢大家。

答案越多越好,即使是你的意见并且你不知道这是事实,我想鼓励你仍然发表评论,同时让我们知道你是否知道这是一个事实,或者只是意见/猜猜等等。谢谢。

我怀疑在旧版本的IE中不支持IHTMLElement6 ,将一个DOM元素转换为IHTMLElement6将失败并出现InvalidCastException 。 您将无法调用IHTMLElement6.getAttribute()因为您将无法首先获得有效的IHTMLElement6引用。

如果这是正确的,那么你正在做的事情(使用IHTMLElement )似乎是正确的行动方案。

更新:我的怀疑是正确的。 我写了一个WinForms应用程序,它引用了IE9附带的mshtml.dll版本。 在具有IE9的系统上,应用程序成功将元素强制转换为IHTMLElement6 。 但是在使用IE8的系统上,同样的转换失败了:

System.InvalidCastException:无法将类型为“mshtml.HTMLImgClass”的COM对象强制转换为接口类型“mshtml.IHTMLElement6”。 此操作失败,因为对于具有IID“{305106F8-98B5-11CF-BB82-00AA00BDCE0B}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULTexception:0x80004002(E_NOINTERFACE)) 。

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

所以无论你在哪里使用.getAttribut,只需输入一个if条件检查这个属性是否存在,如果不存在则使用旧属性,即.getAttributeNode否则使用.getAttribute

例如

 if(obj.getAttribute){ return obj.getAttribute; }else{ return obj.getAttributeNode; }