重复的id是搞砸了jquery选择器吗?

时间:2009-06-27 23:54:00

标签: jquery asp.net-mvc css-selectors fancybox

如果我有两个div,都是id =“myDiv”

$("#myDiv").fadeOut();会淡出两个div吗?或者它只会在第一/第二次消失?或者根本没有?

如何更改淡出哪一个?

注意:我知道重复的ID是违反标准的,但我正在使用fancybox模式弹出窗口,它会在页面上复制弹出窗口内容的指定内容。如果有人知道解决这个问题(也许我使用fancybox错误),请告诉我。

7 个答案:

答案 0 :(得分:11)

元素ID应该是唯一的。拥有相同ID的多个DIV将是不正确和不可预测的,并且违背了ID的目的。如果你这样做了:

$('.myDiv').fadeOut();

如果你给他们一组myDiv和唯一的ID(或根本没有),这会使他们两个都消失。

答案 1 :(得分:7)

“注意:我知道重复的ID是违反标准的”

然后不要这样做。你已经发现了两个问题。它违反了标准,它干扰了jQuery(实际上是常规DOM)的选择机制。未来可能会有更多问题。

很可能,你 使用fancybox错误,在这种情况下我希望熟悉它的人会帮助你。或者更糟糕的是,如果脚本本身存在缺陷,则不应使用它。

答案 2 :(得分:6)

jQuery在查询ID时只匹配一个元素。 Element将返回最多一个$("#foo").get()对象的数组。有关详细信息,请参阅jQuery documentation,或亲自尝试。

$(function() {
    alert($("#foo").length);
});

答案 3 :(得分:1)

由于$('#myDiv')只会返回带有该ID的第一个div,因此您必须使用此技巧找到具有该ID的所有元素:

$('[id=myDiv]');

因此,对于您的情况,将fadeOut应用于所有这些div:

$('[id=myDiv]').fadeOut();

如果你想确保你的页面没有两次这个ID,那么你可以通过这样做删除多余的:

$('[id=myDiv]:gt(0)').remove();

答案 4 :(得分:1)

您也可以使用find()。 find将返回具有该ID的所有元素,并且您可以根据需要尝试将范围限制为特定父级$(document).find('#myDiv').fadeOut();

$('.parentElement').find('#myDiv').fadeOut();

答案 5 :(得分:0)

我遇到了同样的问题。显然,当您在要从中打开Fancybox的页面上创建内容时,它会创建原始内容的镜像div。在我的实例中,控件被包装在fancybox创建名为“fancy_div”

的div中

我能够通过使用选择器的以下格式来选择控件并获取它的值:

$('#fancy_div [id = InputText]')。val();

您的控件可能存在于Fancybox中的其他位置。最好的办法是查看viewsource,但这很棘手。

要访问视图源,请使用以下技术: 将此标记放在您的表单上: 获得价值 打开表单,单击标签打开警报窗口 确保光标位于页面内容中(找到控件并单击) 右键单击控件并选择“查看源” 存在一堆div,因此请查找包含内容的div。

希望这有帮助。

答案 6 :(得分:0)

我最近遇到了类似的问题。我有一个页面通过Ajax加载显示不同的内容。有一个按钮可以触发服务器生成PDF图像。

我最初的解决方案是使用类选择器,它工作正常但与另一个开发人员产生摩擦。链接中已经有很多类,使用类作为标识符使代码变得丑陋。所以我使用了name属性:

<a name="printButton"....

$('a[name="printButton"]').on('click',function(){....

工作得很花哨!