jQuery.find()只返回第一个结果

时间:2016-02-12 00:22:24

标签: javascript jquery html knockout.js

对于很多人来说,这似乎是一个非常普遍的问题,但我还没有找到有效的解决方案。

我有一个从调用者接收DOM元素的方法。这个DOM元素恰好是一个div,我想得到一个包含div后代的所有按钮的数组,以便我可以检查它们。

我的第一站是尝试var buttons = jQuery(element).find('button');,但这只会返回它找到的第一个按钮。

但是,如果我执行类似var buttons = jQuery('.someClass').find('button');的操作,我会得到所有匹配按钮的列表。

不幸的是,使用选择器进行搜索并不是一个选项,因为我只有一个元素可供使用。

我找到的一个解决方案是:jQuery find() returns only the first matched result ?。这个人的问题几乎与我的问题相同,但我无法使解决方案起作用,也无法理解为什么jQuery没有做我期望它在这里做的事情。

其他例子遍布谷歌甚至是SO,但大多数似乎都是针对选择者的使用,而不是元素。

我对jQuery的理解是什么阻止了我的思维方式,以及如何实现我期待的目标呢?

附加信息(这可能实际上是一个淘汰赛问题吗?)

要给你一套具体的HTML看起来有点困难,因为它是通过淘汰赛动态渲染的。也就是说,这是一个适用于这种情况的片段:

<!-- ko if: Answers.length == 4 -->
<div class="col-xs-12 col-xs-offset-0 col-sm-12 col-sm-offset-0" data-bind="ButtonTextReflowWidth: '120px'">
    <!-- ko foreach: Answers -->
    <div class="answer col-xs-12 col-sm-3" data-bind="css: { selectedAnswer: $parent.SelectedScaleValueID() == ScaleValueID }">
        <button tabindex="-1" class="btn" data-bind="click: $parent.SetSelectedScaleValueID, text: Text, enable: ($parent.ParentVM.CurrentQuestion().QuestionID == $parent.QuestionID)" type="button"></button>
    </div>
    <!-- /ko -->
    <!-- ko template: {name: 'editButtonTemplate'} --><!-- /ko -->
</div>
<!-- /ko -->

data-bind="ButtonReflowWidth: '120px'"是将div作为元素传递给需要查找div中所有按钮的函数的绑定。

现在我用更新的眼光看待它,我想知道这是否真的是一个淘汰赛问题,而不是jQuery问题。是否可以在DOM知道模板已经渲染出来之前初始化自定义绑定?

anwsers observable包含至少4个项目,这意味着该按钮及其父div.answer应该呈现四次。我希望在进行jQuery查找调用时找到4个按钮。

2 个答案:

答案 0 :(得分:0)

这确实是一个淘汰赛问题,而不是jQuery问题。 首次初始化/更新时,自定义绑定不一定能访问完整的DOM。

解决方案是推迟对绑定的评估,直到DOM完全加载后为jQuery(()=> {jQuery(element).find('button');});

答案 1 :(得分:-3)

试试这个。应该工作:

var elems = document.getElementsByTagName(&#34; button&#34;); var arr = jQuery.makeArray(elems);