วิธีเลือกคลาสทั้งหมดยกเว้นองค์ประกอบที่คลิกใน JQuery


91

ฉันมีเว็บไซต์ที่พัฒนาบน Drupal ฉันใช้โมดูลที่เรียกว่า collsiblock (โดยพื้นฐานแล้วเป็นปลั๊กอิน JQuery) เพื่อให้ได้ผลเหมือนหีบเพลง มันทำงานได้ดีกับฉัน (แม้ว่าจะอยู่ในเบต้า) แต่ฉันต้องการแก้ไขเพื่อให้เมื่อผู้ใช้คลิกที่หีบเพลงรายการหนึ่งรายการอื่น ๆ จะยุบลง

ในสถิติปัจจุบันมันทำงานในลักษณะที่เมื่อผู้ใช้คลิกที่รายการหนึ่งระบบจะตรวจสอบว่ารายการนั้นยุบหรือขยายแล้วหรือไม่และจะทำให้รายการนั้นตรงกันข้าม นั่นหมายความว่าหากผู้ใช้คลิกที่รายการหนึ่งรายการนั้นจะขยายออกและหากผู้ใช้คลิกที่รายการอื่นระบบจะขยายด้วย แต่จะไม่ยุบรายการที่คลิกก่อนหน้านี้

คุณสามารถดูรหัสด้านล่าง ฉันรู้ว่าควรเพิ่มโค้ดเพื่อยุบและยุบและขยายอย่างไร คำถามของฉันคือฉันจะเลือกรายการทั้งหมดที่มีคลาส ".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');

คำตอบ:


175

ใช้notตัวเลือก

ตัวอย่าง:

$('.collapsiblock').click(function(){
     $('.collapsiblock').not(this).each(function(){
         $(this).slideUp();
     });
     $(this).slideDown();
})

ขอบคุณมาก. ฉันได้แก้ไขปัญหาตามรหัสของคุณแล้ว ดูการอัปเดตในคำถามสำหรับรายละเอียดเพิ่มเติม
Hassan Al-Jeshi

เหมาะสำหรับการสร้างช่องทำเครื่องหมายวิทยุ!
Michael

1
โซลูชั่นที่สวยงามnot(this):)
numediaweb

วานิลลาได้โปรด! : D
xoxn-- 1'w3k4n

1
ไม่จำเป็นต้องใช้.each()- $('.collapsiblock').not(this).slideUp()ควรใช้งานได้ดี
thdoan

8

ลองวิธีนี้เป็นวิธีที่ดีกว่าเพราะถ้าคุณใช้แต่ละฟังก์ชั่นมันจะโหลดและในอนาคตเมื่อคุณมี div มากกว่าพันรายการจะใช้เวลานานในการเลื่อนขึ้นและเลื่อนลง

ตัวอย่าง:

$('.collapsiblock').click(function(){
   $('.collapsiblock').not(this).slideUp();
   $(this).slideDown();
});

2

คุณสามารถติดตามว่าองค์ประกอบใดถูกคลิกแล้วด้วยตัวจัดการการคลิก jquery ของคุณเองและฟังก์ชัน data (... ) ของ jquery จากนั้นกรองรายการ. collapsiblock ของคุณซ้ำด้วยฟังก์ชัน filter (... ) ของ jquery เพื่อรวมรายการที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.