【发布时间】:2018-01-24 22:23:34
【问题描述】:
我试图在一定程度上复制 jQuery 的元素操作。现在我发现非常有用的是.first() 选择器。我希望能够像这样链接函数;getElement(selector).first().hasClass(className);
现在,我已经取得了 2 个问题(请注意,我的代码示例被最小化了,所以请不要对错误处理进行 cmets。)
var getElement = function(selector, parent) {
ret = document.querySelectorAll(selector);
this.element = ret;
this.hasClass = function(className) {
className.replace('.', '');
if(this.multiple())
{
console.log('Cannot use hasClass function on multiple elements');
return false;
}
};
this.first = function() {
this.element = this.element[0];
return this;
};
return this;
};
我目前的问题
如果我调用我的函数;
var $test = getElement('.something');
//result: nodelist with .something divs
如果我调用结果中的第一个元素;
$test.first();
//Result: First div, perfect!
但是,现在如果我再次调用$test,它将用first() 的结果替换elements 属性,这意味着我已经“丢失”了我的旧值。我不想失去它们,我只想要 first() 函数来实现该特定功能。然后我希望$test 再次返回所有元素。
此外,调用 first() 现在将结束 undefined,因为在 this 中只剩下 1 个元素,因为它已经从对象中删除了旧元素。
又一次尝试
现在,我还尝试通过返回第一个孩子而不是整个类对象来扭转它;
this.first = function() {
return this.element[0];
};
但是,我会
$test.first().hasClass(className);
//Returns ERROR, method hasClass undefined
这是因为 .hasClass 存在于原始 this 上,因为我现在要返回元素,所以它不再返回。
我试图从 jQuery 的库中获取一些东西,但这让我更加困惑......
我已经用谷歌搜索了这个主题,但是我找到的所有“链接方法”解决方案似乎都覆盖了对象的原始值,这不是我想要发生的。另一种解决方案实际上需要我一遍又一遍地重新启动对象,这对我来说似乎不是很有效......感谢任何帮助。我假设我的做法完全错误。
-- 如果你能帮助我,请解释为什么你的解决方案有效。我真的觉得如果我理解了这一点,我对javascript的理解可以进一步扩展。我只需要解决这个结构性(?)问题。
【问题讨论】:
-
不返回元素(jQuery 也不返回),将其包装在您自己的类中,该类具有函数并在其自己的上下文中工作。另请注意,在我看来,你的这个在我看来非常模棱两可,因为我没有看到你使用
new getElement,这表明你的this很好,而不是你所期望的 -
查看我的answer,了解一种实现您想要的方法,类似于
jQuery@Babydead。 -
@Icepickle 谢谢,但我确实将它作为新的。但是,我在函数中使用了一个技巧(为了在此处发布它,我已经最小化了代码)。 AngelPolitis 现在检查你的答案。
-
@Babydead 从您对 Angels 回答的回复中,您似乎没有使用 new,因为您获得了
this的窗口 -
@icepickle 是的,如果我忘了做新的事情,我会回到窗口。已经解决了这个问题,但我不明白触发它的方式或原因是什么哈哈哈。谢谢。
标签: javascript method-chaining