什么是prevObject,为什么我的选择器会返回?

时间:2013-10-31 02:35:08

标签: javascript jquery offset

我正在尝试从元素中获取顶部但我收到此错误,这意味着什么以及如何摆脱它?

$(".hover").offset().top

>Uncaught TypeError: Cannot read property 'top' of undefined

$(".hover")

[div.hover, prevObject: x.fn.x.init[1], context: document, selector: ".hover", jquery: "2.0.3", constructor: function…]
[prevObject: x.fn.x.init[1], context: document, selector: ".hover", jquery: "2.0.3", constructor: function…]

当我尝试将其放入嵌套的droppable中时,会发生在jqueryui的drop事件中。

$.fn.makeDroppable = function(){
    $(this).droppable({
        drop: function(event, ui) {
            console.log($(".hover"));
            console.log($(".hover").offset().top);
            $(".hover").makeDroppable().removeClass("hover");
        },
        over: function(event, ui) {
            $("<div>").addClass("hover").appendTo(this);
        }
    });
}
$(".container").makeDroppable();

<div class="container"></div>

2 个答案:

答案 0 :(得分:20)

如果DOM没有运行jQuery的元素,jQuery将返回prevObject。您可能会在运行时看到源中的元素,但它并未绑定到DOM,因此它显示了prevObject。尝试再次检查您的js文件,或者在此处粘贴代码。

答案 1 :(得分:8)

虽然错误与prevObject无关,但我会解释它,因为它是标题中的问题。

jQuery .end()

  

结束当前链中最近的过滤操作,并将匹配元素集返回到先前的状态。

要返回其先前的状态,jQuery将返回包含所选元素的prevObject,其中包含过滤操作,例如.find().filter().children()

示例

$('#target').append($('div').find('input').remove().end());

$('div')将选择所有div元素。 --- (* 1)

然后,$('div').find('input').remove()将选择所选div元素中的所有输入元素并删除这些输入元素。

之后,$('div').find('input').remove().end()将在调用.find('input')之前返回元素。因此,它将返回与(* 1)相同的所有div元素,除了div中的所有输入元素都被删除。 返回的元素存储在prevObject

最后,返回的元素(* 1)会附加到#target

.end()的文档:https://api.jquery.com/end/