C# 在IE6/7中使用IHTMLElement5/6(对于IE8/9)时会发生什么情况?它是否转移到IHTMlement行为?

C# 在IE6/7中使用IHTMLElement5/6(对于IE8/9)时会发生什么情况?它是否转移到IHTMlement行为?,c#,javascript,vb.net,dom,attributes,C#,Javascript,Vb.net,Dom,Attributes,基本上,根据以下版本控制规则,IHTMLElement5和IHTMLElement6都是主IHTMLEment5的扩展接口: IHTMLElement IE4 IHTMLElement2 IE5 IHTMLElement3 IE5.5 IHTMLElement4 IE6 IHTMLElement5 IE8 IHTMLElement6 IE9 当然,每个新的扩展接口中都有旧成员+自己的新成员、属性等。但是,有些成员(例如,.getAttribute)的名称相同,但已被更

基本上,根据以下版本控制规则,IHTMLElement5和IHTMLElement6都是主IHTMLEment5的扩展接口:

IHTMLElement    IE4
IHTMLElement2   IE5
IHTMLElement3   IE5.5
IHTMLElement4   IE6
IHTMLElement5   IE8
IHTMLElement6   IE9
当然,每个新的扩展接口中都有旧成员+自己的新成员、属性等。但是,有些成员(例如,.getAttribute)的名称相同,但已被更新。所以,我的问题是,如果我使用say IHTMLElement6来声明我的HTML元素并在一个只安装了IE6的客户端上运行代码,那么当我设置它时,我的对象什么时候会失败并保持为Null/Nothing,或者mshtml.dll是否足够聪明,能够实现正在发生的事情并默认为IHTMLElement4?实际上,IHTMLElement4行为

为了澄清括号中的最后一条语句,.getAttribute被添加到IHTMlement5和IHTMlement6中,并在IHTMlement5和IHTMlement6中进行了更新-因此,如果有人只安装了IE6,那么我希望该行为默认/恢复到IHTMlement4而不是IHTMlement4-如果它没有这样做,那么我希望我的代码崩溃。基本上,我的问题是,到底会发生什么

现在,因为我像疯了一样害怕,我宣布一切都是我的梦想,有什么想法吗

谢谢

如果您认为有必要,请阅读问题摘要,为需要的人重新分类: 基本上,我希望能够将某些东西声明为IHTMLElement6,以便可以使用更新的方法,这些方法在IHTMLEment6和IHTMLELELEment6之间具有相同的名称,例如.getAttribute。这样,在IE9用户上,IHTMLElement6版本的.getAttribute将被利用,同时IHTMLElement版本的.getAttribute仍适用于IE6用户,而不会破坏我的代码-这就是我的问题所在,当使用IHTMLElement6对象时,即使它是IE9接口,IHTMLElement的IE4接口版本的.getAttribute会启动/工作吗?还是会出现空引用异常或其他运行时错误?谢谢大家


回答越多越好,即使这是你的观点,而你不知道这是事实,我鼓励你继续评论,同时让我们知道你是否知道这是事实,或者这只是观点/猜测等。谢谢。

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

因此,无论您在哪里使用.getAttribute,只要设置一个if条件来检查此属性是否存在,如果不存在,则使用旧属性,即getAttributeNode else use.getAttribute

例如

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

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

因此,无论您在哪里使用.getAttribute,只要设置一个if条件来检查此属性是否存在,如果不存在,则使用旧属性,即getAttributeNode else use.getAttribute

例如

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

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

如果这是正确的,那么您已经在使用ihtmlement进行的操作似乎是正确的

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

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


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

如果这是正确的,那么您已经在使用ihtmlement进行的操作似乎是正确的

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

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


谢谢,我为我的问题添加了一个摘要,供有需要的人参考。基本上,我的问题更多的是关于我是否可以使用IHTMLElement6接口/对象,并且仍然为IE6用户提供IE4版本的.getAttribute,因为.getAttribute是在IE4中添加的,并在IE8和IE9中更新的,这有意义吗?希望我不需要为IE6和IE7用户进行版本检查和声明IHTMLElement,然后为IE8用户进行IHTMLElement5,为IE9用户进行IHTMLElement6,只是想使用IHTMLElement6并使其适用于所有版本,现在我使用IHTMLElement只是为了安全。谢谢,我为我的问题添加了一个摘要,供需要它的人参考,基本上,我的问题更多的是关于我是否可以使用IHTMLElement6接口/对象,并且仍然允许IE6用户使用IE4版本的.getAttribute,因为.getAttribute是在IE4中添加的,并在IE8和IE9中更新的,这有意义吗?我希望我不需要为IE6和7用户进行版本检查和声明IHTMLElement,然后为IE8用户声明IHTMLElement5,为IE9用户声明IHTMLElement6,我只是想使用IHTMLElement6并使其适用于所有版本,现在我使用IHTMLElement只是为了安全。非常感谢您的评论,我只是想问你对此有多确定,还想邀请其他人对他们知道的东西发表评论,即使这只是他们的猜测,也没关系。我希望情况不是这样,但如果是这样,我很高兴知道,因为我不知道我应该以什么方式做事,即:在这个问题上,什么是最佳编程实践。再次感谢您的评论,投票表决通过,但将保留问题的开放性,以收集任何愿意参与的人的更多意见。干杯,伙计,你太棒了!谢谢你的测试,这澄清了我们现在的问题:非常感谢你的评论,我只是想问你对此有多确定,同时也想邀请其他人对他们知道的东西发表评论,即使这只是他们的猜测,也没关系。我希望情况不是这样,但如果是这样,我很高兴知道,因为我不知道我应该以什么方式做事,即:在这个问题上,什么是最佳编程实践。再次感谢您的评论,投票表决通过,但将保留问题的开放性,以收集任何愿意参与的人的更多意见。干杯,伙计,你太棒了!感谢您的测试,这澄清了我们的问题: