【发布时间】:2019-06-28 10:01:37
【问题描述】:
完全是实验性的,仅用于学习我正在尝试重新发明轮子,一个名为 jquery 的轮子。这样做的最初目的是了解可链接的函数。 所以我写了一个这样做的函数,就我所见,非常好,就像这样:(有点缩短)
var $ = function(s) {
var el = document.querySelectorAll(s);
var myobj = {
addClass(className) {
el.forEach(elem => {elem.classList.add(className)});
return this;
},
toggleClass(className) {
el.forEach(elem => {elem.classList.toggle(className)});
return this;
},
removeClass(className) {
el.forEach(elem => {elem.classList.remove(className)});
return this;
},
html(html) {
if (typeof html == 'string') {
el.forEach(elem => {elem.innerHTML = html});
return this;
} else {
return el[0].innerHTML;
}
}
};
return myobj;
};
(这确实是一个工作示例)现在我可以使用类似 jquery 的语法来操作元素(或元素的节点列表)的类和 html,如下所示:$('#test').html('new html content'); 或像 $('a').html('my new link').addClass('newclassname'); 一样链接,即真的很酷。
如果有兴趣,这里是完整的script snapshot of today,包括css()和attr(),还包括缺少的jquery函数id()。
我的问题是:
-
[已解决]我怎样才能让这个函数像 jquery 一样返回像
var elm = $('div#test');这样的元素本身,现在我要取回整个对象。 [已解决] (请参阅下面的 cmets) 我如何编写一个备用函数,以防止收到像
$(...).animate is not a function这样的错误消息,如果我我正在使用此功能当前未涵盖的方法,例如$('div#test').addClass('newclass').animate({top:'2.3em',background:'red'});,因为目前尚未实现animate()。在php中有一个__get()函数,在javascript中有类似的吗?
请不要问我为什么要做这一切,因为我提到这是为了学习和理解
谢谢。
【问题讨论】:
-
不确定你的第一个问题是什么意思——当你使用 jQuery 时,
$('div#test')将返回一个 jQuery 集合而不是单个 DOM 元素。 jQuery 集合在概念上与您的myobj几乎相同(尽管它的构建方式不同)。 -
@David 这不是 jQuery。 OP 正在尝试编写自己的代码来模仿 jQuery 的行为,以此作为一种学习努力。
-
@TylerRoper 是的,我知道。但我仍然不明白他所说的“……元素本身……”是什么意思
-
使用 jQuery 也不会得到“只是元素本身”——它是一个 jQuery 对象(试试
$('div#test') instanceof jQuery)。也许您指的是它在控制台中的外观,例如元素数组? -
@freedomn-m 我从来不知道
__noSuchMethod。我打算建议a Proxy to capture all gets。编辑:似乎__noSuchMethod__是非标准的,也被标记为过时的。所以代理可能是更好的选择。
标签: javascript jquery chained