jQuery:.live()和.on() - live将此作为JS对象返回,返回此作为jQuery对象?

时间:2012-08-20 08:56:54

标签: jquery jquery-on

我想用.live()替换旧的.on()函数。

.live()

 var jqRow = $('#' + id + ' tr');
 jqRow.live("click", function () {
            myFunction(this);
            return false;
        });

。对()

var jqRow = $('#' + id + ' tr');
$(document).on("click", jqRow, function () {
                    myFunction(this);
                    return false;
        });

this方法的.live()返回一个JS对象(我需要这个)。 this方法的.on()返回一个jQuery对象,导致myFunction失败。

如何在live函数中获得与此对象相同的非jQuery?

5 个答案:

答案 0 :(得分:3)

如果this 确实是 jQuery对象,则可以使用this[0]this.get(0)

  

.get()方法授予我们访问每个jQuery对象下面的DOM节点的权限。

答案 1 :(得分:3)

您的语法不正确,您的jqRow变量是jQuery对象,但.on()函数只接受字符串选择器。如果传递jQuery对象,则忽略该参数,这与在文档本身上设置非委托事件处理程序相同。

改变这个:

var jqRow = $('#' + id + ' tr'); // this line creates a jQuery object
$(document).on("click", jqRow, function () {
    myFunction(this);
    return false;
});

到此:

var jqRow = '#' + id + ' tr'; // this line initialises a string
$(document).on("click", jqRow, function () {
    myFunction(this);
    return false;
});

答案 2 :(得分:3)

继续发表评论后,this成为jQuery对象可能 。这是因为函数中this的值是在调用函数时设置的,并且无法显式设置,它是不可变的。显然, 可能$(this)成为jQuery对象。

修改

正如@Anthony Grist指出的那样,真正的问题是在.on()中使用jQuery选择器。如果将其更改为传入字符串选择器,则会相应地设置this的值。我为疏忽道歉,这里是working JSFiddle

对于它的价值,如果您委托给单个选择器,我只需在该选择器上调用.on()

$("#foo").on("click", function() {});

...否则

如果您无法传入字符串选择器并且必须传入实际的jQuery对象,则可以使用事件对象解决它。此代码有效:

var jqRow = $('#foo');
$(document).on("click", jqRow, function (e) {
  myFunction(e.target);
  return false;
});

var jqRow2 = $('#bar');
jqRow2.live("click", function () {
  myFunction(this);
  return false;
 });


function myFunction(x) {
  console.log(x);
  console.log($(x).attr("id"));
}

Working JSFiddle

请注意,使用您在那里进行委派的语法将事件绑定到jqRow,它会将其绑定到document。 jQuery不允许你传递一个jQuery对象作为委托。所以上面代码的第一部分是毫无意义的,你可以这样做:

var jqRow = $('#foo');
$(document).on("click", function (e) {
  if($(e.target).attr("id") === "foo") {
    myFunction(e.target);
  }
  return false;
});

这就是为什么this.on()的值不是点击的对象,正如您所期望的那样,jQuery无法将事件委托给jQuery对象,它需要一个选择器。因此,传递e.target可以解决您的问题。

答案 3 :(得分:2)

你可以使用get()函数,它将索引作为参数,或者你可以使用[]。

var jqRow = $('#' + id + ' tr');
$(document).on("click", jqRow, function () {
                    myFunction(this.get(0));
                    // or this myFunction(this[0]);
                    return false;
        });

答案 4 :(得分:0)

使用

$(document).ready(function()
{ 
    var id="" ;  // ID of your Element
     var jqRow = $('#' + id);
      jqRow.on("click", 'tr', function ()
      {
                //alert($(this));
                myFunction($(this));
                return false;
       });


 });​