jQuery - multiple: not selector


79

Tôi đang cố gắng nhắm mục tiêu các liên kết trên toàn trang không bắt đầu bằng '#' và không bao gồm javascript trong dòng nhưng tôi đang gặp sự cố khi tìm cách cấu trúc bộ chọn đúng cách.

Dựa trên những gì tôi đã tìm hiểu về nhiều bộ chọn, điều này sẽ hoạt động, cả hai bộ chọn hoạt động độc lập, chỉ không cùng nhau!

$('a:not([href*=javascript]), a:not([href^=#])')
.each(function(){...

Bạn đã thử toán tử 'hoặc' chưa? Giống như: $ ('a: not ([href * = "javascript | #"])')
Bas Slagter

Mã ban đầu của bạn đang làm việc tốt vì vậy hãy gửi nhiều mã và mã HTML vì vậy chúng tôi có thể xem những gì đã xảy ra ..
Bóng Wizard là tai For You

Câu trả lời:


139

Hãy thử sử dụng

$('a:not([href*=javascript]):not([href^=#])') ...

8
Mặc dù điều này hiệu quả, nhưng bạn không cần thiết phải phủ định 2 lần. Nó có thể ảnh hưởng đến hiệu suất, tôi không biết. Tôi giống như minh bạch / đơn giản, mặc dù nó có thể được dễ dàng hơn để đọc hơn$('a:not([href*=javascript],[href^=#])')
Adrien Be

Xin chào @AdrienBe Trong fiddle này: jsfiddle.net/pranavcbalan/dd6tuent/2 Tôi muốn tránh cột thứ hai và cột cuối cùng. Tôi đang cố gắng làm điều này theo lời khuyên của bạn: $ ('input: not (: last: nth-child (2))', $ tr) .each (function () {// lặp lại các đầu vào ngoại trừ đầu vào cuối cùng và thứ hai tot + = Number ($ (this) .val ()) || 0; // phân tích cú pháp và thêm giá trị, nếu NaN thì thêm 0}); nhưng nó không giúp được gì. Bất kỳ ý tưởng xin vui lòng?
3AK

@jtbandes, tôi cũng đã thử với đề xuất của bạn, nhưng không hoạt động. Tôi đang làm một số lỗi nhỏ ở đâu đó. Bạn có thể vui lòng kiểm tra jsfiddle.
3AK

@Sizzler có phải bạn đã làm cho nó hoạt động trước tiên bằng cách tránh "chỉ" một cột không?
Adrien Be

@AdrienBe vâng. Tôi có thể làm được. Vui lòng kiểm tra trò chơi này. jsfiddle.net/sizzler/xodzm0qw/3 Tôi có thể tránh cột size1 và cột tổng ở đây.
3AK

43

Bạn cũng có thể thử:

$('a').not('[href^=#],[href*=javascript]')

1
Lưu ý nhanh: đừng quên thêm dấu phẩy vào giữa các dấu ngoặc kép nếu bạn đã có bộ chọn trong các biến. Chẳng hạn như:$('a').not(selOne + ',' + selTwo + ',' + selX);
Adrien Be

Chúng ta có lẽ nên sử dụng :notthay vì .not()bằng cách này, vì lý do hiệu suất. xem stackoverflow.com/questions/8845811/…
Adrien Be

16

Như được chỉ ra trong jQuery - Nhiều bộ chọn trong một: not ()? , đây là cách chính xác để làm điều này:

$( 'a:not([href*=javascript],[href^=#])' )

Đừng quên đặt dấu ngoặc kép xung quanh dấu phẩy nếu bạn đã có bộ chọn của mình để phủ định trong các biến

var selOne = '[href*=javascript]';
var selTwo = '[href^=#]';
$('a:not(' + selOne + ',' + selTwo + ')')

Tôi thừa nhận rằng mã hơi khó hiểu nhưng nó có một lợi thế, bạn có thể làm những việc như sau:

var selOne = '[href*=javascript], [href^=#]';
var selTwo = '.anotherSelector, .andAnother, .andSoOn';
$('a:not(' + selOne + ',' + selTwo + ')')

Nó hữu ích bất cứ khi nào bạn cần nhóm các bộ chọn vì lý do nào đó. sử dụng cùng một nhóm bộ chọn ở một nơi khác trong mã.


Một ví dụ trực tiếp sử dụng cùng một kỹ thuật

$('div:not(.rose-flower,.bus-vehicle)').css('color','red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="bus-vehicle">I am a bus</div>
<div class="strawberry-fruit">I am a strawberry</div>
<div class="rose-flower">I am a rose</div>

Cũng trên http://jsfiddle.net/bmL8gz5j/


:notvs .not(): Vì lý do hiệu suất, bạn nên sử dụng :nothơn là .not(), hãy xem Sự khác biệt về hiệu suất giữa việc sử dụng bộ chọn ": not" và ".not ()"?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.