12
votes

Déterminez si une chaîne est un sélecteur de jQuery valide?

JQuery a-t-il une méthode pour déterminer si un argument transmis à la fonction est un sélecteur?

Je fais un modèle pour certains plugins JQuery et je dois pouvoir vérifier si l'argument est passé est un sélecteur de jQuery. Je souhaite permettre d'autres types de données et effectuer des méthodes différentes en fonction du type de données transmis. La détection des types de données est facile, mais les sélecteurs ne sont qu'une chaîne et peuvent être construits sont de nombreuses façons différentes.

Mon objectif est de créer des plugins qui pardonnent avec ce que vous passez pour les arguments et effectue des décisions éduquées sur ce qu'il faut faire avec cela. Prenez les plug-ins de l'interface utilisateur JQuery par exemple, dans certains plugins, disons que nous passons une fonction de rappel dans le détenteur de places d'argument qui correspond à un numéro pour une vitesse, elle prend toujours le rappel et l'exécute et utilise la valeur par défaut de vitesse. C'est le genre de fonctionnalité que je vais et que les sélecteurs sont un cas assez unique.

a jQuery écrit une regex pour cela? Je ne pouvais pas en trouver un dans le code.

Sinon, je suppose que je devrais devoir écrire une énorme regex pour cela?


3 commentaires

Pourquoi ne pas réussir les objets JQuery? $ ('sélecteur') devrait être assez facile pour vérifier ...


@jcinacio: Merci, mais je vérifie en fait cela aussi. Mon objectif est de créer des arguments qui sont plutôt gratuits avec ce que vous passez.


$ ('sélecteur') ne convient pas à cet effet, car il jette une erreur si elle n'est pas valide.


5 Réponses :


4
votes

Il ne peut y avoir de regex pour cela, car les sélecteurs sont extensibles et que tout le monde pourrait ajouter n'importe quel nombre de sélecteurs personnels ( avec des symboles définis personnalisés, etc. ) ...

Peut-être que vous devriez essayer de transmettre vos arguments comme un seul objet avec des paramètres nommés. xxx


0 commentaires

4
votes

Le code JQuery pour déterminer le sélecteur est valide est d'environ 108 lignes de long, donc ne vous attendez pas à déterminer s'il s'agit d'un sélecteur valide ou non d'une instruction REGEX.

Votre meilleur pari est probablement de regarder ce que JQuery détermine être un sélecteur valide et faire une fonction qui vérifie essentiellement la même chose, mais renvoie si elle est valide ou non.

https://github.com/jquery/ jquery / blob / maître / src / core.js # L80-188


0 commentaires

4
votes

Beaucoup de chaînes peuvent techniquement être un sélecteur comme $ ('bla') pourrait sélectionner des éléments personnalisés! Il n'y a pas de bonne façon de connaître l'intention de quoi faire avec l'argument transmis à votre fonction, il est donc préférable d'avoir une structure bien définie comme Gaby a commenté.

sélecteur: < / p> xxx

ou xxx

prendra un itinéraire différent de votre code.

sans cette technique Il est préférable que vous puissiez faire est simplement de tenter de JQuery de trouver des éléments basés sur le sélecteur, de vérifier avec .length si des éléments sont trouvés, supposons que l'appelant a indiqué un sélecteur de jQuery. Une autre option pourrait être simplement de documenter qu'un objet JQuery doit être transmis, c'est-à-dire: xxx

puis pour un itinéraire différent, vous pouvez faire xxx


3 commentaires

"Tentative pour JQuery de trouver des éléments basés sur le sélecteur, vérifiez avec la longueur de la longueur. Si des éléments sont trouvés, supposons alors que l'appelant a indiqué un sélecteur de jQuery" ---- C'est assez bon.


@UPHELIX n'a ​​pas demandé de vérifier si un sélecteur correspond à quelque chose ou quel rôle a ce qu'il sélectionne, mais s'il est valide en fonction des règles de jQuery pour une syntaxe sélecteur.


@UPHELIX "Tentative pour JQuery de trouver des éléments basés sur le sélecteur, vérifiez avec la longueur de la longueur. Si des éléments sont trouvés, supposons que l'appelant a indiqué un sélecteur de jQuery" - mauvaise idée, il y a des cordes que lorsqu'il est utilisé comme utilisé comme sélectionnée de jackery Selectors lancera une exception, juste essayer quelque chose avec "("



0
votes

Cela ne répond pas à votre question, mais je pense que cela peut être utile. Il vérifie non si un argument est un sélecteur de jQuery, mais il teste si le sélecteur existe dans le document.

$('foo').length // 0
$('.foo').length // 0
$('#foo').length // 0
$('<foo>').length // 1
$(document).find('foo').length // 0
$(document).find('.foo').length // 0
$(document).find('#foo').length // 0
$(document).find('<foo>').length // 0


1 commentaires

Utile en effet :) J'aimerais juste ajouter que cela lancera une erreur si la chaîne d'entrée n'est pas un sélecteur. Et pour gagner le concours Nitpicking, je retournerais un booléen approprié au lieu de la longueur. Comme ceci: fonction SelectOrxists (sélecteur) {ESSAY {RETURN $ (document) .Find (sélecteur) .Length! == 0; } attraper (e) {retour faux; }} ... et n'aimez-vous pas simplement la mise en forme de commentaire unique;)



30
votes

Aller directement au point:

  1. Non, JQuery n'a aucune méthode pour vérifier si un sélecteur est valide. li>
  2. jQuery a beaucoup de regex 'pour cela, c'est pourquoi vous ne pouvez pas trouver un em> dans le code. LI>
  3. Vous n'avez pas à écrire une énorme regex pour cela, la réponse est plus simple comme indiqué ci-dessous. Li> ol>

    Je comprends votre problème parce que je l'ai expérimenté, il y a des cas dans lesquels vous ne contrôlez pas le sélecteur à donner à la fonction JQuery. P>

    Le problème n'est pas assez décrit. que si un sélecteur n'est pas valide jQuery jette une erreur forte> (il est important car voici la réponse). P>

    Exemple Utilisation de jQuery V1.9.1: P>

    alert($.isValidSelector('#what?!?'));
    


5 commentaires

Merci pour l'explication directe!


Malheureusement, le test n'est pas une balle-preuve. Vous pouvez transmettre une chaîne HTML RAW à JQuery et la transformera en un nœud et ne jetez pas une exception. Donc, isvalidselector ("

") retourne true, même s'il n'est pas un sélecteur valide.


Pendant que j'y suis à cela, la fonction ne parvient pas à vérifier si l'entrée est une chaîne - transmettez-la un nœud ou un objet JQuery, et isvalidselector ($ (".foo")) retourne vrai.


@hashchange Vous avez raison, mais j'ai supposé que la tâche est de ne pas vérifier si le sélecteur donné correspond à quelque chose dans le document (que JQuery effectue déjà dans la propriété .length ), mais uniquement en vérifiant si le sélecteur est officiellement acceptable.


@HASHCHANGE Merci à votre Veverservation, j'ai amélioré la fonction en vérifiant le type du sélecteur.