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