以不同类型返回的JavaScript函数(Array vs NodeList)

时间:2015-09-29 15:08:36

标签: javascript design-patterns

我编写了一个JavaScript函数,它将返回一个“列表”,其中包含以某些值开头的Id:

function getElementsWithIdPrefix(prefix){
    if (document.querySelectorAll){
        return document.querySelectorAll('*[id^="' + prefix + '"]');
    } else {
        // none modern browsers support
        var elements = document.getElementsByTagName('*');
        var relevantElements = [];
        for (var i = 0; i < elements.length; i++){
            if (element.id && element.id.indexOf(prefix) !== -1){
                relevantElements.push(element);
            }
        }
        return relevantElements;
    }
}

正如您所看到的,我的函数将返回不同的类型取决于document.querySelectorAll的浏览器支持,我有两个问题:

  1. 这不好吗?我的意思是 - 在JavaScript输入系统中它是否会将其视为代码气味或不良做法?
  2. 如何通过我自己为每个元素创建Node对象并构造一个包含这些元素的新NodeList来返回?

1 个答案:

答案 0 :(得分:2)

  

这不好吗?

可能,但这可能是一个意见问题。

  

如何通过我自己为每个元素创建Node对象并构造一个包含这些元素的新NodeList来返回?

您可以将QSA结果转换为如下所示的真实数组:

return Array.prototype.slice.call(document.querySelectorAll('*[id^="' + prefix + '"]'));

这样,你在两种情况下都会返回一个数组。

旁注:您必须非常难以找到没有QSA的浏览器。它适用于所有现代浏览器,也适用于IE8。

旁注2:这一行

if (element.id && element.id.indexOf(prefix) !== -1){

...不会查找前缀。它在ID中的任何位置查找子字符串匹配。对于前缀,请使用=== 0(或element.id.substring(0, prefix.length) === prefix)。