Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Transtale jquery事件将其转换为函数参数_Javascript_Jquery_Functional Programming - Fatal编程技术网

Javascript Transtale jquery事件将其转换为函数参数

Javascript Transtale jquery事件将其转换为函数参数,javascript,jquery,functional-programming,Javascript,Jquery,Functional Programming,我一直想知道在事件上使用jQuery的this时的一个特殊情况 假设我们有以下功能: function myPrint(randomString){ console.log(randomString); } function handler(){ myPrint(this.value); } $('input1').change(handler); $('input2').change(handler); . . . $('inputN').change(handler); 我们希望

我一直想知道在事件上使用jQuery的this时的一个特殊情况

假设我们有以下功能:

function myPrint(randomString){
  console.log(randomString);
}
function handler(){
  myPrint(this.value);
}
$('input1').change(handler);
$('input2').change(handler);
.
.
.
$('inputN').change(handler);
我们希望使用jQuery将其绑定到输入的更改事件,这样每次更改时它都会打印输入的内容

可以这样做:

$('input').change(function(){
  myPrint(this.value);
})
$('input1').change(function(){
  myPrint(this.value);
})
$('input2').change(function(){
  myPrint(this.value);
})
.
.
.
$('inputN').change(function(){
  myPrint(this.value);
})
假设我们现在想要以相同的方式将myPrint绑定到其他几个输入。第一个版本如下所示:

$('input').change(function(){
  myPrint(this.value);
})
$('input1').change(function(){
  myPrint(this.value);
})
$('input2').change(function(){
  myPrint(this.value);
})
.
.
.
$('inputN').change(function(){
  myPrint(this.value);
})
但这会违反DRY,因为我们会一次又一次地重复相同的匿名函数。解决此问题的一种简单方法是声明一个本地处理程序函数:

function myPrint(randomString){
  console.log(randomString);
}
function handler(){
  myPrint(this.value);
}
$('input1').change(handler);
$('input2').change(handler);
.
.
.
$('inputN').change(handler);
但这需要处理函数

所以,我的问题是:有没有一种方法可以消除使用所有匿名函数而不声明另一个函数(如handler)的需要

我试着像这样使用bind:

$('input').change(function(){
  myPrint(this.value);
})
$('input1').change(function(){
  myPrint(this.value);
})
$('input2').change(function(){
  myPrint(this.value);
})
.
.
.
$('inputN').change(function(){
  myPrint(this.value);
})
$'input1'.changemyPrint.bindnull,this.value

但它不起作用,因为它不在事件范围内,因此不引用输入


编辑:这个问题实际上不是关于jQuery的选项,而是关于从这个参数到另一个函数的转换,而不需要声明帮助函数。

您可以像这样使用jQuery:

$("input").each( function() { this.change( function () { alert("a"); } ) } );
没有

每个回调都必须有一个函数,如果要将参数传递给回调中的函数,它需要一个包装回调

但是,在这种特殊情况下,您可以执行以下操作:

$('input1, input2, input3, inputN').change(function() {
    myPrint(this.value);
});
传递给$的参数就像CSS选择器一样工作,因此,就像CSS选择器一样,您可以用逗号分隔多个选择器,将它们全部分组在一起

如果要对多个事件使用同一函数,可以使用绑定和传递空格分隔的事件名称:

$('input1').bind('change click', function() {
    myPrint(this.value);
});

您可以在一个选择器中选择多个输入,然后调用函数:

$('input1, input2, input3').change(function(){
    myPrint(this.value);
})
从该函数转换为参数到另一个函数,而无需声明辅助函数

既然bind不能做到这一点,而且没有其他类似的本机函数,我们需要一个自定义的helper函数。但是,我们可以通过函数编程而不是使用函数表达式来创建它

请注意,您仍然应该只创建一个绑定到所有元素的处理程序,而不是为每个元素创建新的处理程序。无论是通过使用变量来存储它,还是对所有元素的集合调用.change,都无关紧要

Function.prototype.methodize = function() {
    // http://api.prototypejs.org/language/Function/prototype/methodize/
    var f = this;
    return function() {
        return f.call(null, this);
    };
};
Function.prototype.map = function(g) {
    // function composition
    var f = this;
    return function() {
        return g(f.apply(this, arguments));
    };
};
Object.get = function(p) {
    return function(v) { return v[p]; };
};
现在你可以使用

var handler = Object.get("value").map(myPrint).methodize();

是的,这可以解决这个特殊情况下的问题,但它不能解决我们想要将函数绑定到多个事件的情况。更新了我的答案,以展示如何将一个函数绑定到多个事件。