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

jQuery:.live()和.on()-live将此作为JS对象返回,是否将此作为jQuery对象返回?,jquery,jquery-on,Jquery,Jquery On,我想用.on替换旧的.live函数 .活 .在 live方法的this返回一个JS对象,我需要它。 这个.on方法返回一个jQuery对象,这会导致myFunction失败 如何在live函数中获得与此对象相同的非jQuery对象?如果这确实是一个jQuery对象,您可以使用此[0]或: get方法允许我们访问每个jQuery对象下面的DOM节点 您可以使用get函数,该函数以索引为参数,也可以使用[] var jqRow = $('#' + id + ' tr'); $(document).o

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

.活

.在

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

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

如果这确实是一个jQuery对象,您可以使用此[0]或:

get方法允许我们访问每个jQuery对象下面的DOM节点


您可以使用get函数,该函数以索引为参数,也可以使用[]

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


语法不正确,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;
});

根据我的评论,这不可能是jQuery对象。这是因为函数中的This值是在调用函数时设置的,不能显式设置,它是不可变的。显然,$this可能是jQuery对象

编辑

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

无论如何,如果您将授权给一个选择器,我只需调用。在该选择器上:

$("#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"));
}
请记住,您在那里用于委派的语法不会将事件绑定到jqRow,而是将其绑定到文档。jQuery不允许将jQuery对象作为委托对象传入。因此,上述代码的第一部分是毫无意义的,您可以只做:

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

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

您确定这是一个jQuery对象吗?JavaScript中的这个是不可变的,所以据我所知,它不可能被设置为jQuery对象。@JackFranklin这可能有不同的值,具体取决于函数的调用方式。例如,我已经测试过这个脚本和控制台。logthis返回一个JS文档对象,而不是jQuery对象。我理解,但我认为不可能将其设置为jQuery对象,因为这总是基于调用函数的范围来设置的@Keith L,你能在JSFIDLE上举个例子吗?不正确,可以将jQuery选择器作为第二个参数。请参阅:@JackFranklin使用e.target与使用此不同,您的JSFIDLE毫无意义。请看一看,它实际上与问题中的代码相匹配。@JackFranklin为了更清楚地说明这一点:当您将字符串以外的任何内容作为参数传递时,它将被忽略,因为它无效,并且您会将一个直接事件处理程序附加到文档中,用于单击事件。jQuery将使其成为文档本身,但e.target将是最初单击的元素,并导致事件沿着DOM传播到文档中。Anthony,抱歉,我误读了。你确实是对的,修改了我的答案。这是不正确的-如果你正确使用,这将是实际单击的元素。传递jQuery对象无效。使用e.target是一种不知道如何实际使用jQuery的变通方法。
$("#foo").on("click", function() {});
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"));
}
var jqRow = $('#foo');
$(document).on("click", function (e) {
  if($(e.target).attr("id") === "foo") {
    myFunction(e.target);
  }
  return false;
});