Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery检查元素是否在.prevAll()或.nextAll()的结果中_Javascript_Jquery - Fatal编程技术网

Javascript jQuery检查元素是否在.prevAll()或.nextAll()的结果中

Javascript jQuery检查元素是否在.prevAll()或.nextAll()的结果中,javascript,jquery,Javascript,Jquery,我基本上是在创建一个向导,其中web应用上的选项卡和活动应用前的选项卡将被设置为单向(绿色)表示完成,而活动应用后的选项卡将被设置为另一种方式表示未完成(灰色) 我正在寻找一种方法来检查元素是否在jQuery中的prevAll()或nextAll()命令的结果中。 我试着用$.inArray和$来解决这个问题。每个都有,但运气不太好。我猜第一个不起作用,因为结果集是一个对象,而不是数组。第二个不起作用,因为我需要将它与$中不可用的元素进行比较。我相信只要做了足够多的调整,我就能找到答案,但必须

我基本上是在创建一个向导,其中web应用上的选项卡和活动应用前的选项卡将被设置为单向(绿色)表示完成,而活动应用后的选项卡将被设置为另一种方式表示未完成(灰色)

我正在寻找一种方法来检查元素是否在jQuery中的
prevAll()
nextAll()
命令的结果中。

我试着用
$.inArray
$来解决这个问题。每个
都有,但运气不太好。我猜第一个不起作用,因为结果集是一个对象,而不是数组。第二个不起作用,因为我需要将它与
$中不可用的元素进行比较。我相信只要做了足够多的调整,我就能找到答案,但必须有更好的方法


确定一个元素是在另一个元素之前还是之后存在的最佳方法是什么?如果它使用了我一直尝试的
prevAll
nextAll
方法,如何与该结果集进行布尔匹配?

比较循环中的本机JS元素:

var set  = $('element').nextAll(),
    elem = $('#someElement'),
    in_collection = false;

set.each(function() {
    if ( this === elem.get(0) ) in_collection = true;
});
或者,您可以使用
is()
检查集合中的任何元素是否与选择器匹配:

    var set  = $('element').nextAll(),
    elem = $('#someElement'),
    in_collection = set.is(elem);

您可以使用
索引

$('element').nextAll().index(el) != -1

如果您通过了所选的徽章,您可以通过将以前的所有徽章标记为“已完成”来避免所有这一切。比如:

var setTab = function (tabBadge) {
    tabBadge.prevAll('.badge').addClass('completed').removeClass('inProgress todo');
    tabBadge.addClass('inProgress').removeClass('completed todo');
    // ignore the addClass here if the gray badges are the default style
    tabBadge.nextAll('.badge').addClass('todo').removeClass('inProgress completed');
};

请注意,此功能非常类似于,这就是
prevAll
思想的来源。

使用各种答案的组合,我做了一些工作:

/**
* Set active tab and adjust other tabs in process
*/
function setTab(tabId) {

   var $active, $content, $links = $('ul.tabs').find('a');

   // Make tab active
   $active = $($links.filter('[href="#tab'+tabId+'"]')[0] || $links[0]);
   $active.addClass('active');
   $active.find('span').addClass('badge btn-info');
   $content = $($active.attr('href'));

   // If Tab before, show as complete
   var previousTabs = $active.parent().prevAll('li').find('a');
   previousTabs.each(function(index, el) {
      $(el).removeClass('active');
      $(el).find('span').removeClass('btn-info').addClass('badge btn-success');
   });

   // If Tab after, show as incomplete
   var nextTabs = $active.parent().nextAll('li').find('a');
   nextTabs.each(function(index, el) {
      $(el).removeClass('active');
      $(el).find('span').removeClass('btn-info').removeClass('btn-success');
   });

   // Hide the remaining content
   $links.not($active).each(function () {
      $($(this).attr('href')).hide();
   });

   // Show Content
   $content.show();

}

setTab(3);

看来是DOM把我搞砸了…我需要提升一个层次。谢谢你的回答

看看
.is()
:为什么不做一些类似于
activeTabBadge.prevAll().addClass('green')?@JosephSilber很好,我不知道:)希望我们没有使用超过1.7.2的版本,但人们仍然在使用IE6/7。我认为你应该保留你的答案,我认为这是一个很好的回答alternative@jbabey,那真是个好主意。让我试试。顺便说一句,使用
$.inArray
,您可以这样做:检查它不是
-1
,或者如果元素已经在jQuery对象中(如第一个示例中),您可以使用
if(set.is(elem)){}
@Ian-没错,is()同时接受选择器和元素,这是一个更好的例子,它接受了很多东西!哈哈,不管怎样,这都取决于OP已经使用了什么,因为我的例子和你的老例子都一样,在这种情况下,
el
?主选择器是我的活动元素。在运行时,我不知道
nextAll()
返回了哪些元素,所以我怎么知道传递给
index()
的是什么呢?我想我不明白您的实际问题。我以为你已经对某个元素有了一些引用,你想检查它是否存在于
nextAll
的结果中。是的,你是对的,忽略我之前的评论。这是在
$的上下文中进行的。每个
循环都比较迭代的元素。我想出了一个更好的方法,并把它添加到我上面的问题中。
var setTab = function (tabBadge) {
    tabBadge.prevAll('.badge').addClass('completed').removeClass('inProgress todo');
    tabBadge.addClass('inProgress').removeClass('completed todo');
    // ignore the addClass here if the gray badges are the default style
    tabBadge.nextAll('.badge').addClass('todo').removeClass('inProgress completed');
};
/**
* Set active tab and adjust other tabs in process
*/
function setTab(tabId) {

   var $active, $content, $links = $('ul.tabs').find('a');

   // Make tab active
   $active = $($links.filter('[href="#tab'+tabId+'"]')[0] || $links[0]);
   $active.addClass('active');
   $active.find('span').addClass('badge btn-info');
   $content = $($active.attr('href'));

   // If Tab before, show as complete
   var previousTabs = $active.parent().prevAll('li').find('a');
   previousTabs.each(function(index, el) {
      $(el).removeClass('active');
      $(el).find('span').removeClass('btn-info').addClass('badge btn-success');
   });

   // If Tab after, show as incomplete
   var nextTabs = $active.parent().nextAll('li').find('a');
   nextTabs.each(function(index, el) {
      $(el).removeClass('active');
      $(el).find('span').removeClass('btn-info').removeClass('btn-success');
   });

   // Hide the remaining content
   $links.not($active).each(function () {
      $($(this).attr('href')).hide();
   });

   // Show Content
   $content.show();

}

setTab(3);