我有一个名为' getHtml(elem)'的函数的对象。我希望在$ .each迭代数组时访问它。我明白这个'这个'引用$ .each迭代中的元素,那么如何访问对象的函数呢?
例如:
MyObject.prototype.doSomething = function() {
var results = this.getElements(); //returns this object's array of objects
var html;
var elems = [];
var elem;
$.each(results, function(index, value) {
elem = $(this); //refers to the object returned in the $.each function
html = this.getHtml(elem); //doesn't work, this doesn't refer to this object
elems.push(html);
});
},
我得到的错误是:未捕获的TypeError:this.getHtml不是函数
我试着阅读bind(),但我不明白如何使用它。如何在$ .each中调用对象的函数?
答案 0 :(得分:1)
将this
绑定到每个变量之前的变量(例如var that
):
MyObject.prototype.doSomething = function() {
var that = this;
...
$.each(results, function(index, value) {
elem = $(this);
html = that.getHtml(elem); // that now = this outside of the loop
...
});
};
答案 1 :(得分:1)
由于您需要$.each
内的两个上下文,因此您必须将this
缓存在each
之外并在其中使用。
//Other code
.
.
var _this = this;
$.each(results, function(index, value) {
elem = $(this);
html = _this.getHtml(elem);
.
.
//other code
答案 2 :(得分:1)
在输入this
之前,尝试将var that
分配给each
:
var that = this;
...
$.each(results, function(index, value) {
elem = $(this); // refers to the object passed by the `$.each`
html = that.getHtml(elem);
...
});
答案 3 :(得分:0)
你的功能充满了坏习惯,尽管大多数可能不是你自己的错。你在网上看到的大多数jQuery代码的质量都是同样的。
是的,.each
是一种迭代项目集合的方式,但您正在尝试同时构建新列表。此操作已存在于称为.map
的jQuery中。但是,jQuery喜欢将内容保存在jQuery包装器中,因此如果您希望在调用.map
后回复实际数组,则需要在之后调用.get
。现在,您将拥有一个包含每个元素html
的vanilla JavaScript数组。
MyObject.prototype.doSomething = function() {
var results = this.getElements(); //returns this object's array of objects
var elems = $.map(results, function(index, elem) {
return $(elem).html();
}).get();
};
如果您能够使用ES6,这项工作就更加轻松了
MyObject.prototype.doSeomthing = function() {
return $.map(this.getElements(), (idx,elem)=> $(elem).html()).get();
};