给泛型事件处理程序提供参数
Give arguments to generic eventhandler
我正在创建一堆具有通用onclick事件的元素,如
function foo( i , j ) {
alert("foo");
//dostuff
};
for (i = 1; i < 8; i++){
var clas = get_class_for_index( i );
for ( j = 0; j < 96; j++){
// tbody > #(i) is a <tr>
$("#table > tbody > #" + i ).append( function(){
// I want to give ( i , j ) to foo
return $("<td id='" + j + "' class='" + clas + "'></td>").on("click", foo );
});
};
};
那么,我怎么给foo这些参数呢?我也可以使用和的id,因为它们是(I,j)但是我怎么从foo里面得到它们呢?
您需要在这里使用IIFE闭包,否则由于作用域,您将最终将i or j
的最后迭代值传递给事件处理程序。
像这样 :
var $anchors = $("a");
function foo(idx) {
alert("foo " + idx);
};
for(var i = 0; i < $anchors.length; i++) {
$anchors.eq(i).on("click", (function(i) {
return function(e) {
foo(i);
}
}(i)));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#">Link</a> | <a href="#">Link</a> | <a href="#">Link</a> | <a href="#">Link</a>
在上面的示例中,我们使用一个立即执行的函数(以i
作为参数)并返回一个函数,然后将该函数绑定为单击处理程序并将正确的i
传递给foo
。这称为IIFE(立即调用的函数表达式)。
我可以传递参数到事件处理程序?
不,你不能。事件处理函数在事件发生时执行,您不会调用foo()
来传递i
和j
,即使在for循环执行完成后,foo()
也会被执行,并且不会存在任何i
&j
.
Then What can do in my condition.
最好的方法是将i和j值添加到DOM元素本身,以便您可以在事件处理程序函数中访问它。您可以使用jQuery的data()方法向DOM中添加额外的信息。
function foo(evt) {
$(evt.currentTarget).data() //You will get here all values, i.e. i & j
//dostuff
};
for (i = 1; i < 8; i++) {
var clas = get_class_for_index(i);
for (j = 0; j < 96; j++) {
// tbody > #(i) is a <tr>
$("#table > tbody > #" + i).append(function() {
// I want to give ( i , j ) to foo
return $("<td id='" + j + "' class='" + clas + "'></td>").data({
i: i,
j: j
}).on("click", foo);
});
};
};
您需要使用jquery on
函数,以便在创建后将事件注册到元素,您可以使用元素的Id将事件附加到它并在事件回调函数中调用foo。
我添加了一个工作片段,它使用了I和j的组合id,如下所示
function foo( i , j ) {
console.log(i+"_"+j);
alert(i+"_"+j);
//dostuff
};
for (i = 1; i < 8; i++){
var clas = "aa_"+i;
$("#table").append("<tr id='" + i + "'></tr>");
for ( j = 0; j < 96; j++){
// tbody > #(i) is a <tr>
$("#table > tbody > #" + i ).append( function(){
// I want to give ( i , j ) to foo
return $("<td id='test_" + i + "_" + j + "' class='" + clas + "'>aa</td>").on("click", function(){
var id = $(this).attr("id").split('_');
//console.log(id);
foo(id[1],id[2]);
} );
});
};
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="table"></table>
当使用事件处理程序时,您可以使用jquery的。on()作为事件处理程序,就像这个例子。
$("#id").on("click", function(){
//do stuff here or call a function;
});
参考:http://api.jquery.com/on/
相关文章:
- 检查事件处理程序参数
- 带有参数的Javascript事件处理程序
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 使用应用程序状态js和视图在angular js url上传递两个参数
- 将作用域绑定到事件处理程序,但保留原始参数
- 将参数传递给函数,同时保留事件处理程序
- 将参数传递给reactjs单击处理程序
- 如何将多个参数传递给输入's onChange处理程序
- 在动态创建的元素中包含参数的事件处理程序
- JS:删除带有接受参数的处理程序的事件侦听器
- 如何在Jasmine中将参数从规范传递给报告程序
- 如何将参数传递到节点's Q库's(去神化)promise处理程序
- Node.js如何知道回调的第一个参数是否是错误处理程序
- 将参数传递给jQuery中的事件处理程序
- 在express应用程序中,请求参数两次附加到URL
- 将一个额外的参数传递给分页扩展程序
- 如何将对象参数传递给事件处理程序
- 是否可以获得“”的事件对象;当前“;或“;最后一个“;事件,而不将其作为处理程序中的参数接收
- 用于Cordova应用程序的Javascript SQLite-使用参数搜索,其中字符串包含子字符串大小写insenst
- 如何在事件处理程序中包含函数(及其参数),而不在页面加载时调用该函数