2010-06-08 40 views
3

我想在一个页面中插入多行滑块。我有一块代码,我想重复使用,但它会插入2个DIV与id=slider ...jQuery:重命名重复的id

是否有可能找到第二个元素id=slider并重命名为id=slider01

BR。安德斯

+0

是否'code'的一个块表示HTML或JavaScript? – jAndy 2010-06-08 11:03:47

回答

5

尝试

$('div[id="slider"]:eq(1)').attr("id", "slider01"); 

http://jsfiddle.net/rYyA7/ - 在IE6/8,火狐,Safari,Chrome和Opera测试。

+0

也正在提出这个建议。 +1 – Boldewyn 2010-06-08 11:02:11

+0

这会假设他已经在DOM中插入了一个具有相同ID的元素,这将是非常糟糕的业力。 – jAndy 2010-06-08 11:02:47

+0

你测试过了吗?我在想,jQuery/Sizzle是否不会优化属性选择器而偏向'getElementById'(在某些实现中*可能会更快)。我会犹豫依靠它不这样做...... – 2010-06-08 11:03:26

5

你可以通过在之前指定一个新的id来做到这一点,你可以将第二个滑块添加到页面中。你还没有显示你如何做的代码,所以很难就如何做到这一点提供建议,但它是最好的。

当文档暂时无效时,可能会找到第二个滑块,但可能会很尴尬。这又取决于你的代码。如果你已经有了一个包含第二个滑块的jQuery对象的引用,作为你如何创建它的副产品,这很容易(只需使用yourvar[1].id = newavlue)。如果没有,你可能是最好关闭的其他东西滑块有共同点的基础上进行搜索,好比说,如果他们俩都div s的类slider

var sliders, ids; 
sliders = $("div.slider"); 
if (sliders.length > 1) { 
    ids = {}; 
    sliders.each(function() { 
     if (ids["x" + this.id]) { 
      // This ID has already been used, grab a new one 
      this.id = 'newslider' + new Date().getTime(); 
     } 
     else { 
      // This ID hasn't been used yet; flag that we're using it 
      ids["x" + this.id] = true; 
     } 
    }); 
} 

该代码遍历所有的匹配元素并确保没有重复的ID(有几个注意事项,主要是没有以“newsliderNNNNNNNNNN”形式存在的ID,其中Ns是由new Date().getTime()返回的数字)。 (关于在ids对象的属性名称中的“x”前缀只是为了防御与预先存在的性能意外碰撞,像toString。嘿,这是一个有效的id,有人可能使用它。:-))

Andy E's head's answer提供了一个更简短的方法,它可能是一种方法,但它假定基于id属性的搜索不会在某个阶段进行优化,从而停止查找多个元素。这个假设可能是有效的,但依靠选择器实现不会改变下线并在我的代码中引入问题,我会感到不舒服。 (在过去几年中,选择器的工作很多,当前的jQuery引擎Sizzle是全新的。)但是,它可能没问题。

+0

Lol我的回答突然变得相当有争议:-)你提出了一个有效的观点,虽然我认为这是有道理的,属性等于选择器的工作和他们一样,我会把钱放在事实上,他们没有优化像这样的原因。许多其他选择器都进行了优化,它会让你想知道为什么他们忽略了属性equals选择器。 – 2010-06-08 11:15:39

+0

进一步的说法是,在许多情况下,如果可用,Sizzle依赖浏览器的'querySelectorAll'实现。这在将来也可能仍然如此。顺便说一句:+1)一个好的答案:-) – 2010-06-08 11:17:16

+1

@Andy E的头:是的,这样做可能很好,而且它非常直接,而且很短(短〜=较少代码来维护〜=好)。我刚刚被这样的事情叮叮当当,这让我非常谨慎。 – 2010-06-08 11:23:39

4

我会做这样的:

$('div[id="slider"]').not(':eq(0)').each(function(i){ //selects all divs with the id slider but not the first one 
    var $that = $(this), 
    newID = $that.attr('id') + (i + 1) // adds a incising number to the ID's 

    $that.attr('id', newID) // sets the new id 
}) 

检查这里的例子: http://jsfiddle.net/nuW34/

+0

+1受到启发:-) – 2010-06-08 11:47:42

+0

+1为了成为我的灵感,哦,安迪你愿意嫁给我:-P – meo 2010-06-08 12:56:53

+0

超级!这真是一些很棒的代码! – Tillebeck 2010-06-09 12:08:04