Verfügt jQuery über eine Methode, um festzustellen, ob ein an die Funktion übergebenes Argument ein Selektor ist?
Ich mache eine Vorlage für einige jQuery-Plugins und ich muss überprüfen können, ob das übergebene Argument ein jQuery-Selektor ist. Ich möchte andere Datentypen zulassen und verschiedene Methoden basierend darauf ausführen, welcher Datentyp übergeben wird. Das Erkennen von Datentypen ist einfach, aber Selektoren sind nur eine Zeichenfolge und können auf verschiedene Arten erstellt werden.
Mein Ziel ist es, Plugins zu erstellen, die mit dem, was Sie für die Argumente übergeben, Fehler machen und fundierte Entscheidungen darüber treffen, was damit zu tun ist. Nehmen wir zum Beispiel die jQuery-UI-Plugins, in einigen Plugins, sagen wir, übergeben wir eine Callback-Funktion in der Argument Platzhalter, die für eine Zahl für eine Geschwindigkeit ist, dauert es immer noch den Callback und führt es und verwendet den Standardwert für die Geschwindigkeit. Das ist die Art von Funktionalität, die ich anstrebe, und Selektoren sind ein ziemlich einzigartiger Fall.
Hat jQuery dafür einen Regex geschrieben? Ich konnte im Code keinen finden.
Wenn nicht, schätze ich, dass ich dafür eine riesige Regex schreiben muss?
Viele Strings können technisch ein Selektor sein wie $('blah')
könnte benutzerdefinierte Elemente auswählen! Es gibt keine gute Möglichkeit, die Absicht dafür zu kennen, was mit dem an Ihre Funktion übergebenen Argument zu tun ist. Daher ist es am besten, eine gut definierte Struktur zu haben, wie Gaby es kommentiert hat.
Selektor:
%Vor%Oder
%Vor%Wird in Ihrem Code eine andere Route verwenden.
Ohne diese Technik ist das Beste, was Sie tun können, jQuery zu versuchen, Elemente basierend auf dem Selektor zu finden, überprüfen Sie mit .length
, wenn Elemente gefunden werden, wird angenommen, dass der Aufrufer einen jQuery-Selektor beabsichtigt hat. Eine andere Option könnte lediglich sein, zu dokumentieren, dass ein jQuery-Objekt übergeben werden muss, d. H .:
Dann für eine andere Route können Sie
tun %Vor%Um direkt zum Punkt zu kommen:
Ich verstehe Ihr Problem, weil ich es erlebt habe, gibt es Fälle, in denen Sie nicht die Kontrolle über den Selektor haben, um die jQuery-Funktion zu geben.
Das Problem, das nicht ausreichend beschrieben wurde, ist, dass, wenn ein Selektor nicht gültig ist, jQuery einen Fehler ausgibt (wichtig, weil hier die Antwort ist).
Beispiel mit jQuery v1.9.1:
%Vor%Es meldet sich in der Konsole die folgende Zeile an:
%Vor%Die Quelle befindet sich in Zeile 4421 der Datei jQuery.js (nicht-minimierte und unkomprimierte Version).
Anstatt also nach einer inneren Methode von jQuery zu suchen (die Dinge vereinfachen könnte, aber nicht verfügbar ist), können Sie einfach den Fehler abhören, der ausgelöst wird, um festzustellen, ob der Selektor gültig ist:
%Vor%Sie können es auch zu einem jQuery-Plugin machen:
%Vor%soll so verwendet werden:
%Vor%Beste Grüße.
BEARBEITEN:
Typvalidierung hinzugefügt: Der Selektor muss eine Zeichenfolge sein.
Wie dem auch sei, es ist eine partielle Lösung, es gibt für Selektoren, die als String-Objekte var selector = new String('#@wrong-selector#!');
definiert sind und keinen primitiven Typ haben, keine falsche Antwort zurück.
Es kann keine Regex geben, da die Selektoren erweiterbar sind und jeder beliebig viele persönliche Selektoren ( mit benutzerdefinierten Symbolen usw. ) hinzufügen kann ...
Vielleicht sollten Sie versuchen, Ihre Argumente als einzelnes Objekt mit benannten Parametern zu übergeben.
%Vor%Der jQuery-Code zum Ermitteln der Gültigkeit des Selektors hat eine Länge von etwa 108 Zeilen. Erwarten Sie daher nicht, in einer RegEx-Anweisung zu bestimmen, ob es sich um einen gültigen Selektor handelt oder nicht.
Ihre beste Wette besteht wahrscheinlich darin, zu prüfen, was jQuery als gültigen Selektor feststellt, und eine Funktion zu erstellen, die im Wesentlichen dieselbe Überprüfung durchführt, aber zurückgibt, ob sie gültig ist oder nicht.
Dies beantwortet Ihre Frage nicht, aber ich denke, dass es hilfreich sein kann. Es prüft nicht, ob ein Argument ein jQuery-Selektor ist, testet jedoch, ob der Selektor im Dokument vorhanden ist.
%Vor% Übrigens: Ich verwende $(selector).length
nicht direkt, da es 1
zurückgibt, wenn das übergebene Argument ein HTMLNode
ist.
Für bessere Interpretationszwecke:
%Vor%Tags und Links javascript jquery jquery-selectors