javascript - 干燥 htmlCollection 到 Array 调用

标签 javascript arrays dry htmlcollection

我有一个函数当前正在 JavaScript 中使用 .getElementBy... DOM 调用。

var $ = function (selector) {
  var elements = [];

  var lastSelector  = selector.substring(selector.search(/[^#.]+$/), selector.length);

  if(selector.includes('#') !== true || selector.includes('.') !== true) {
    elements.push(document.getElementsByTagName(lastSelector));
    elements = Array.prototype.slice.call(elements[0]);
  }

return elements;
};

函数中还有许多其他 if 语句使用代码:

elements.push(document.getElementsByTagName(lastSelector));
elements = Array.prototype.slice.call(elements[0]);

elements.push(document.getElementsByClassName(lastSelector));
elements = Array.prototype.slice.call(elements[0]);

理想情况下,我想干燥重复的内容:

elements = Array.prototype.slice.call(elements[0]);

但我无法在 if 语句之前定义它,因为元素尚未填充。因此,它尝试在空数组上运行代码并出现错误。

有什么建议吗?

最佳答案

您可以只使用标准 querySelectorAll() ,而不是使用自制的有限函数来通过选择器选择元素。适用于所有浏览器,包括 IE8+。

至于将类似数组的对象(例如 DOM 集合)转换为真正的 Array (什么是 Array.prototype.slice.call() )用于您的代码中),我使用以下函数:

var arrayFrom = function(arrayLike) {
    if (Array.from) {
        return Array.from(arrayLike);
    }

    var items;

    try {
        items = Array.prototype.slice.call(arrayLike, 0);
    }
    catch(e) {
        items = [];

        var count = arrayLike.length;

        for (var i = 0; i < count; i++) {
            items.push(arrayLike[i]);
        }
    }

    return items;
};

或其以下简化版本,如果浏览器不支持将非Array参数传递给Array.prototype.slice.call()(IE8-如果我没记错的话)没关系:

var arrayFrom = function(arrayLike) {
    return Array.from
         ? Array.from(arrayLike);
         : Array.prototype.slice.call(arrayLike, 0);
};

关于javascript - 干燥 htmlCollection 到 Array 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057471/

相关文章:

javascript - Node.js 事件发射器 : How to bind a class context to the event listener and then remove this listener

java - 在多个 spring boot API 之间共享公共(public)代码

C 'generics' -- double 和 float

JavaScript - 当错误调用另一个函数时函数不会抛出错误

javascript - jQuery:使用 eq 重新排列列表项

python numpy : loading files to list, 并转换为数组,但错误 "array is too big."

ios - Swift 数组未附加到

Java:如何按降序排列数组?

javascript - 如何以更 DRY 的方式监听 3 个元素中的 mouseover 和 mouseout 事件?

javascript - JS 访问数组中的数据