我如何在vanilla js中编写这个JQuery addClass方法
那我怎么写呢
$('div').addClass('border1');
在Vanilla javascript中,就像我的add class方法一样。 到目前为止我所拥有的是,
function addClass(x,y) { x.className += " " + y; }
但我知道这是错误的,因为参数已关闭。 我真的输了。
让我们仔细看看jQuery在这里做了些什么。
$('div')
是什么意思?
在jQuery术语中,它意味着“在文档中选择所有’div’元素” 。
$('div')
是一个jQuery对象,它表示文档中的所有div
元素。 但是在这段代码中你没有自己专门针对单个DOM元素。
让我们编写自己的简化选择对象“MySelect”:
/** * `MySelect` object constructor. */ function MySelect(selector){ this.elementList = document.querySelectorAll(selector); }
现在让我们使用它:
var divs = new MySelect('div'); divs.elementList; // all `div` elements in the document.
(注意, querySelectorAll
是一个原生的javascript DOM方法)
现在我们有了一个元素选择对象,让我们为它添加一个addClass
方法:
/** * Add the specified class to all elements selected by this object. */ MySelect.prototype.addClass = function(cls){ var i, e; for (i = 0; i < this.elementList.length ; i++){ e = this.elementList[i]; e.className += " " + cls; // can also use e.classList.add } }
瞧:
divs.addClass('xyz');
这是一个非常简单的方式,就是jQuery的工作原理。
对于$
语法,您可以执行以下操作:
function $(selector){ return new MySelect(selector); }
像往常一样使用它:
$('div').addClass('xyz');
element.classList
是vanillaJS的做法
var x = document.getElementById('x'); var y = document.getElementById('y'); var z = document.getElementById('z'); y.addEventListener('click',function(){ x.classList.add('blue'); }); z.addEventListener('click',function(){ x.classList.toggle('blue'); });
#x { width: 50px; height: 50px; border: 1px dotted gray; } .blue { background-color: blue; }
如果你的目标是IE10 +,你可以使用
var el = document.getElementById("someId"); el.classList.add(className);
对于所有浏览器:
if (el.classList) el.classList.add(className); else el.className += ' ' + className;
资料来源:http: //youmightnotneedjquery.com/#add_class
function addClass(selector, class) { els = document.querySelectorAll(selector); for (var i = 0; i < els.length; i++) { els[i].className += class; } }
然后你可以这样做:
addClass('div', 'border1'); addClass('#someID', 'someclass'); addClass('.someClass', 'someotherclass');
我写这不是推荐,而是因为你似乎想要创建一个方法,而不是一个函数; 可能是因为人们可能会更好。 然而,它们大致相同,除了扩展原型以添加方法可能会带来麻烦。 但是,如果你必须:
NodeList.prototype.addClass = function (cName) { // creates an Array from the NodeList, and iterates through: return [].forEach.call(this, function (elem) { // adds the passed-in class-name: elem.classList.add(cName); }); };
以上可以通过以下方式调用:
document.querySelectorAll('div').addClass('newClassName');
要么:
document.getElementsByTagName('div').addClass('newClassName');
请注意,这使用相对现代浏览器中的function,但如果需要,可以使用for
循环( forEach
)和带有className
属性( classList.add()
)的字符串连接替换它们。