2010-08-04 33 views
5

Làm cách nào tôi có thể chọn và thêm lớp vào thẻ trước và tiếp theo.Bộ chọn jQuery

<div class="sub"> 
<ul> 
    <li><a href="#">a</a> 
    <ul> 
    <li><a href="#">b</a> 
     <ul> 
    <li><a href="#">c</a></li> 
    <li><a href="#">d</a></li> 
    <li><a href="#">e</a></li> 
    </ul> 
    </li> 
    <li><a href="#">f</a></li> 
    <li><a href="#">g</a></li> 
    </ul> 
    </li> 
    <li><a href="#">h</a></li> 
    <li><a href="#">i</a></li> 
    <li><a href="#">j</a></li> 
    </ul> 
</div> 

dụ: bây giờ tôi muốn thêm 2 lớp css (.prev & .next) đến các yếu tố theo đoán rằng chuột là trên các yếu tố <li><a href="#">g</a></li>, vì vậy tôi muốn thêm 2 lớp học để <li><a href="#">f</a></li><li><a href="#">h</a></li>

snip:

$(document).ready(function() { 
    $('li').css({'border-top': '1px solid green','border-bottom': '1px solid green'}); 

    $('li a').each(
     function(intIndex){  
      $(this).mouseover(function(){ 
       $(this).css({'border-top': '1px solid red','border-bottom': '1px solid red'}); 
        $(this).prev().find('li').css({'border-bottom': 'none'}); 
        $(this).next().find('li').css({'border-top': 'none'}); 
       }).mouseout(function(){ 
        $(this).css({'border-top': '1px solid green','border-bottom': '1px solid green'}); 
      }); 
     }  
    ); 
}); 

cảm ơn trước

Trả lời

1

Điều này sẽ hoạt động. Mặc dù vậy, nó lặp đi lặp lại qua toàn bộ .sub div, vì vậy nó có thể không hiệu quả nếu danh sách đó có thể thực sự dài.

$(function() { 
    $('.sub li>a').hover(
    function() { 
     var curr = this; 
     var last = ''; 
     var found = false; 
     $('.sub li>a').each(function() { 
     if(found) 
     { 
      $(this).addClass('next'); 
      return false; 
     } 
     if(this == curr) 
     { 
      found = true; 
      $(last).addClass('prev'); 
      $(this).addClass('curr'); //you may want to do this too? 
     } 
     else 
     { 
      last = this; 
     } 
     }); 
    }, 
    function() { 
     $('.sub li>a.next').removeClass('next'); 
     $('.sub li>a.prev').removeClass('prev'); 
    } 
); 
}); 
+0

Thx cho trả lời @ tất cả – john

8

Hãy thử điều này: http://jsfiddle.net/rsEaF/1/

var $a = $('.sub li > a'); 

$a.mouseenter(function() { 
    var index = $a.index(this); 
    var prev = (index - 1 >= 0) ? $a.eq(index - 1).addClass('prev') : $(); 
    var next = $a.eq(index + 1).addClass('next'); 
    $a.not(prev).not(next).removeClass('prev next'); 
});​ 

EDIT: Một sự điều chỉnh nhỏ. Trước đây, nếu bạn di chuột qua mục đầu tiên, lớp .prev sẽ được thêm vào mục cuối cùng trong danh sách. Điều này đã được sửa chữa.


EDIT: Dưới đây là một phiên bản sử dụng .each() để gán bộ xử lý. Làm theo cách này hiệu quả hơn một chút vì nó loại bỏ nhu cầu gọi $a.index(this); cho mỗi mouseenter.

Hãy thử nó ra:http://jsfiddle.net/rsEaF/3/

var $a = $('.sub li > a'); 

$a.each(function(index) { 
    $(this).mouseenter(function() { 
     var prev = (index - 1 >= 0) ? $a.eq(index - 1).addClass('prev') : $(); 
     var next = $a.eq(index + 1).addClass('next'); 
     $a.not(prev).not(next).removeClass('prev next'); 
    }); 
});​ 

EDIT: Nếu bạn gặp bất kỳ vấn đề với các lớp thích hợp đang được gỡ bỏ một cách nhất quán, thoát khỏi dòng mã này:

$a.not(prev).not(next).removeClass('prev next'); 

và tại số bắt đầu trong tổng số xử lý, thay thế nó bằng:

$a.removeClass('prev next'); 

hay:

$a.filter('.prev,.next').removeClass('prev next'); 
3

Bạn nên thực hiện một nỗ lực để tránh gắn nghe sự kiện như thế này

$('li a').each(function (el) { 
    $(el).mouseover(function (e) { 
     /* event handler code */ 
    }); 
}); 

Nó là đủ (và hiệu quả hơn) để đính kèm một người nghe như vậy:

$('li a').mouseover(function (e) { 
    /* event handler code */ 
}); 

Cũng jQuery 1.3 giới thiệu .live() (xem http://api.jquery.com/live/)

$('li a').live('mouseover', function (e) { 
    /* event handler code */ 
}); 

Bất kỳ sự kiện ném bởi một yếu tố phù hợp với bộ chọn, cho dù nó tồn tại khi .live() được gọi là hay được tạo ra sau, sẽ được truyền cho hàm cụ thể.

+0

-1 "bạn không bao giờ nên đính kèm người nghe sự kiện như thế này". Lời khuyên tệ. Khi bạn không thêm bất kỳ phần tử nào, việc sử dụng '.live()' là không cần thiết và giới thiệu tính phức tạp bổ sung (do đó thực thi chậm hơn). '.live()' ** là ** một hàm rất hữu ích, nhưng bạn không nên * luôn * sử dụng nó. – MvanGeest

+1

Ryan - Với tất cả sự tôn trọng, điều đó không nhất thiết phải đúng. Đây là một phiên bản của câu trả lời của tôi sử dụng '.each()' để gán trình xử lý, cung cấp một lợi ích duy nhất. Nó sử dụng thuộc tính 'index' của' .each() 'làm giảm sự cần thiết phải tìm ra' .index() 'của phần tử lơ lửng trên bay. Xem nó ở đây: http://jsfiddle.net/rsEaF/3/ – user113716

+0

W Tenney: Tôi hiểu ý của bạn bây giờ, và bạn chủ yếu là đúng: bạn có thể bỏ qua '.each()' và chỉ gắn vào tất cả các yếu tố cùng một lúc. Nhưng patrick dw tìm thấy một sử dụng hợp lệ để gắn bằng cách sử dụng '.each()'. Tôi lấy lại -1 sau khi bạn chỉnh sửa câu trả lời của mình. – MvanGeest