jQuery动态事件绑定

时间:2009-07-23 06:58:25

标签: javascript jquery

我认为这是一个非常基本的问题,但我正在努力解决这个问题。

在我的表单上,我可以选择动态地向表中添加一个新行,这很简单,可以使用jQuery。在其中一个元素上,我需要绑定一个事件,也相对简单。我遇到问题的部分是需要绑定的事件必须带参数。所以,我得到的代码:

$(newrow).find("select").each(function () {
        var ochange = function(handle){
                var thisselect = "select" + handle;
                var thislink = "link" + handle;
                var thiscollate = "collate" + handle;
                if(document.getElementById(thisselect).value == 4){
                    document.getElementById(thislink).style.visibility = 'visible';
                }
                else{
                    document.getElementById(thislink).style.visibility = 'hidden';
                    document.getElementById(thiscollate).value = "";
                }
        };
        $(this).change(ochange);
        $(this).attr("name", "select" + numfields);
        $(this).attr("id", "select" + numfields);
    });

事件按预期绑定,但“handle”变量没有注册(当然因为我很确定这是不正确的语法)。此外,我想要绑定到动态表单元素的这个函数实际上已经定义了,所以如果有一种方法可以调用已定义的函数(需要参数),我很乐意听到它。

3 个答案:

答案 0 :(得分:0)

在您的代码中,'handle'变量是一个jQuery对象,表示'select'小部件更改的事件。如果要获取触发此事件的DOM对象,请使用handle.target属性。例如,要获取其名称,请使用handle.target属性。获取目标的jQuery对象 - $(handle.target)。

事件对象的完整参考是here

答案 1 :(得分:0)

事件处理函数的第一个参数是event object

如果我理解正确,基本上你想将值传递给ochange函数。

你可以在每个回调函数的范围内声明变量handle,并在ochange函数上使用它的值,因为你有jQuery,你可以使用它在该函数中,并避免getElementById调用:

$(newrow).find("select").each(function () {

  var handle = "someValue"; // this variable will be accessible inside ochange

  var ochange = function(){
    var thisselect = "select" + handle;
    var thislink = "link" + handle;
    var thiscollate = "collate" + handle;
    if($(thisselect).val() == 4){
      $(thislink).css('visibility', 'visible');
    }
    else{
      $(thislink).css('visibility', 'hidden');
      $(thiscollate).val('');
    }
  };

  $(this).change(ochange);
  $(this).attr("name", "select" + numfields);
  $(this).attr("id", "select" + numfields);
});

答案 2 :(得分:0)

您可以提供“帮助”功能:

 $(this).change( function (evt)  {
    ochange('someVal')
  });

另一个复杂但同时又简单的选项是jquery.hitch插件(jQuery 1.3.3中有哪些类似的东西?)

有了它,你可以这样做:

  var obj = {
     attr: "blah",
     myFunc: function(arg){
       console.log(this.attr + " " + arg);
     }
  }
  $(this).change( $.hitch( obj, "myFunc", "wheee") )