Для правильной установки атрибута элемента MSHTML (.setAttribute) необходимо указать заглавные буквы. Почему? И CaseInsensitive .setAttribute не работает - PullRequest
0 голосов
/ 10 февраля 2012

В основном я использую .setAttribute, чтобы попытаться добавить / изменить значение целевых атрибутов в теге привязки (). Вся проблема началась потому, что при использовании .setAttribute "target", "_self" HTML пишется без каких-либо двойных кавычек, окружающих «_self», то есть: <a href="..." target=_self>link</a>. Единственный способ сохранить «_self» с двойными кавычками вокруг него, это убедиться, что как минимум одна заглавная буква (или больше или все заглавные буквы) в имени атрибута TARGET, поэтому выполнение .setAttribute "TARGET", "_self" приведет к правильному HTML, то есть: <a href="..." TARGET="_self">link</a>.

Оказывается, если мы попытаемся установить вот так (.setAttribute "TARGET", "_self") TARGET в качестве всех заглавных букв в качестве атрибута для нашего тега привязки, и в элементе HTML привязки уже есть строчная или смешанная цель, тогда она будет просто добавить его в качестве второго атрибута, не будет перезаписывать старый, если его регистр точно такой же! то есть: в результате: <a href="..." target=_self TARGET="_self">

Странно, поскольку при использовании .setAttribute, например Target, tarGet или targetT, нам нужно иметь хотя бы один символ в верхнем регистре для значения, которое будет сохраняться в двойных кавычках (конечно, TARGET тоже работает), наши возможности ограничены. Таким образом, чтобы гарантировать удаление любых не прописных целей, нам нужно вызвать .removeAttribute для «target» и «Target» и «TARGET», которые должны охватывать почти все возможности, но это не 100% гарантия, так как любой человек может написать это как "TaRgEt".

Я пытался получить имя атрибута в том виде, в котором он был сохранен / записан (поэтому я могу знать точный регистр для передачи в .removeAttribute), но, похоже, нет способа сделать это, если вы не проанализируете .outerHTML из элемент. Я попытался сделать anElement.Attributes.getNamedItem ("target"). Name, и хотя имя в элементе Dom / было определенно прописным, оно вернуло его в нижнем регистре (target), и, похоже, его нет любые флаги в .getNamedItem, чтобы переопределить это.

Мой второй метод состоял в том, чтобы пройтись по всем атрибутам в коллекции .attributes, для For i = 0 to anElement.attributes.length - 1, это показало все атрибуты (147 из них, включая те, которые не были указаны) и прошел через и возвратил цель в нижнем регистре, даже если Цель сохранена с верблюжьей оболочкой («Цель»). Не могу придумать другие способы получения или выяснения точного используемого кожуха, поэтому я могу надежно удалить существующий атрибут, чтобы заново создать атрибут TARGET в верхнем регистре, что, в свою очередь, гарантирует, что значение для TARGET будет сохранено с кавычками это!

Кроме того, просто добавлю, что я получил те же результаты с .setNamedAttribute, без разницы. Кроме того, я попробовал iFlags в .removeAttribute, .getAttribute и .setAttribute, чтобы убедиться, что все поиски / действия НЕ чувствительны к регистру, они НЕ работают и дают результаты, отличные от заявленных. Я могу получить в перечисленном анализе это если хотите, но это не решает проблему, и после изучения ввода / результатов с использованием флагов я понял, почему Microsoft в своей документации MSDN об этих методах сказал «НЕ ИСПОЛЬЗУЙТЕ ИХ», «НЕ ИСПОЛЬЗУЙТЕ iFlags» и т.д ... предупреждение против их использования. Даже с ошибочными результатами я перепробовал все комбинации, они не работают, а флаг без учета регистра не работает так, как ожидалось и по мере необходимости.

Просто добавлю, что все это относится ко всему - MSHTML, если это реализация MS DOM, применимо вышеизложенное. Хотя я использую элемент управления WebBrowser, элементы IHTMLE и IHTMLDomAttribute2, а не все, являются элементами MSHTML.

По сути, это вопрос, возникший из-за другого вопроса: Как установить значение атрибута для Тег в живом HTMLDocument с кавычками вокруг него?

В этом вопросе я пытался выяснить, как обеспечить сохранение значений атрибутов в MSHTML с кавычками вокруг них. После эксперимента я понял, что единственный способ сделать это - установить атрибут с его именем в UPPERCASE.Затем это привело к другой проблеме, заключающейся в том, что если версия имени атрибута без прописных букв уже существует, то она сохранит его как второй, третий и т. Д. Атрибут (как описано выше), и поэтому, чтобы этого не произошло, янеобходимо выяснить, как удалить все атрибуты TARGET независимо от регистра, чтобы иметь возможность добавить свою собственную заглавную версию, где двойные кавычки вокруг значения соблюдаются.

По сути, мы должны удалить все комбинацииатрибут, прежде чем мы сможем убедиться, что тот, который мы создаем, не будет вторым с тем же именем.В моем случае это атрибут target, поэтому придется удалять для «Target», «tArget,« taRget »и т. Д. До тех пор, пока все комбинации и перестановки« target »не будут удалены, чтобы безопасно добавить свои.Должен быть более элегантный способ сделать это, но при этом быть надежным, есть идеи, кто-нибудь? Спасибо, что нашли время, чтобы прочитать это.

...