基本上,我使用.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或targetsT)时,我们需要至少有一个大写字符,以便用双引号保存值(当然,TARGET也可以),我们的选项是有限的。因此,为了确保删除任何非大写目标,我们需要在“目标”,“目标”和“目标”上调用.removeAttribute,这应该涵盖几乎所有可能性,但它不是100%保证,因为任何人都可以写它是“TaRgEt”。
我试图获取属性的名称,因为它已保存/写入(因此我可以知道传递给.removeAttribute的确切大小),但除非你解析.outerHTML,否则似乎无法做到这一点。元素。我试过做一个anElement.Attributes.getNamedItem(“target”)。名称,即使Dom /元素中的名字肯定是大写的,它还是以小写(目标)的形式返回给我,似乎没有.getNamedItem中的任何标志都要覆盖它。
我的第二种方法是循环遍历.attributes集合中的所有属性,其中For i = 0到anElement.attributes.length - 1,这显示了所有属性(其中147个属性,包括那些未指定的属性)并循环并以小写形式返回目标,即使Target存储了骆驼外壳(“目标”)。想不出其他方法来检索或找出使用的确切套管,这样我就可以可靠地删除现有属性,以便以大写形式重新创建TARGET属性,从而确保TARGET的值保存时带有引号它!
另外,只是为了添加,我得到了与.setNamedAttribute相同的结果,没有任何区别。另外,我已经尝试了.removeAttribute,.getAttribute和.setAttribute中的iFlags,以确保所有搜索/操作都不区分大小写,它们不起作用,并产生与它声称的不同的结果,我可以进入列出的分析它如果你想,但它没有解决问题,并在使用标志研究输入/结果后,我意识到为什么微软在他们的MSDN文档中说这些方法“不使用它们”,“不要使用iFlags”等......警告不要使用它们。即使有错误的结果,我已经尝试了所有组合,它们不起作用,不区分大小写的标记不会按预期和需要工作。
只是添加,所有这些都适用于任何事物-MSHTML,如果它是DOM的MS实现,则上述适用。虽然我正在使用WebBrowser控件,IHTMLElement和IHTMLDomAttribute2以及所有不是MSHTML项目。
基本上,这是一个来自另一个问题的问题:How to Set Attribute Value of <A> Tag in live HTMLDocument with quotes around it?
这个问题是我试图弄清楚如何确保我在MSHTML中使用引号保存属性值,经过实验我意识到这样做的唯一方法是在UPPERCASE中设置属性及其名称。然后,这导致了另一个问题,因为如果属性名称的非大写版本已经存在,那么它将把它保存为第二个,第三个等属性(如前所述),因此为了防止这种情况发生,我需要弄清楚如何删除所有TARGET属性,无论大小写如何,以便能够添加我自己的大写版本,其中值的双引号被尊重。
基本上,我们必须删除属性的所有组合,然后才能确保我们创建的那个组合不会是具有相同名称的第二个组合。在我的情况下,它的目标属性,所以必须删除“目标”,“tArget,”taRget“等,直到”目标“的所有组合和排列被删除,以安全地添加我自己的。当然,那里必须是一个更优雅的方式来做到这一点,同时仍然是可靠的,任何想法吗?感谢您花时间阅读这篇文章。