如何select除JQuery中的单击元素之外的所有类?
我有一个在Drupal上开发的网站。 我使用了一个名为collapsiblock的模块(它基本上是一个JQuery插件)来实现类似手风琴的效果。 它与我工作正常(虽然它在testing版)。 但我想修改它,以便当用户点击手风琴的一个项目时,其他项目将会折叠。
在当前的统计数据中,它的工作方式是当用户点击一个项目时,它将检查项目是否已经被折叠或展开,并且将使项目相反。 这意味着,如果用户点击一个项目,它将展开,如果他/她点击另一个项目,它也将展开,但不会折叠先前点击的项目。
你可以看到下面的代码。 我知道我应该在哪里添加代码崩溃以及如何折叠和展开。 我的问题是:如何select除了用户点击了“.collapsiblock”类的所有项目?
注意:具有“.collapsiblockCollapsed”类的项目会被折叠,如果这个类从项目中被移除,它将被展开。
// $Id: collapsiblock.js,v 1.6 2010/08/18 19:17:37 gagarine Exp $ Drupal.Collapsiblock = Drupal.Collapsiblock || {}; Drupal.behaviors.collapsiblock = function (context) { var cookieData = Drupal.Collapsiblock.getCookieData(); var slidetype = Drupal.settings.collapsiblock.slide_type; var defaultState = Drupal.settings.collapsiblock.default_state; var slidespeed = parseInt(Drupal.settings.collapsiblock.slide_speed); $('div.block:not(.collapsiblock-processed)', context).addClass('collapsiblock-processed').each(function () { var id = this.id; var titleElt = $(':header:first', this).not($('.content :header',this)); if (titleElt.size()) { titleElt = titleElt[0]; // Status values: 1 = not collapsible, 2 = collapsible and expanded, 3 = collapsible and collapsed, 4 = always collapsed var stat = Drupal.settings.collapsiblock.blocks[this.id] ? Drupal.settings.collapsiblock.blocks[this.id] : defaultState; if (stat == 1) { return; } titleElt.target = $(this).find('div.content'); $(titleElt) .addClass('collapsiblock') .click(function () { var st = Drupal.Collapsiblock.getCookieData(); if ($(this).is('.collapsiblockCollapsed')) { $(this).removeClass('collapsiblockCollapsed'); if (slidetype == 1) { $(this.target).slideDown(slidespeed); } else { $(this.target).animate({height:'show', opacity:'show'}, slidespeed); } // Don't save cookie data if the block is always collapsed. if (stat != 4) { st[id] = 1; } } else { $(this).addClass('collapsiblockCollapsed'); if (slidetype == 1) { $(this.target).slideUp(slidespeed); } else { $(this.target).animate({height:'hide', opacity:'hide'}, slidespeed); } // Don't save cookie data if the block is always collapsed. if (stat != 4) { st[id] = 0; } } // Stringify the object in JSON format for saving in the cookie. var cookieString = '{ '; var cookieParts = []; $.each(st, function (id, setting) { cookieParts[cookieParts.length] = ' "' + id + '": ' + setting; }); cookieString += cookieParts.join(', ') + ' }'; $.cookie('collapsiblock', cookieString, {path: Drupal.settings.basePath}); }); // Leave active blocks uncollapsed. If the block is expanded, do nothing. if (stat == 4 || (cookieData[id] == 0 || (stat == 3 && cookieData[id] == undefined)) && !$(this).find('a.active').size()) { $(titleElt).addClass('collapsiblockCollapsed'); $(titleElt.target).hide(); } } }); }; Drupal.Collapsiblock.getCookieData = function () { var cookieString = $.cookie('collapsiblock'); return cookieString ? Drupal.parseJson(cookieString) : {}; };
更新:
问题已经通过添加下面的代码解决了:
$('.collapsiblock').not(this).each(function(){ $(this).addClass('collapsiblockCollapsed'); $(this.target).animate({height:'hide', opacity:'hide'}, slidespeed); });
就在下面一行之上:
$(this).removeClass('collapsiblockCollapsed');
使用not
select器。
例:
$('.collapsiblock').click(function(){ $('.collapsiblock').not(this).each(function(){ $(this).slideUp(); }); $(this).slideDown(); })
你可以跟踪哪个元素已经被你自己的jquery点击处理程序和jquery的数据(…)函数点击了。 然后使用jquery的filter(…)函数过滤迭代你的.collapsiblock项目来包含你需要的项目。
尝试这个,
例:
$('.collapsiblock').click(function(){ $('.collapsiblock').not(this).slideUp(); $(this).slideDown(); });
这是更好的方法,因为如果你使用每个函数,所以它会加载,在将来你有更多的数千div,所以需要很长时间的SlideUp或SlideDown。