4

这个 jsFiddle 中,我有两个未定义或为空的变量。如果第一个变量已初始化,则脚本有效,但如果使用第二个变量则无效。您可以通过注释掉每一个并运行脚本来测试这一点。

这是代码:

var test = $('.not-here').height(); // works with this variable
var test2 = $('.also-not-here').offset().top; // doesn't work with this

$('#output').append('yeah');

为什么我会遇到这个问题,我该如何解决?

4

4 回答 4

3

您的两个选择器都无效,因此它们返回一个空的 jQuery 结果列表。

调用.height()一个空的结果列表返回null。调用.offset()一个空的结果列表也会返回null

你进入Uncaught TypeError: Cannot read property 'top' of null第二行的原因是因为你试图调用.top()结果offset()null.

基本上你正在尝试执行null.top().

我不知道你的代码是做什么的,但作为一个纯粹的例子,你可以在使用它们之前先检查结果,类似于:

var $elem1 = $('.not-here');
var $elem2 = $('.also-not-here');

if($elem1.length && $elem2.length){
    var test = $elem1.height();
    var test2 = $elem2.offset().top;

    $('#output').append('yeah');
}
于 2013-04-17T19:18:34.550 回答
1

$('.also-not-here').offset()null如果节点不存在则返回。这就是它的设计方式。

当您想要修复以使您的代码不会中断时,您可以执行以下操作:

var $node = $('.also-not-here');
var test2 = $node.length>0 ? $node.offset().top : null;
于 2013-04-17T19:18:21.677 回答
1
var test = $('.not-here').height();

这返回你null,因为没有元素$('.not-here')

再次,

var test2 = $('.also-not-here').offset();

这也返回 you null,因为没有元素$('.also-not-here')并且我们无法读取topnull 的属性。

我建议这样做:

$.fn.isThere = function(){ return this.length > 0; }

var $selector = $('.also-not-here');
if ($selector.isThere()) {
    var test2 = $selector.offset().top;
}
于 2013-04-17T19:18:30.203 回答
0

第一个test设置为空。第二种情况,您尝试引用将引发异常的空值属性。

于 2013-04-17T19:13:44.340 回答