删除自动添加的 xmlns 属性

Removing xmlns attributes added automatically

本文关键字:xmlns 属性 添加 删除      更新时间:2023-09-26

我正在尝试在Javascript中执行一个简单的搜索和突出显示功能,用于搜索一段文本。该文本出现的XHTML标记也作为参数给出,以提供查找该文本的其他帮助。

我正在测试这个函数的XHTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta content="application/xml+xhtml;charset=UTF-8" />
<script src="searcher.js" type="text/javascript"></script>
<script src="jquery-2.0.2.min.js"> </script>
<title>Building your resume</title>
</head>
<body id="highlightbegin">
<h1>Building your resume</h1>
<div> <input name="input" type="button" value="Highlight3" onclick="javascript:searcher('&lt;h1&gt;','Building your resume', '&lt;h1&gt;Building your resume', 'resume');" /> </div>
</body>
</html>  
搜索器

中的函数搜索器.js:

function searcher(tag, text, tagText, word) {
    //simple search.
    console.info(word + " to be searched for in " + text + " with tag text = " + tagText);
    //get old html.
    var oldHTML = document.getElementById("highlightbegin").innerHTML;
    //get regexp.
    var regexp = new RegExp(tagText, 'g');
    var match = oldHTML.match(regexp);
    console.info(text + " found " + match.length + " times.");
}  

但是,执行RegExp ,匹配返回null。进一步的调查表明,标记<h1>Building your resume</h1>变得<h1 xmlns="http://www.w3.org/1999/xhtml">Building your resume</h1>,这会导致match函数返回null。我的问题:

  1. 为什么会自动添加xmlns属性?
  2. 有没有办法防止添加属性?
  3. 该属性将添加到哪些标签?假设它将添加到每个标签中是否安全?
  4. 这是特定于浏览器的问题,还是所有浏览器中都会出现此行为?

编辑:
观察:
1.如果我将xmlns属性添加到body标签并使用outerHTMLvar oldHTML = document.getElementById("highlightbegin").outerHTML;)访问所有内容,则其子元素没有xmlns属性。
我的问题:
1. 外部HTML元素可以被编辑(用Javascript)和替换吗?
2. 上述观察结果是一致的(每次调用outerHTML时都能看到)还是依赖于实施?
3. 是自动添加xmlns属性Javascript还是浏览器添加?

Why is the xmlns attribute added automatically?

因为如果没有,标记将无法代表 DOM 中元素的命名空间,在这种情况下,如果您将字符串写回 DOM,则浏览器将不再将元素解释为 HTML 元素,并且您的页面将中断。

Is there a way to prevent the attribute from being added?

不是innerHTML,如果你使用的是XMLDocument,你似乎是。如果需要,您可以通过遍历 DOM 来创建自己的序列化程序。

What tags will that attribute be added to? Is it safe to assume that it will be 
added to every tag?

至少每个开始标记都是您调用 innerHTML 的元素的顶级子级,假设该子级不在 null 命名空间中。加上与其父级命名空间不同的命名空间中任何后代元素的开始标记。如果浏览器选择这样做,将其添加到所有开始标记中并没有错。

Is this a browser-specific issue or can this behavior be expected in all browsers?

使用 innerHTML 序列化 DOM 传统上因浏览器而异。虽然浏览器应该始终如一地这样做,但我不会依赖它。

1. Can the outerHTML element be edited (with Javascript) and replaced?

理论上是的,但这无济于事。您必须将元素替换为 null 命名空间中的元素以阻止属性出现在外部元素上,这只会导致 outerHTML 将属性添加到子元素(因为它们将具有与其父元素不同的命名空间)。

2. Is the observation above consistent (seen each time outerHTML is invoked) or is 
   it implementation dependent?

出于与 innerHTML 相同的原因,有些地方序列化必须添加属性,以便可以成功读回字符串,有些地方可以添加浏览器想要的字符串。不能保证它会保持一致。

3. Is it Javascript that adds the xmlns attribute automatically or the browser?

这是浏览器将 DOM 序列化为字符串的内置过程。该属性通常不在 DOM 中的元素上(<html> 元素是正常的例外),它会在浏览器认为必要的任何位置添加,因为它被转换为字符串。

在更一般的注释中,这是专家们试图阻止尝试使用正则表达式处理HTML标记的原因之一。即使使用 HTML 而不是 XHTML,在 XHTML 中,无需担心这些命名空间业务,在字符串和 DOM 表单之间的转换过程中,属性可能会被添加和删除,并且它们的顺序可以以任意方式更改,而不能保证浏览器之间的一致性,甚至同一浏览器的后续版本。