【问题标题】:Javascript object property doesn't return correct lengthJavascript 对象属性不返回正确的长度
【发布时间】:2016-07-29 03:19:37
【问题描述】:

我使用 jQuery 动态克隆一个元素并要求一个对象返回它的长度,但它每次都返回 1。请看小提琴:

https://jsfiddle.net/gatzkerob/x5xd2x7q/3/

<span class="count">0</span>
<br>
<button>click</button>
<br>
<span class="a">a</span>

var obj = {
elem : $('.a')
}

function cloneThisAndCount(){
$('.a').last().after($('.a').first().clone());
$('.count').text(obj.elem.length);
}

$('button').click(function(){
cloneThisAndCount();
});

【问题讨论】:

  • 使用$('.count').text($('.a').length);
  • 预期结果是什么?
  • edit您的问题直接在问题正文中显示相关代码。 (就您的实际问题而言,您的代码中的任何内容都不会在创建 obj 对象后对其进行更新。)
  • 他只是不知道选择器结果正在缓存到属性中
  • 我知道我可以使用$('.a') 直接访问,但我想使用属性,所以我不必每次都输入长类名。

标签: javascript jquery object properties


【解决方案1】:
var obj = {
  elem : $('.a')
}

将在开始时计算一次并缓存到obj.elem。这将是1

注意(感谢nnnnn):当您引用一个jQuery 对象时,其他代码可能会更新该对象以添加更多元素。

解决方案 1:

你需要做的是,在每次计算长度之前重做选择器。

function cloneThisAndCount() {
  $('.a').last().after($('.a').first().clone());
  $('.count').text($('.a').length);
}

$('button').click(function() {
  cloneThisAndCount();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="count">0</span>
<br>
<button>click</button>
<br>
<span class="a">a</span>

解决方案 2

obj 更改为:

var obj = {
  elem : function(){ return $('.a')}
}

然后检查长度,如:$('.count').text(obj.elem().length);

var obj = {
  elem: function() {
    return $('.a')
  }
}

function cloneThisAndCount() {
  $('.a').last().after($('.a').first().clone());
  $('.count').text(obj.elem().length);
}

$('button').click(function() {
  cloneThisAndCount();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="count">0</span>
<br>
<button>click</button>
<br>
<span class="a">a</span>

【讨论】:

  • 片段 #2 成功了,干杯。我实际上在某个阶段尝试过,但没有在“elem”之后添加括号。
  • "which will be 1." - 请注意,当您引用 jQuery 对象时,其他代码可能会更新该对象以向其添加更多元素. (但正如您所说,它不会自动更新自身以包含后来添加到 DOM 的元素。)
  • 酷。当然(像往常一样)我过于迂腐了,因为绝大多数 jQuery 方法返回一个新对象而不更改旧对象,所以 99% 的时间这不是问题,但是有一些方法可以更改现有的 jQuery 对象,例如,$.merge(obj.elem, $("p")).
  • 这种行为有什么原因吗?
  • 一些正在更新,而另一些则没有。 - 假设在合并示例中 $('p') 已更新。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多