gpt4 book ai didi

javascript - 如何使用 Javascript 查找带命名空间的 HTML 元素

转载 作者:太空狗 更新时间:2023-10-29 16:09:04 26 4
gpt4 key购买 nike

我正在写一些学术文章,其中有命名空间的 HTML 元素,例如:

<ns:LinkList id="sitesuteis" cssClass="classone">
<ns:LinkItem id="LI1" href="http://www.ibt.pt/" target="_blank">IBT</ns:LinkItem>
<ns:LinkItem id="LI2" href="http://http://html5demos.com/t/" target="_blank">HTML5 Demos</ns:LinkItem>
<ns:LinkItem id="LI3" href="http://diveintohtml5.ep.io/" target="_blank">Dive into HTML5</ns:LinkItem>
<ns:LinkItem id="LI4" href="http://html5boilerplate.com/" target="_blank">HTML5 Boilerplate</ns:LinkItem>
</ns:LinkList>

现在,在 JavaScript 中,我正在尝试:

var elements = document.getElementsByTagName('ns:LinkItem');
element = elements[0];
console.log(element.getAttribute('id'));
//I get a correct value in all browsers

获取我的 elements[0] 中的所有子节点.它适用于所有浏览器,除了 -IE lt 9-

我试过:

var children = element.getElementsByTagName('ns:LinkItem');
console.log(children.length);

和:

var children = Array();
for (i=0; i<element.childNodes.length; i++){
alert(element.childNodes[i].nodeName);
if (element.childNodes[i].nodeName=="NS:LINKITEM"){
children.push(element.childNodes[i]);
}
}
console.log(children.length);

在两个 console.logs 中,我在除 Internet Explorer 8 或更低版本之外的每个浏览器中都得到正确的长度 (4),我得到 0。

根据@Shadow Wizard,在 Internet Explorer 8 及以下版本中,canHaveChildren元素的属性为 false,这意味着死胡同,浏览器根本不支持此标记的子节点,与 <br /> 相同例如不能有子节点。我试过了,确实如此。如果我尝试:

element.parentNode  

在 Internet Explorer 8 或更低版本中,我得到 div包含我的标记,在其他浏览器中我得到我的 parent <ns:LinkList> .

我真的需要一个 hack,但我似乎找不到。

最佳答案

我相信以下功能应该可以工作 - 我在以前的项目中使用过它,我相信它在 Internet Explorer 6、7 和 8 中有效地工作。我没有在 Internet Explorer 中测试的好方法9,但我猜它应该可以正常工作,如Internet Explorer 9 supports getElementsByTagNameNS .它非常简单,并且依赖于核心浏览器方法。

/**
* Cross-browser implementation for namespaced tags
* @param {DOM Node} n Parent node
* @param {String} tag Tag name you're trying to retrieve
* @param {String} [ns] Namespace prefix
*/
getElementsByTagName = function(n, tag, ns) {
// map the namespace prefix to the full namespace URIs
var nsMap = {
'svg': 'http://www.w3.org/2000/svg'
// etc - whatever's relevant for your page
};
if (!ns) {
// no namespace - use the standard method
return n.getElementsByTagName(tag);
}
if (n.getElementsByTagNameNS && nsMap[ns]) {
// function and namespace both exist
return n.getElementsByTagNameNS(nsMap[ns], tag);
}
// no function, get with the colon tag name
return n.getElementsByTagName(ns + ':' + tag);
};

// get a list of svg:circle elements
getElementsByTagName(document, 'circle', 'svg');

这里唯一的痛点是需要定义从命名空间前缀到完整命名空间 URI 的映射。如果你想让它成为一个更可移植的函数,你可以将 nsMap 作为函数参数,而不是在函数体中定义的东西;或者您可以在全局上下文中引用命名空间映射对象。

这是一个完全模块化的版本,带有一个稍微紧凑的 getElementsByTagName 版本:

var namespaces = (function() {
var nsMap = {};

/**
* Add a new XML namespace with prefix
* @param {String} prefix Prefix for new namespace
* @param {String} uri Full URI of new namespace
*/
function addNamespace(prefix, uri) {
nsMap[prefix] = uri;
}

/**
* Cross-browser implementation for namespaced tags
* @param {DOM Node} [n] Parent node
* @param {String} tag Tag name you're trying to retrieve
* @param {String} [ns] Namespace prefix
*/
function getElementsByTagName(n, tag, ns) {
return !ns ?
n.getElementsByTagName(tag) :
(n.getElementsByTagNameNS && nsMap[ns]) ?
n.getElementsByTagNameNS(nsMap[ns], tag) :
n.getElementsByTagName(ns + ':' + tag);
}

return {
addNamespace: addNamespace,
getElementsByTagName: getElementsByTagName
};
}());

// set the svg namespace
namespaces.addNamespace('svg', 'http://www.w3.org/2000/svg');
// get a list of svg:circle elements
namespaces.getElementsByTagName(document, 'circle', 'svg');

关于javascript - 如何使用 Javascript 查找带命名空间的 HTML 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6572006/

26 4 0
文章推荐: javascript - HTML/JavaScript : Fix scroll position after screen rotation
文章推荐: c - 我的加密是否像 openPGP/SMIME 一样安全?
文章推荐: jquery - 将 gridview 呈现为
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com