.click函数在没有参数的情况下工作,但不使用参数

时间:2015-11-05 10:47:35

标签: javascript jquery html arrays

我有这个功能正在运作:

$('#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");
    }
}

5 个答案:

答案 0 :(得分:5)

解决方案:使用bind在传递函数时分配参数:

 $('#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)调用具有正确的上下文。其他参数是预先填充函数其余参数的地方。

希望这有帮助!

答案 1 :(得分:1)

您可以使用click事件的回调函数来调用带参数的另一个函数。

$('#buttFurniture').click(function () {
    onFilterCLick(arrOutput, arrFurniture)
});

答案 2 :(得分:1)

我建议您使用@JonathanBrooks所描述的.bind(null,func_arguments)方法,因为$(this)会引用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);
});

工作代码示例here

答案 3 :(得分:0)

它不起作用,因为你正在打电话 onFilterCLick(arrOutput, arrFurniture)中的$('#buttFurniture').click(onFilterCLick(arrOutput, arrFurniture)); 没有将onFilterCLick作为点击事件的处理程序传递。

答案 4 :(得分:0)

如果在DOM准备就绪后生成 #buttFurniture

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 另请阅读this article以获得更好的绑定理解;)

这也可行。

var holder = onFilterCLick.bind(this, 'argOne', 'argTwo'); 
holder();

我希望这会对你有所帮助。