javascript - 尝试使用多个选择器制作 jQuery

标签 javascript helper

我尝试制作一个非常精简的“类似 jQuery”的选择器,但我无法使其适用于所有类,我尝试使用 for 循环,但由于“return new”,它中断了循环。

JS

var $ = function(el){       
  var helpers = {
    css: function(v){
      (this.value).setAttribute('style',v);     
    },
    replace: function(v){
      (this.value).innerHTML = v;
      console.log(this.value);
    },
    append: function(v){
      (this.value).innerHTML =  (this.value).outerHTML + ' ' + v;
    }
  };
  function sel(el){ 
    this.value = document.querySelector(el);
  }
  sel.prototype = helpers;
  return new sel(el);
};

var sel1 = $('.sel1');

sel1.replace('<span>replaced</span>');
sel1.css("color:red");

HTML

<div class="sel1">test</div>
<div class="sel1">test</div>
<div class="sel1">test</div>

最佳答案

您想使用 Document.querySelectorAll()获得所有比赛而不仅仅是第一场比赛。这就是 jQuery 所做的。

显然,这意味着“值”不是节点,而是一个 NodeList(或 null)。这改变了函数,因为它们都必须处理一个列表,所以你必须有某种形式的 foreach() 来将你的函数应用于每个节点(这也是 jQuery 所做的,请参阅get() 就是一个很好的证明。)

最后,如果没有匹配项,jQuery 将返回一个 null,函数仍然有效。这是因为每个函数都使用 foreach() 函数,并且在 null 上,foreach() 什么都不做。因此,您必须实现该 foreach()。也许是这样的:

function foreach(list, func)
{
   var max, i, n;

   if(list) // make sure list is not 'null'
   {
       max = list.length;
       for(i = 0; i < max; ++i) // go through the elements
       {
           n = list[i];
           func(n);   // call user function
       }
   }
}

那么css函数就会变成这样:

css: function(v)
{
  foreach(this.value, function(n) { n.setAttribute('style', v); });
}

注意:如果您将 foreach() 作为助手的一部分,请确保使用 this.foreach() 调用它.

关于javascript - 尝试使用多个选择器制作 jQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42057003/

相关文章:

javascript - 是否存在用于将对象属性的子集复制到新对象中的 ES6 速记?

ruby-on-rails - 我如何在 rake 中使用助手?

javascript - Handlebars.registerHelper 是否支持异步函数?

javascript - 在 meteor 中设置一个带有助手的类

javascript - 我想在我的选择标签中显示选择性别作为占位符

javascript - 单击其中的 Bootstrap 切换按钮时如何禁用 anchor 标记单击

javascript - 为什么 !!0 为假且 {}+[] 为 0 但 !!({}+[]) 为真?

javascript - 有条件地向 jQuery Ajax 调用添加选项

javascript - 如何在 JavaScript 助手中只声明一次变量?

zend-framework - 模型助手 Zend