jquery
  • jquery-selectors
  • 2012-08-09 13 views 9 likes 
    9

    Mam następujący selektor jQuery:jQuery selektor atrybutu: [x = y] lub [x = z]

    $("a[href^='http://'],a[href^='https://']"); 
    

    Czy to możliwe, aby to zmienić tak, że nie trzeba określać a[href^= dwukrotnie?

    Na przykład coś takiego:

    $("a[href^='http://'||'https://']"); 
    

    EDIT: Moja przykładem http i https nie powinny być brane dosłownie. Mogę szukać wartości zaczynając od y i z zamiast tego.

    +2

    Może http://stackoverflow.com/questions/190253/jquery-selector-regular-expressions jest odpowiedzią. – Barmar

    Odpowiedz

    2

    Dość proste, jeśli jesteś gotów użyć drugiego wywołania funkcji:

    $('a').filter('[href^="http://"],[href^="https://"]'); 
    

    lub tokeny:

    var startsWith = ['http://', 'https://']; 
    $('a').filter(function() { 
        var i; 
        for (i = 0; i < startsWith.length; i++) { 
         if ($(this).is('[href^="' + startsWith[i] + '"]')) { 
          return true; 
         } 
        } 
        return false; 
    }); 
    

    lub niestandardowych wypowiedzi:

    $.expr[':']​​​​​​.hrefStartsWith = function (ele, i, info) { 
        var tokens; 
        tokens = info[3].split(','); 
        for (i = 0; i < tokens.length; i++) { 
         if ($(ele).is('[href^="' + tokens[i] + '"]')) { 
          return true; 
         } 
        } 
        return false; 
    }; 
    

    Która byłby używany jako:

    $('a:hrefStartsWith(http://,https://)') 
    
    +1

    "Czy można to zmienić, aby nie trzeba było dwukrotnie określać" a href^= "? Nie sądzę, żebyś dokładnie przeczytał to pytanie. –

    +0

    @ngmiceli Przy całej uczciwości, byłoby to tylko dwukrotne określenie '[href^=', ale byłoby dobrze, gdyby był sposób na zrobienie tego bez dwukrotnego określania czegokolwiek. +1, najlepsza odpowiedź do tej pory. – Curt

    0

    Fiddle: http://jsfiddle.net/X8CYQ/


    Powinieneś móc używać coś takiego:

    $.expr[':'].exturl = function(obj) { 
        return (/^https?:\/\//i).test($(obj).attr("href")); 
    } 
    

    Następnie użyj wybieraka tak:

    $("a:exturl") 
    

    HTML:

    <a href="http://www.google.com">External link #1</a><br /> 
    <a href="ftp://www.donotinclude.dk">No match link #1</a><br /> 
    <a href="?nope">No match link #2</a><br /> 
    <a href="https://www.google.dk">External link #2</a><br /> 
    <a href="http://www.google.se">External link #3</a><br /> 
    <a href="ssh://whywouldyouevendothis">No match link #3</a><br /> 
    <a href="https://www.google.co.uk">External link #4</a><br /> 
    <a href="http://www.facebook.com">External link #5</a><br /> 
    <a href="/index.html">No match link #4</a><br /> 
    <a href="https://www.facebook.com">External link #6</a><br />​ 
    

    JS:

    $.expr[':'].exturl = function(obj) { 
        return (/^https?:\/\//i).test($(obj).attr("href")); 
    } 
    $(document).ready(function() { 
        $("a:exturl").css("color", "red"); 
    });​ 
    
    +0

    Przeczytaj część edycyjną mojego pytania. http://stackoverflow.com/q/11887602/370103 – Curt

    +0

    Wtedy będziesz mógł zastąpić '/^https?: \/\ // innym' regex, na przykład '/^(x | y | z)/i' – h2ooooooo

    0

    Można po prostu zrobić

    $("a[href^='http']") 
    

    Jako href^= oznacza po prostu "zaczyna się od" chyba że masz potrzebę bycia pewnie :// jest również dołączony.

    Oto przykład z innych atrybutów i wartości:

    http://jsbin.com/owehow/2/edit

    +0

    Zobacz część edycyjną mojego pytania http://stackoverflow.com/q/11887602/370103 – Curt

    +3

    nie będzie działać dla 'How 404 works' –

    0

    Nie można tego zrobić w jQuery domyślnie .. to nie ma żadnego rodzaju „lub” warunek selektorów (z wyjątkiem przecinka, coś w rodzaju, czego chcesz uniknąć).

    Można by utworzyć własny filtr, jeśli chcesz:

    http://jsfiddle.net/yJZDg/

    Jest to bardzo przesada, chyba że trzeba robić tego typu rzeczy a lot. Przykład będzie działał tylko w przypadku dopasowania ścisłego. Trzeba by zmienić ustawienia na "zaczyna się od" lub jakiś inny rodzaj dopasowania, ale idea jest już dostępna.

    Powiązane problemy