用 jQuery 遍历 HTML
Traversing HTML with jQuery
我正在尝试使用 jQuery 遍历 html。
您可以在图像中看到 html 代码。
当我将鼠标悬停在星星上时,代码被触发
代码使用 parent().parent() 找到向上两层的跨度。然后使用 jquery "find" 方法获取所有 fa-star 元素。当我循环代码时,我希望循环打印 5 个项目。但它打印了大约 24 个。
造成这种行为的原因是什么?
这是我使用的 javascript 代码,
$(".fa-star").bind("mouseover", function(e){
var star_elements = $(this).parent().parent()
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
})
<span id="view:_id1:_id338:_id343:repeat2:0:stars">
<span id="view:_id1:_id338:_id343:repeat2:0:_id442:inlineaction" class="kompetensdlg" style="background-color: red;">
<a id="view:_id1:_id338:_id343:repeat2:0:_id442:link5" href="#" title="Grund"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField1" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link10" href="#" title="God"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField2" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link4" href="#" title="Utmärkt"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField3" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link6" href="#" title="Avancerad"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField4" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link7" href="#" title="Expert"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField5" class="fa fa-star yellowstar"></i></a><span id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField6" class="kmsg"></span></span>
</span>
如您所见,仅使用了 5 个索引。它们在您的日志中多次出现。似乎您的鼠标悬停处理程序被多次触发。您还可以通过在循环外向鼠标悬停处理程序添加日志来验证这一点。
确保您正在使用的插件(或您的代码)不会在内部触发鼠标悬停,并且悬停的元素具有您期望的大小。当然还要确保您的处理程序没有多次绑定。
编辑:
你提供的代码对我来说似乎很完美(即使少了一个分号)。看看这个fiddle。您期待不同的行为吗?
(我只能在答案中提供 fiddle 代码,所以这里又是你的代码,添加了分号。如上所述,它似乎工作正常)
$(".fa-star").bind("mouseover", function(e){
var star_elements = $(this).parent().parent();
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
});
编辑:
在我看来,您正在使用 JSF。可能是,您的脚本被 ajax 更新了多次,因此处理程序被绑定了多次?
考虑在绑定处理程序之前立即记录日志,以确保不是这种情况。
考虑到每次鼠标悬停在每个 i.fa-star
元素上都会触发代码。
因此,如果您的鼠标只是越过一颗星然后越过另一颗星,您将获得 10 个日志。如果您移动鼠标,您将获得数千。
也许mouseover事件被触发了不止一个,尝试在第一个之后添加一些延迟。
$(".fa-star").bind("mouseenter", function(e){
var star_elements = $(this).parent().parent()
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
})
我正在尝试使用 jQuery 遍历 html。
您可以在图像中看到 html 代码。 当我将鼠标悬停在星星上时,代码被触发
代码使用 parent().parent() 找到向上两层的跨度。然后使用 jquery "find" 方法获取所有 fa-star 元素。当我循环代码时,我希望循环打印 5 个项目。但它打印了大约 24 个。
造成这种行为的原因是什么?
这是我使用的 javascript 代码,
$(".fa-star").bind("mouseover", function(e){
var star_elements = $(this).parent().parent()
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
})
<span id="view:_id1:_id338:_id343:repeat2:0:stars">
<span id="view:_id1:_id338:_id343:repeat2:0:_id442:inlineaction" class="kompetensdlg" style="background-color: red;">
<a id="view:_id1:_id338:_id343:repeat2:0:_id442:link5" href="#" title="Grund"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField1" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link10" href="#" title="God"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField2" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link4" href="#" title="Utmärkt"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField3" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link6" href="#" title="Avancerad"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField4" class="fa fa-star yellowstar"></i></a><a id="view:_id1:_id338:_id343:repeat2:0:_id442:link7" href="#" title="Expert"><i id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField5" class="fa fa-star yellowstar"></i></a><span id="view:_id1:_id338:_id343:repeat2:0:_id442:computedField6" class="kmsg"></span></span>
</span>
如您所见,仅使用了 5 个索引。它们在您的日志中多次出现。似乎您的鼠标悬停处理程序被多次触发。您还可以通过在循环外向鼠标悬停处理程序添加日志来验证这一点。
确保您正在使用的插件(或您的代码)不会在内部触发鼠标悬停,并且悬停的元素具有您期望的大小。当然还要确保您的处理程序没有多次绑定。
编辑:
你提供的代码对我来说似乎很完美(即使少了一个分号)。看看这个fiddle。您期待不同的行为吗?
(我只能在答案中提供 fiddle 代码,所以这里又是你的代码,添加了分号。如上所述,它似乎工作正常)
$(".fa-star").bind("mouseover", function(e){
var star_elements = $(this).parent().parent();
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
});
编辑:
在我看来,您正在使用 JSF。可能是,您的脚本被 ajax 更新了多次,因此处理程序被绑定了多次?
考虑在绑定处理程序之前立即记录日志,以确保不是这种情况。
考虑到每次鼠标悬停在每个 i.fa-star
元素上都会触发代码。
因此,如果您的鼠标只是越过一颗星然后越过另一颗星,您将获得 10 个日志。如果您移动鼠标,您将获得数千。
也许mouseover事件被触发了不止一个,尝试在第一个之后添加一些延迟。
$(".fa-star").bind("mouseenter", function(e){
var star_elements = $(this).parent().parent()
star_elements.find(".fa-star").each(function(i,elem) {
console.log(i + $(elem).attr("class"));
})
})