.click函数在没有参数的情况下工作,但不使用参数
.click function working without arguments, but not working with arguments
我有一个正在工作的函数:
$('#buttFurniture').click(onFilterCLick);
但后来我决定给函数添加一些参数,它就停止了工作:
$('#buttFurniture').click(onFilterCLick(arrOutput, arrFurniture));
全功能:
function onFilterCLick(arrFull,arrCurrent) {
$('#buttFurniture').css("background-color", "#F1F1F1");
$('#buttCars').css("background-color", "#F1F1F1");
$('#buttGames').css("background-color", "#F1F1F1");
$('#buttFurniture').css("color", "black");
$('#buttCars').css("color", "black");
$('#buttGames').css("color", "black");
$(this).css("background-color", "#656565");
$(this).css("color", "white");
if (jQuery.inArray(arrCurrent[0], arrFull)) {
console.log("asdasd");
}
}
解决方案:在传递函数时使用绑定来分配参数:
$('#buttFurniture').click(onFilterCLick.bind($('#buttFurniture'), arrOutput, arrFurniture));
解释:在javascript中,函数是所谓的第一类对象,这意味着它们可以作为变量传递,就像其他基元(数字、布尔值等)一样,也可以作为函数的参数传递。
在这方面,重要的是要注意将函数作为变量传递和调用函数的关键区别。例如,考虑以下函数:
var myFunc = function () {
return 0;
}
现在,请注意这两种说法之间的区别:
typeof myFunc // "function"
typeof myFunc() // "number"
正如您所看到的,第一个是对函数本身的引用,第二个是对该函数的调用——这是一个微妙但关键的区别。
您的点击处理程序需要一个函数作为其参数,而不是功能调用(或被调用函数的结果)。这就是为什么必须使用bind:bind允许您传递函数本身,但也允许您预先填充正在传递的函数的参数。
简而言之,bind()
函数(在您的情况下)有3个参数-每个bind()
函数中的第一个参数是this
参数-将this
设置为所选元素是必要的,这样您的$(this)
调用就有了正确的上下文。其他参数是预填充函数其余参数的地方。
希望这能有所帮助!
您可以使用click事件的回调函数来调用另一个带参数的函数。
$('#buttFurniture').click(function () {
onFilterCLick(arrOutput, arrFurniture)
});
当您不在函数定义中使用$(this)
时,我建议使用@JonathanBrooks描述的.bind(null,func_arguments)
方法,因为this
将引用window
对象。
然而,如果你想将上下文选择为"this",那么我建议你这样使用:
function onFilterCLick(elem,arrFull,arrCurrent) {
//now you can use elem to refer $(this)
elem.css("background-color", "#656565");
}
并对点击事件使用匿名功能,如下所示:
$('#buttFurniture').click(function(){
onFilterCLick($(this),arrOutput,arrFurniture);
});
这里的工作代码示例
它不起作用,因为您正在调用$('#buttFurniture').click(onFilterCLick(arrOutput, arrFurniture));
中的onFilterCLick(arrOutput, arrFurniture)
不将onFilterCLick
作为单击事件的处理程序传递。
如果#buttFurniture是在DOM准备好后生成的
function onFilterCLick(arrOutput, arrFurniture) {
console.log(arguments);
console.log($(this));
$(this).toggleClass('red-border');
};
$('#buttFurniture').on('click', function (evt) {
evt.preventDefault();
var holder = onFilterCLick.bind(this);
holder('argOne', 'argTwo');
});
若要选择和您单击的元素相同的元素,.bind(this)
将覆盖函数范围内的this
。
更新
我已经更新了这个例子,很抱歉没有经过测试的代码,这是fidle也可以阅读这篇文章以更好地理解绑定;)
这也会起作用。
var holder = onFilterCLick.bind(this, 'argOne', 'argTwo');
holder();
我希望这对你有帮助。
- 无法使我的文本参数与我的查询一起工作
- 如何使参数在事件函数中工作
- 将图标作为参数传递不会;t工作-谷歌地图
- 添加第二个参数时,Javascript函数将停止工作
- 当名称空间在id参数之前声明时,Angular UI路由器停止工作
- 窗口clearInterval()在没有参数的情况下工作
- 无法获取用户 ID 路由参数以在反应路由器中继上工作
- 在 .before() 中多次使用相同的参数并不像我预期的那样工作
- JS .replace(str, str):如何获取参数 1 中的变量并全局工作
- 忽略服务工作进程请求中的查询参数
- JQuery 函数突然停止工作,转换 Javascript 参数时出错
- 猫鼬对象 ID 不作为函数中的参数工作
- JavaScript onclick 函数在参数为整数而不是字符串时工作
- 添加参数时调用javascript函数停止工作,这真的不大声吗
- 缺少参数 &&&||括号中的运算符,但仍在工作
- g:message 在 Javascript / jQuery 中带有参数的参数无法按预期工作
- JSON.stringify()工作不正常-第二个参数消失
- 为什么Selenium WebDriver不使用JavaScript等待时间参数工作
- 如何使Javascript定时器为变量参数工作
- 为什么不't将该方法作为参数工作传递