2 Stimmen

JQuery: Selektorkette mit Attributfilter: Ergebnis bleibt nicht bestehen?

Ich reiße mir die Haare aus!! grrr...

Este scheint zur Arbeit:

//get all the foo and bar links that point to a named anchor:
$("a.foo,a.bar").filter("[href^=#]").click
(
    function()
    {
        doSomething( $(this).attr("href").substr(1) );
        return false;
    }
);

Wenn ich die Ausgabe von "$(this).attr("href").substr(1)" auf der Konsole protokolliere, sehe ich den Ankernamen ohne die Raute für alle relevanten Links. Alles gut. Aber innerhalb von doSomething() sagt typeof(), dass ich einen String habe - aber er ist leer!!! Warum?!

function doSomething(str)
{
    //log str : it's empty!!
}

Normalerweise ist es kurz nachdem ich eine Frage hier eingestellt habe zu bizarr, als dass mir jemand helfen könnte, oder ich finde meine eigene Dummheit erst später heraus. Ich hoffe, dieses Mal kann jemand helfen! :-(

\============== GELÖST \=====================

********* Es war meine eigene Dummheit **********

innerhalb von doSomething war das erste, was mein Code tat:

if(str = "") return;

(ohrfeigt die Stirn). Danke an alle, die mich dazu gebracht haben, die Sache mit anderen Augen zu sehen.

1voto

Matchu Punkte 80505

Ich kann das nicht reproduzieren. Klingt nach einem Problem mit dem doSomething Code selbst - führen Sie eine kurze Codeüberprüfung durch, um sicherzustellen, dass Sie auf die richtige Funktion verweisen und dass Sie das Argument vor der Verwendung nicht modifizieren.

0voto

bobince Punkte 512550

Anmerkung: Das ist nicht die richtige Antwort! Aber ich lasse sie hier stehen, falls sie für andere Sizzle-Benutzer von Nutzen ist.


Es handelt sich um einen Fehler in Sizzle (der von jQuery verwendeten Selektor-Bibliothek).

Das Problem ist, wenn Sie auf link.href in JavaScript erhalten Sie nicht den Text der href Attribut, erhalten Sie die aufgelöste absolute URL. Diese beginnt natürlich mit http:// でなく # .

Wenn Sie anrufen link.attr('href') jQuery erkennt den Sonderfall und wendet einen Workaround an. Wenn Sie einen Selektor verwenden, tut Sizzle das nicht. Es versucht es:

attrHandle: {
    href: function(elem){
        return elem.getAttribute("href");
    }
},

aber diese Umgehung funktioniert nicht mit IE bis Version 7, da sie die getAttribute gleich dem Abrufen der JavaScript-Eigenschaft. [Der korrekte Workaround wäre die Verwendung von getAttributeNode oder den IE ausspähen und das proprietäre getAttribute('href', 2) Verlängerung].

Die Selektor-Engine erhält also http://... für das href-Attribut und das passt natürlich nie ^=# .

Wenn Sie es selbst mit einer Filterfunktion machen, sollte es funktionieren:

$('a.foo, a.bar').filter(function() {
    return $(this).attr('href').substring(0, 1)==='#';
})...

-2voto

antpaw Punkte 14474

為す substr(0) das erste Zeichen steht auf Index 0 http://www.w3schools.com/jsref/jsref_substr.asp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X