我正在尝试在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('<h1>','Building your resume', '<h1>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
。我的问题:
xmlns
属性会自动添加? 修改
观察:
1.如果我将xmlns
属性添加到body
代码并使用outerHTML
(var oldHTML = document.getElementById("highlightbegin").outerHTML;
)访问所有内容,则其子元素没有xmlns
属性。
我的问题:
1.可以编辑outerHTML元素(使用Javascript
)并替换吗?
2.上述观察是否一致(每次调用outerHTML
时看到)或是否依赖于实施?
3. Javascript
是自动添加xmlns
属性还是浏览器?
答案 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表单之间进行转换时,可以添加和删除属性,并且可以以任意方式更改它们的顺序,而不保证它们之间的一致性浏览器制作,甚至是同一浏览器的连续版本。