如何使用JavaScript获取所有具有电子邮件属性的跨度的内容
How to get the content of all spans that have the email attribute with JavaScript
我想在文档中找到具有"电子邮件"属性的所有跨度,然后对于每个电子邮件地址,我将与服务器检查电子邮件是否获得批准,并注入到跨度中用"是"或"否"填充img。我不需要PHP端的实现,只需要JavaScript。
所以说"newsletter@zend.com"在我的数据库中获得批准,HTML代码为:
<span dir="ltr"><span class="yP" email="newsletter@zend.com">Zend Technologies</span></span>
然后JavaScript将HTML更改为:
<span dir="ltr"><span class="yP" email="newsletter@zend.com"><img src="yes.gif" />Zend Technologies</span></span>
我需要有人来指导我如何处理这件事。
注意:我不想使用jQuery。
如果您不想使用库,也不想将自己局限于支持querySelectorAll
的浏览器,那么最好使用简单的递归下降函数或getElementsByTagName
。下面是一个RD示例:
功能(即兴,未经测试(:
function findEmailSpans(container, callback) {
var node, emailAttr;
for (node = container.firstChild; node; node = node.nextSibling) {
if (node.nodeType === 1 && node.tagName === "SPAN") { // 1 = Element
emailAttr = node.getAttribute("email");
if (emailAttr) {
callback(node, emailAttr);
}
}
}
switch (node.nodeType) {
case 1: // Element
case 9: // Document
case 11: // DocumentFragment
findEmailSpans(node, callback);
break;
}
}
}
称之为:
findEmailSpans(document.documentElement, function(span, emailAttr) {
// Do something with `span` and `emailAttr`
});
或者,如果你想依赖getElementsByTagName
(非常广泛支持(,并且不介意在内存中构建这么大的NodeList
,那会更简单,可能会更快:它会让你获得所有span
元素中的一个平面NodeList
,所以你只需要一个简单的循环,而不是递归下降函数(并不是说RD函数很难或很慢,但仍然如此(。类似这样的东西:
var spans = document.getElementsByTagName("span"),
index, node, emailAttr;
for (index = 0; index < spans.length; ++index) {
node = spans.item(index);
emailAttr = node.getAttribute("email");
if (emailAttr) {
// Do something with `node` and `emailAttr`
}
}
你需要比较并决定哪种方法最适合你,每种方法都可能有优缺点。
参考文献:
- DOM3核心规范
但是,对于这类事情,我真的建议获得并使用一个好的JavaScript库,如jQuery、Prototype、YUI、Closure或其他任何库。对于任何好的库,它都可以看起来像这样(jQuery(:
$("span[email]").each(function() {
// Here, `this` refers to the span that has an email attribute
});
或者这个(原型(:
$$("span[email]").each(function() {
// Here, `this` refers to the span that has an email attribute
});
而其他的不会更复杂。使用库来考虑我们的常见操作,如在DOM中搜索内容,可以让您专注于试图解决的实际问题。jQuery和(最新版本的(Prototype在支持它的浏览器上都将遵循querySelectorAll
(我想大多数其他浏览器也会这样(,并在不支持它的服务器上回归到自己的搜索功能。
您可以使用document.getElementsByTagName()
来获取所有跨度的列表。然后,使用Element.hasAttribute
检查每个跨度的电子邮件属性。然后,您将使用Node接口来相应地创建和插入newe标记。
编辑:
window.addEventListener('load', callback, true);
var callback = function() {
var spanTags = document.getElementsByTagName('span');
for (var i = 0; i < spanTags.length; i += 1) {
if (spanTags[i].hasAttribute('email')) {
var imgElement = document.createElement('img');
imgElement.setAttribute('src', 'yes.gif');
spanTags[i].insertBefore(imgElement, spanTags[i].firstChild);
}
}
}
- 保存具有相同属性 JavaScript 的元素上的值
- DOM 元素上的空样式属性:JavaScript
- 基于一个属性Javascript检索多个对象
- xml获取属性javascript不会;无法处理childNodes
- 当输入填充了必需的属性javascript/html/css时,如何更改焦点颜色
- 如何处理未定义属性的未定义属性 javascript 类型错误
- 向嵌套对象添加属性 - Javascript
- 属性 Javascript 的访问属性
- 更改链中的 css 属性 - JavaScript
- 更改属性 Javascript 方式的值
- 如何从 url 解析 xml 获取属性 javascript
- 语法错误:缺少:在属性 javascript 之后
- 创建 if 条件基于 CSS 属性 -- JavaScript
- 访问节点的属性javascript二进制搜索树
- 访问父函数属性Javascript
- 为什么未定义此对象的属性?Javascript
- 访问私有属性Javascript OOP
- 访问数组中的属性?(Javascript)
- 动态添加参数作为对象的属性-JavaScript
- 冲突/方法/属性Javascript错误