jquery只选择第一个元素

时间:2011-09-20 20:34:51

标签: javascript jquery

我正在尝试添加按钮并单击侦听器到页面上的每个保存范围。我这样做:

$("#save").button().click(function(){
   currentSlide++;
   loadPage();
}

loadPage清除我的对话框并将下一张幻灯片加载到框中。如果我不将该代码添加到加载页面功能,则只为第一个保存按钮分配按钮并单击监听器。为什么我每次都需要分配监听器。 jQuery不应该分配按钮并单击所有#save的监听器吗?

所有幻灯片都存储在页面上。加载页面获取隐藏的内容并将其附加到对话框。

8 个答案:

答案 0 :(得分:7)

所有元素的ID必须是唯一的!!!

您已为绑定到click功能定义了ID selector。每个元素应该只有一个ID $('#save')只会绑定到一个元素(第一个)。如果要绑定到以这种方式使用的所有跨度,则为每个跨度添加一个类并使用class selector

以这种方式引用它
$('span.mysave')

答案 1 :(得分:4)

首先,不应该在页面上拥有多个共享相同 id 属性的元素。

id 属性保留为页面中单个元素的唯一标识符。

我建议您在元素中添加一个类,而不是依赖匹配的ID。

其次,如果您要向页面动态添加元素,请使用 .live('click', ...) 而不是 .click() 才能使用当前< strong>和将来的元素添加到页面中。

// note selecting class ".save" instead of id "#save"
$(".save").button().live('click', function(){
   currentSlide++;
   loadPage();
}

答案 2 :(得分:2)

#表示idid='save'仅适用于每个文档一个元素(一个id的值无法使用超过一次)。请改用class='save'并使用

$(".save").button().click(function(){

答案 3 :(得分:2)

save是一个ID,因此只能在页面上使用一次。 $('#save')映射到document.getElementById('save'),返回一个元素。

如果您要加载内容,请使用livedelegate

答案 4 :(得分:2)

#save是一个ID。 ID应该是唯一的。 jQuery假设这个并且只获得第一个元素。而不是ID,使用一个类。

考虑名称,类和ID属性,如下所示:

  • 元素可以有一个名称,但它们不必是唯一的。多个元素可以具有相同的名称
  • 元素可以是或多个类。多个元素可以在同一个类中。
  • ID是该元素的唯一ID。

答案 5 :(得分:1)

我感觉您在页面上不止一次使用了save个ID。至少,使用#save作为jQuery选择器只会选择一个元素,因为它是一个ID。

id="save"替换为class="save"并使用.save通过jQuery选择它 - 可以多次使用类,甚至可以在一个元素上使用多个类。

答案 6 :(得分:0)

与其他回复不同,我猜测,通过“第一个”保存按钮,您意味着在id="save"时使用loadPage()替换元素祖先的内容。

如果是这种情况,那么当您调用click()时jQuery绑定的原始“保存按钮”元素已被销毁并替换为jQuery不知道的新元素。只有第一次创建选择器时选择的元素才被绑定;当您更改匹配的元素集时,它不会更新。

因此,在调用loadPage()之后,您必须再次调用click()来绑定该函数(以及再次button(),因为这会更改旧元素,因此需要指示更新新的也是。)

如果您想将事件绑定到“现在或将来具有ID save的任何元素”,那么您想要的是事件委派(delegate()或其可疑表兄{{1} }):

live()

虽然这不允许您重新调用$(document.body).delegate('#save', 'click', function(){ currentSlide++; loadPage(); });

答案 7 :(得分:0)

其他人说的是真的,jQuery会返回第一个ID。但是,情况并非总是如此。运行此测试代码以查看:

<script type="text/javascript" src="/scripts/jquery-1.6.1.min.js"></script>
<script type="text/javascript">
    $(function() {
        $("div").click(function() {
            //$("#a", $("div")).remove(); // 1
            $("#a").remove();             // 2
        });
    });
</script>

<div style="border: solid 1px black;">
    <p id="a">I am the first paragraph.</p>
    <p id="a">I am the second paragraph.</p>
</div>

当你运行第2行时,它会夺走第一个#a。运行第1行将它们都删除。因此,如果您无法更改标记以使用类,则可以选择子选择。