getElementsByTagName:如何选择多种类型的标签?

时间:2013-01-15 22:16:20

标签: javascript

我有一个for循环,我在其中查看迭代的当前元素是否包含任何a标记或form标记,如果是,我会对它们做一些事情。无论如何,我可以检查或者像这样:

var form_or_a_tag = elem[i].getElementsByTagName('a');
var form_or_a_tag = elem[i].getElementsByTagName('form');

但我怎样才能将它们结合起来?

这些都失败了:

var form_or_a_tag = elem[i].getElementsByTagName('a form');
var form_or_a_tag = elem[i].getElementsByTagName('a, form');
var form_or_a_tag = elem[i].getElementsByTagName('a') || elem[i].getElementsByTagName('form');

基本上我想在变量form_or_a_tag中存储驻留在当前正在迭代的元素中的所有forma标记。

4 个答案:

答案 0 :(得分:5)

您可以使用querySelectorAll

var form_or_a_tag = elem[i].querySelectorAll('a, form');

答案 1 :(得分:5)

这可能有效:

var nodelist_a    = elem[i].getElementsByTagName('a');         // NodeList
var nodelist_form = elem[i].getElementsByTagName('form');      // NodeList

var array_a       = Array.prototype.slice.call(nodelist_a);    // Array
var array_form    = Array.prototype.slice.call(nodelist_form); // Array

var array_both    = array_a.concat(array_form);                // Array

请注意,结果不再是NodeList而是数组;但每个项目都是Node

答案 2 :(得分:0)

我认为此功能不支持此功能。 AFAIK只能使用getElementsByTagName(“*”)通配符来选择所有节点。您可以尝试使用像Sizzle这样的库来使用CSS选择器。

答案 3 :(得分:0)

如果节点序列很重要,这里是纯Javascript解决方案:

var getNodesInTreeByNodeName = function (node, /*Array of Strings*/ allowed_node_names)
{
    var childCollection = [];
    var getTreeNodes = function (tree_root)
    {
        if (allowed_node_names.indexOf(tree_root.nodeName) > -1)
            childCollection.push(tree_root);
        var childs = tree_root.childNodes;
        if (childs)
            for (var i=0, childs_length=childs.length ; i<childs_length ; i++)
                getTreeNodes(childs[i]);
    };
    getTreeNodes(node);
    return childCollection;
};

使用示例:

    var node_types = ["A","FORM"];
    var nodes = getNodesInTreeByNodeName(window.document, wanted_nodes);