【问题标题】:jQuery-class selector working unrealiably?jQuery 类选择器工作不可靠?
【发布时间】:2013-12-12 13:03:05
【问题描述】:

我正在制作一种进度条/导航元素,显示您当前所在的页面和您访问过的页面。有一个额外的功能可以改变您已经访问过的页面的颜色,但这实际上比您当前的页面“更远”(例如:您已阅读前 16 页,您导航回至后 8 页,第 9 页到第 16 页显示不同的颜色)。

如果您只是向前和向后导航而不跳过,我的实现工作正常。当您跳到一个页面时,问题就开始了。当您从那里向后导航时,即使应该应用附加类visited_pa​​ge_gt_current 也不会应用。当您一页一页地向后导航时,以前未更改颜色的页面会在某个时间点更改为正确的颜色(一次多个)。

更改类的代码:

 // remove current page and visited_page_gt_current from all the visited ones to be sure
    $(".visited_page").removeClass("current_page visited_page_gt_current");

 // add current page and visited page classes to the current element
    $("#pbar_elem"+i).addClass("current_page visited_page");

 //add visited_page_gt_current to all visited pages that are "further" than the current page
    $(".visited_page").slice(i-1, 15).addClass("visited_page_gt_current");

我做了一个简化的 JSFiddle 来演示这个问题:http://jsfiddle.net/eQY3h/30/

我尝试过的事情:

  • 使用不同的方法来获取 div 我需要更改颜色:切片、使用 :gt()-选择器、获取 ID 并使用 first() & :not('.visited_pa​​ge') 来获取第一个未访问页面之后的 .visited_pa​​ges div。

  • 以上所有方法都以类似的方式工作,但在跳过后都失败:选择器在跳过后只给出空结果,直到某个点到来,它们再次给出正确的 ID

【问题讨论】:

  • 问题出在切片方法的应用上。您只选择在 $(".visited_pa​​ges") 之前访问过的元素,然后在位置 i-1 处切片,但结果集中的元素少于 15 个..
  • 如果我错了,请纠正我,但$(".visited_page").slice(i-1, 15).addClass("visited_page_gt_current"); 只会处理具有“visited_pa​​ge”类的项目,而未点击的项目则不会

标签: javascript jquery html css dom


【解决方案1】:

问题在于.slice 的想法是错误的。它不应该应用于.visited_page,而是应用于所有页面;过滤.visited_page在切片之后。所以这会起作用:

$(".pbar_elem").slice(i - 1)
    .filter(".visited_page").addClass("visited_page_gt_current");

替代的等效版本是这样做:

$("#pbar_holder"+i).nextAll()
    .find(".visited_page").addClass("visited_page_gt_current");

【讨论】:

  • 第一个解决了我的问题,谢谢。如果您一一挑选它们,您知道为什么它会正常工作吗?
  • @PeteTNT:因为如果切片的结果也都被访问过,那么切片和过滤的顺序并不重要(两种方式的结果都一样)。但是如果切片的结果没有被全部访问,那么顺序很重要。
  • 啊,我明白了。谢谢@Jon。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多