基本上,我想要做的就是将属性的值(例如A锚标记的TARGET属性)更改为“_TOP”(如果属性存在),如果它不存在,(如果是IsNull)返回True)然后我只创建属性并将值设置为“_TOP”。
问题是,它几乎总是设置它没有引号,即使我尝试通过设置.value = Chr(34)& “_TOP”& Chr(34)然后它做的是它在我放置的引号周围设置单引号(这就像一个糟糕的笑话)并在HTML中显示为'"_TOP"'
(lol),如果我正常设置,它只是保存为<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"
我已经更改了上面的变量名称&amp;将vars变成字符串(“目标”)等,以便更容易阅读任何人阅读。
我浪费了大量的时间,MSDN文档和往常一样可怕,没有关于这个东西的真实文档或教程。我甚至尝试使用.nodeValue而不是.value来进行设置,但没有任何区别。此外,我已经尝试(在Else部分)删除属性并重新创建+从头开始重新添加它,看看这是否会产生影响,但事实并非如此。
当然,引号很重要,因为如果您尝试对此元素执行操作(调用方法)或稍后使用它,您将获得可怕的“未指定的错误”。我通过VB6中的WebBrowser控件执行此操作,但同样的原则应该适用于所有... C#/。NET / JavaScript等,因为它似乎与DOM相关)。
任何想法?已经超过2天了,感谢所有花时间阅读此内容的人。
UPDATE:自发布以来我们意识到如果我们以大写形式传递属性名称,那么该值将以双引号保存。虽然这不是一个真正的解决方案(只是一个临时的解决方案),但我仍然在寻找答案,如果有人有一个并接受你在这篇文章中对此有任何想法。但是,临时解决方案创建了另一个子问题,即关于使用此临时解决方案产生的问题的帖子。与此临时解决方案相关的子问题位于以下链接,供那些可能认为有用或有趣的人阅读,以及希望进一步为此讨论做出贡献的人:Must pass uppercase to set MSHTML element attribute (.setAttribute) correctly, why? And CaseInsensitive .setAttribute doesn't work
答案 0 :(得分:0)
这样的事情似乎有效。
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');
}
}
答案 1 :(得分:0)
生活黑客: 在属性值之前放置一个或多个空格。
示例:
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);