Что происходит при использовании IHTMLElement5 / 6 (для IE8 / 9) в IE6 / 7?Отклоняет ли это поведение IHTMLElement? - PullRequest
2 голосов
/ 08 марта 2012

По сути, IHTMLElement5 и IHTMLElement6 являются расширенными интерфейсами для основного IHTMLElement в соответствии с приведенными ниже правилами управления версиями:

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

Конечно, каждый новый расширенный интерфейс содержит старые элементы + свои новые новые элементы., свойства и т. д. Однако некоторые члены (например, .getAttribute) имеют то же имя, но были обновлены.Итак, мой вопрос, если я использую (скажем) IHTMLElement6 для объявления моего HTML-элемента и запускаю код на клиенте, на котором установлен только IE6, когда мой объект просто потерпит неудачу и останется нулевым / пустым, когда я его установлю, илиmshtml.dll достаточно умен, чтобы понять, что происходит и по умолчанию используется IHTMLElement4 (собственно, IHTMLElement)?

Просто чтобы прояснить последний оператор в скобках, .getAttribute был добавлен в IHTMLElement и обновлен в IHTMLElement5 и IHTMLElement6 -Если у кого-то установлен только IE6, то я ожидаю, что поведение по умолчанию вернется к IHTMLElement (не IHTMLElement4) - и если этого не произойдет, то я ожидаю сбой моего кода.По сути, мой вопрос: что именно произойдет?

Прямо сейчас, потому что я напуган как сумасшедший, я просто объявляю все как IHTMLElement, есть идеи?

Спасибо.

Краткое изложение вопроса (читайте, если считаете нужным, просто повторное разъяснение для тех, кто в этом нуждается): По сути, я хочу иметь возможность объявить что-то как IHTMLElement6, чтобы я мог использовать обновленные методы, которые имеютодно и то же имя между IHTMLElement и IHTMLElement6 (например, .getAttribute).Таким образом, для пользователей IE9 будет использована версия .getAttribute IHTMLElement6, в то время как версия .getAttribute IHTMLElement будет по-прежнему работать, скажем, для пользователей IE6, не нарушая мой код - это тот момент, когда мой вопрос возникает, при использовании объекта IHTMLElement6, даже если это интерфейс IE9, будет ли добавлена ​​версия .getAttribute IHTMLElement (интерфейс IE4) в / work, или я получу исключение нулевой ссылки или другую ошибку времени выполнения?Спасибо всем.

Чем больше ответов, тем лучше, даже если это ваше мнение, и вы не знаете, как факт, я хотел бы призвать вас по-прежнему комментировать, сообщая нам, если вы знаете это какфакт или если это просто мнение / предположение и т. д. Спасибо.

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Я подозреваю, что в более старых версиях IE, которые не поддерживают IHTMLElement6, приведение элемента DOM к IHTMLElement6 завершится неудачно с InvalidCastException. У вас не будет возможности позвонить IHTMLElement6.getAttribute(), потому что вы не сможете получить действительную ссылку IHTMLElement6 в первую очередь.

Если это правильно, то то, что вы уже делаете (используя IHTMLElement), похоже на правильный курс действий.

ОБНОВЛЕНИЕ: Мое подозрение было верным. Я написал приложение WinForms, которое ссылается на версию mshtml.dll, которая поставляется с IE9. В системе с IE9 приложение успешно преобразует элемент <img> в IHTMLElement6. Но в системе с IE8 произойдет сбой приведения:

System.InvalidCastException: невозможно преобразовать COM-объект типа «mshtml.HTMLImgClass» в тип интерфейса «mshtml.IHTMLElement6». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{305106F8-98B5-11CF-BB82-00AA00BDCE0B}' завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

0 голосов
/ 08 марта 2012

Если вы поддерживаете более старые браузеры, такие как IE6, то в соответствии со спецификацией .getAttribute завершится ошибкой и выдаст ошибку в js на IE6. Чтобы этого не происходило, вам придется обрабатывать таким образом, чтобы в случае сбоя кода он молча завершился неудачей.

Так что, где бы вы ни использовали .getAttribut, просто поставьте условие if, если проверяется, существует ли это свойство, если оно не существует, используйте старое свойство, т.е. .getAttributeNode, используйте еще.

Например,

if(obj.getAttribute){
   return obj.getAttribute;
}else{
   return obj.getAttributeNode;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...