为什么对Array原型的更改在我的jQuery插件中不起作用
Why does this change to the Array prototype not work in my jQuery plugin?
我在Array原型中添加了以下方法:
Array.prototype.foreach = function(func){
for(var i = 0; i < this.length; i++){
if(!func(this[i]) === false) break; //return false from func in order to break the loop
}
return this;
}
在同一个文件中,在上面的代码之后,我有下面的jQuery插件:
jQuery.fn.addClassForEvents = function(){
var that = this;
arguments.foreach(function(event){
that.bind(event[0], function(){
that.addClass(event[0]);
})
.bind(event[1], function(){
that.removeClass(event[0]);
});
});
return this;
}
为了使用这个jQuery插件,我的代码看起来像:
$('div').addClassForEvents(['mouseenter', 'mouseleave']);
然而,浏览器在jQuery插件的"arguments.foreach(…."行上抛出一个错误,简单地说明
对象#没有方法"foreach"
然而,foreach
方法在我的代码的其他地方也能工作。为什么在这个jQuery插件中没有定义它?
它不起作用,因为参数不是数组。它是一个(类似数组的)参数对象。
Mozilla 的解释
您可以在现代浏览器中使用slice(并通过在IE中实际循环)将其转换为数组。
var argArray = Array.prototype.slice.call(arguments)
arguments
不是一个数组,而是一个对象。例如,它提供诸如arguments.callee
和arguments.caller
之类的属性。
您可以通过调用Array原型的apply
来使用它的foreach(参见JavaScript arguments object…及其后):
由于Array.prototype的所有方法都是通用的,因此它们可以很容易地应用于数组兼容的arguments对象:
jQuery.fn.addClassForEvents = function(){
var that = this;
[].foreach.apply(arguments, (function(event){
that.bind(event[0], function(){
that.addClass(event[0]);
})
.bind(event[1], function(){
that.removeClass(event[0]);
});
});
return this;
}
您需要将参数对象转换为数组
试试这个:
jQuery.fn.addClassForEvents = function(){
var that = this, arg = Array.prototype.slice.call(arguments);
arg.foreach(function(event){
that.bind(event[0], function(){
that.addClass(event[0]);
})
.bind(event[1], function(){
that.removeClass(event[0]);
});
});
return this;
}
要将arguments
转换为数组,也可以使用jQuery.makeArray(arguments)
。。。
http://api.jquery.com/jQuery.makeArray/
相关文章:
- 我的jQuery插件参数没有正确启动,遇到了问题
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 元素在我的代码中不会.fadeTo.Don'I don’我不知道;s错误的JavaScript、JQuery、H
- 用我的json数据填充JQuery DataTable
- Don'我不明白为什么我的setInterval+jQuery;不起作用
- 我的jquery代码不起作用.为什么?
- jQuery-将列表项的一个元素移动到同一项的另一个元素中+对我的列表中的每个项执行此操作
- JavaScript,JQuery.需要帮助才能获得'name'从我的JSON中删除
- 为什么jquery悬停在jsfiddle中可以工作,而在我的html布局中却不能
- 为什么这个jQuery可以作为一个小提琴工作,但在我的网页上没有
- 如何在我的html网页中使用jquery自动完成
- 我的jquery中出现NaN错误
- 更新数据,而不是用javascript和jquery将其添加到我的表中
- Jquery - 将我的两个类相乘没有结果
- 我需要一个jQuery函数来只工作在700px以上的屏幕大小,无法在我的代码中发现错误
- 我如何才能找到哪些网站使用我的jQuery插件
- Html、css和jQuery.我的代码有问题
- jQuery:我的函数需要一个反垃圾邮件
- jQuery-我的代码没有't似乎适用于所有浏览器
- jQuery:我的.remove()在.fadeout()完成之前发生