Javascript n如果您只关心正在单击的子单项元素,而不关心其“ID”是什么,则这些单项容器的顺序将保持静态,并且您可以安全地假定这些位置是有效ID。另一种情况是,如果在对象数组中有单个项数据,这些数据被洗牌,然后用于在用户启动的排序上构建和替换HTML,这些排序总是将HTML的顺序和其他数据跟踪依赖项联系起来
非Jquery方法(未经测试):Javascript n如果您只关心正在单击的子单项元素,而不关心其“ID”是什么,则这些单项容器的顺序将保持静态,并且您可以安全地假定这些位置是有效ID。另一种情况是,如果在对象数组中有单个项数据,这些数据被洗牌,然后用于在用户启动的排序上构建和替换HTML,这些排序总是将HTML的顺序和其他数据跟踪依赖项联系起来,javascript,html,css,Javascript,Html,Css,非Jquery方法(未经测试): 你真的可以给我加分,尤普似乎有很多。刚定了一笔赏金;-)即使在不同窗口的同一个浏览器(Chrome)中,我也做了测试,得到了非常复杂的结果(尽管测试可能不太好)。解析HTML可能需要花费大部分时间,因此每个元素都有相同数量的属性,但结果是相同的。我认为在性能方面(比如建立索引等),这真的没有什么区别。@FelixKling很有趣,谢谢你把测试放在一起;在我这边(Chrome 20和Firefox 14),看起来没有id的版本稍微(非常)快一些。我喜欢“观察到的性
你真的可以给我加分,尤普似乎有很多。刚定了一笔赏金;-)即使在不同窗口的同一个浏览器(Chrome)中,我也做了测试,得到了非常复杂的结果(尽管测试可能不太好)。解析HTML可能需要花费大部分时间,因此每个元素都有相同数量的属性,但结果是相同的。我认为在性能方面(比如建立索引等),这真的没有什么区别。@FelixKling很有趣,谢谢你把测试放在一起;在我这边(Chrome 20和Firefox 14),看起来没有id的版本稍微(非常)快一些。我喜欢“观察到的性能”这个词,我完全是在偷它。投票结果如下:(回答得很好,谢谢。我希望我能得到一些Chrome或Mozilla开发人员的支持,并就这如何不会影响现代浏览器的性能发表一个冗长的技术性回答,但我想这不会发生:-)@Mahn:嗯,每个人中至少有一个人会偶尔来看看。如果你运气好的话……根据页面的排列方式/每个项目有多少html内容以及其他因素,为数百个项目循环和分配ID在回流页面上可能会变得非常难看。@Erik Reppen:听起来很恶心。我现在已经从我的答案中删除了这一点。jQuery代码在性能方面是非常有问题的。如果该类中有数百个元素,那么应该使用。这与节省id属性以节省带宽有些矛盾,然后包括4000行库作为替代。可能按id选择它们仍然比使用jQuery的eq更快,不是吗?@Mahn-是的,但是再次,我认为性能的提高不足以证明需要花费时间来添加每个
id
属性。另外,删除id
属性会减少文件大小。我几乎同意你写的所有内容,你有我的投票权,但我必须诚实地说,我特别想知道如果在我发布问题时在服务器端生成id,浏览器会如何反应,其中@BoltClock更直接地涵盖了这一点。但我也会接受你的回答,我可以接受两次,没问题。我们感谢你的支持。我已经学会接受做TLDR女仆而不是新娘。
<div id="stuffContainer" class="item-container">
<div class="single-item"></div>
<div class="single-item"></div>
<div class="single-item"></div>
<div class="single-item"></div>
<div class="single-item"></div>
<div class="single-item"></div>
[...]
</div>
$('.single-item').eq(3);
$('.single-item').click(function()
{
var yourClickedDiv = $(this);
// execute the rest of your code here
});
var myContainer = document.getElementById('stuffContainer');
//ignore following indent goof
myContainer.addEventListener('click', function(e){
var
singleItem,
elementOriginallyClicked = singleItem = e.target,
stuffContainer = this;
//anything clicked inside myContainer will trigger a click event on myContainer
//the original element clicked is e.target
//google 'event bubbling javascript' or 'event delegation javascript' for more info
//climb parentNodes until we get to a single-item node
//unless it's already single-item that was originally clicked
while( !singleItem.className.match(/[=\s'"]single-item[\s'"]/g) ){
singleItem = singleItem.parentNode;
}
//You now have a reference to the element you care about
//If you want the index:
//Get the singleItem's parent's childNodes collection and convert to array
//then use indexOf (MDN has normalizer for IE<=8) to get the index of the single-item
var childArray = Array.prototype.slice.apply(stuffContainer.childNodes,[0]),
thisIndex = childArray.indexOf(singleItem);
doSomethingWithIndex(thisIndex);
//or
//doSomethingWithDOMObject(singleItem);
} );
$('#someContainer').on('click','.single-item', function(){
var $_singleItem = $(this), //jq handles the bubble to the interesting node for you
thisIndex = $_singleItem.index(); //also getting index relative to parent
doSomethingWithIndex(thisIndex);
//or
//doSomethingWithJQObject($_thisItem);
} );