Как установить значение атрибута тега <A>в живом HTMLDocument с кавычками вокруг него? - PullRequest
0 голосов
/ 10 февраля 2012

В сущности, все, что я пытаюсь сделать, это изменить значение атрибута (такого как атрибут TARGET тега привязки A) на «_TOP», если атрибут существует, если он не существует (если IsNullвозвращает True), тогда я просто создаю атрибут и устанавливаю значение "_TOP".

Проблема в том, что он почти всегда устанавливает его без кавычек, и даже если я пытаюсь установить его с кавычками, установив.value = Chr (34) & "_TOP" & Chr (34), то, что он делает, это устанавливает ЕДИНСТВЕННЫЕ ЦИТАТЫ вокруг кавычек, которые я помещаю (это как плохая шутка) и появляется в HTML как '"_TOP"' (смеется)и если я установлю его как обычно, он просто сохранится как <a href="..." target=_TOP>some link</a> (без кавычек).

Dim attTargetAttribute As IHTMLDOMAttribute2 ' IHTMLDOMAttribute2 is the IE6.0+
' interface of the IHTMLDOMAttribute (which is I think IE5.5) it goes up to 4.

' aHtmlElement is just a valid/working/tested IHTMLElement ive set earlier.
' just a simple "A" / Anchor tag <A href="...">.

If IsNull(aHtmlElement.Attributes.getNamedItem("target")) Then

  Set attTargetAttribute = aHtmlElement.ownerDocument.createAttribute("target")
  aHtmlElement.Attributes.setNamedItem attTargetAttribute
Else

  Set attTargetAttribute = aHtmlElement.Attributes.getNamedItem("target")
End If

  attTargetAttribute.value = "_TOP"

Я изменил вышеуказанные имена переменных и превратил переменные в строки ("target") и т. д., чтобы сделатьчитать легче для любого, кто читает.

Я потратил кучу часов на это, документы MSDN, как обычно, ужасны, реальной документации или учебников по этому материалу тоже нет.Я даже пытался использовать .nodeValue вместо .value для настройки, но без разницы.Кроме того, я попытался (в разделе «Другое») удалить атрибут и заново создать + заново добавить его с нуля, чтобы увидеть, изменит ли это что-то, но это не помогло.

Конечно,кавычки важны, потому что если вы попытаетесь выполнить действие (вызвать метод) над этим элементом или использовать его позже, вы получите страшную «неопределенную ошибку».Я делаю это с помощью элемента управления WebBrowser в VB6, но тот же принцип должен применяться везде ... C # / .NET / JavaScript и т. Д., Как это, похоже, связано с DOM).

Любые идеи кто-нибудь?Занимаясь этим уже более 2 дней, спасибо всем, кто нашел время, чтобы прочитать это.

ОБНОВЛЕНИЕ: с момента публикации мы поняли, что если мы передадим имя атрибута в верхнем регистре, затем значение сохраняется с двойными кавычками вокруг него.хотя это не реальное решение (только временное), я все еще ищу ответы, если у кого-то есть, и принимаю любые мысли, которые у вас могут возникнуть по этому поводу в этом посте.Тем не менее, временное решение создало другой подвопрос, являясь сообщением о проблемах, возникающих при использовании этого временного решения.Подвопрос, связанный с этим временным решением, расположен по следующей ссылке для тех, кому может быть полезно или интересно прочитать о них, а также для тех, кто хотел бы внести свой вклад в дальнейшее обсуждение: Необходимо указать заглавные буквы для установки элемента MSHTML.атрибут (.setAttribute) правильно, почему?И CaseInsensitive .setAttribute не работает

Ответы [ 2 ]

0 голосов
/ 02 марта 2018

Life hack: Поставьте один или несколько пробелов перед значением атрибута.

Пример:

var head   = webBrowser.Document.GetElementsByTagName("head")[0];
var metaEl = webBrowser.Document.CreateElement("meta");

metaEl.SetAttribute("HTTP-EQUIV", "X-UA-Compatible");
metaEl.SetAttribute("CONTENT"   , " IE=11"         ); // <= one white-space before attribute value.

head.AppendChild(metaEl);
0 голосов
/ 10 февраля 2012

Кажется, что-то вроде этого работает.

http://jsfiddle.net/fak4b/

var links = document.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
    console.log(links[i].getAttribute('target'));
    if (links[i].getAttribute('target') != '_TOP') {
        links[i].setAttribute('target', '_TOP');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...