2017-02-25 98 views
0

我接触到了我的项目,我决定简化一些js函数,我正在寻找DOM树中的父项,然后深入到元素中多次在一个功能。相反,我虽然我会做一个函数的实例,将保留一些数据,然后我可以轻松地引用和操作对象。我得到它的工作,但随着我一直在,我决定扩展功能,并添加一些额外的功能,如getElementsByClassNameThenTagName。 我循环访问数组,并向数组添加匹配元素。 我注意到(可惜只有现在)我正在创建一个数组而不是HTML集合。作为结果,我不能通过输入buttons['reset'].disabled = false;来引用我的发现中的对象。我可以通过buttons[3].disabled = false;访问我的重置按钮,但这会造成很多不便。将JS数组与对象转换为HTML集合

因此,我正在寻找一种方法来将我的数组与对象转换为HTML集合。

请参考下面我目前的功能:

this.getElementsByClassNameThenTagName = function (elementClass, elementTag) { 
    if (parentNode == null) { 
     this.init(); 
    } 
    var results = []; 
    var regexStr = elementClass; 
    var regex = new RegExp(regexStr); 
    var x = moduleNode.getElementsByClassName(elementClass); 
    // console.log(x); 
    var y; 
    for (var i = 0; i < x.length; i++) { 
     // console.log(i); 
     y = x[i].getElementsByTagName(elementTag); 
     // console.log(y); 
     for (var k=0; k<y.length; k++){ 
      // console.log(y[k]); 
      results.push(y[k]); 
     } 
     // console.log(results); 
    } 
    return results; 
}; 

任何建议吗?

谢谢。

+0

你必须张贴必须有在那里一个点,你有一个HTML的收集和你把它变成一个传统的阵列'getElementsByClassNameThenTagName'代码,解决现在转换回 –

+0

与代码遗憾的是代替。 – azgooon

+0

我没有注意到nodelist是只读的,你可能只需要重新考虑一下你的设计。 –

回答

1
this.getElementsByClassNameThenTagName = function (elementClass, elementTag) { 
    if (parentNode == null) { 
     this.init(); 
    } 

    var results = {}; // thid should be an object (collection) 
    var x = moduleNode.querySelectorAll("." + elementClass + " " + elementTag); 
    x.forEach(function(y) { 
     var name = y.getAttribute("name"); // if you really sure that all the matched elements have names 
     results[name] = y; 
    }); 
    return results; 
}; 

现在你可以使用results数组是这样的:

var someElement = results['some name']; 

注:所有匹配的元素x应该有一个name属性,并且所有匹配的元素的name属性应该是独特。

+0

它完美的作品!谢谢易卜拉欣,我真的很感激它。 无论如何,斯科特和帕维尔,也非常感谢您的意见。 – azgooon