删除自动添加的xmlns属性

时间:2013-09-12 13:56:13

标签: javascript html xml regex

我正在尝试在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>  

searcher.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. 这是特定于浏览器的问题还是可以在所有浏览器中出现这种情况?
  5. 修改
    观察:
    1.如果我将xmlns属性添加到body代码并使用outerHTMLvar oldHTML = document.getElementById("highlightbegin").outerHTML;)访问所有内容,则其子元素没有xmlns属性。
    我的问题:
    1.可以编辑outerHTML元素(使用Javascript)并替换吗?
    2.上述观察是否一致(每次调用outerHTML时看到)或是否依赖于实施? 3. Javascript是自动添加xmlns属性还是浏览器?

1 个答案:

答案 0 :(得分:3)

Why is the xmlns attribute added automatically?

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

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

如果您使用的是XMLDocument,那么不是使用innerHTML。如果需要,可以通过遍历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,也不需要担心这个命名空间业务,在字符串和DOM表单之间进行转换时,可以添加和删除属性,并且可以以任意方式更改它们的顺序,而不保证它们之间的一致性浏览器制作,甚至是同一浏览器的连续版本。