删除自动添加的 xmlns 属性
Removing xmlns attributes added automatically
我正在尝试在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>
搜索器中的函数搜索器.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. 外部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 表单之间的转换过程中,属性可能会被添加和删除,并且它们的顺序可以以任意方式更改,而不能保证浏览器之间的一致性,甚至同一浏览器的后续版本。
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 删除自动添加的 xmlns 属性
- 将v-attr与包含冒号的属性一起使用'xmlns:href'不编译
- 如何防止jQuery插入'xmlns'属性在XML对象中