sélecteur jQuery valeur échapper
J'ai une liste déroulante qui contient une série d'options:
<select id=SomeDropdown>
<option value="a'b]<p>">a'b]<p></option>
<option value="easy">easy</option>
<select>
Avis que la valeur de l'option/texte contient des trucs méchants:
- guillemets simples
- crochet de fermeture
- échappé html
J'ai besoin de retirer de l'a'b]<p> option mais j'ai pas de chance écrit le sélecteur. Ni:
$("#SomeDropdown >option[value='a''b]<p>']");
ou
$("#SomeDropdown >option[value='a\'b]<p>']");
sont de retour l'option.
Quelle est la bonne façon d'échapper à des valeurs lors de l'utilisation de la "valeur=" sélecteur?
- L'utilisateur peut entrer quoi que ce soit. Pas probable qu'ils seraient... mais si ils le font alors l'application doit gérer l'entrée correctement.
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que vous le pouvez. Il devrait être:
Et cela ne fonctionne pas comme un sélecteur CSS (dans les navigateurs modernes). Exprimé dans un JavaScript littéral de chaîne, vous serait naturellement besoin d'une autre ronde de s'échapper:
Mais cela ne fonctionne pas en jQuery, car son sélecteur de parser n'est pas complètement conforme aux normes. Il utilise cette expression pour analyser les
value
le cadre d'un[attr=value]
condition:\3 étant le groupe contenant de l'ouverture des guillemets, qui bizarrement sont autorisés à être ouverture de plusieurs citations, ou pas de l'ouverture des guillemets à tous. L' .*? alors peut analyser n'importe quel caractère, y compris des citations jusqu'à ce qu'il frappe le premier ‘]’ caractère, se terminant le match. Il n'y a aucune disposition pour la barre oblique inverse d'échappement des CSS de caractères spéciaux, de sorte que vous ne peut pas correspondre à une chaîne de caractères arbitraire de la valeur en jQuery.
(Une fois de plus, la regex analyseurs de perdre.)
Mais la bonne nouvelle est que vous n'avez pas à compter sur les sélecteurs jQuery; il y a de très bonnes DOM méthodes que vous pouvez utiliser, en particulier HTMLSelectElement.options:
C'est de nombreuses fois plus simple et plus rapide que de demander à jQuery laborieusement analyser et de mettre en œuvre de votre sélection, et vous pouvez utiliser n'importe quelle chaîne de valeur vous le souhaitez sans avoir à vous soucier de l'échappement des caractères spéciaux.
J'utilise cette fonction pour échapper à des sélecteurs jquery. Il s'échappe en principe, tout était discutable, mais peut être trop agressif.
str.replace(/([ !"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~])/g,'\\\\$1')
.?
:return str.replace(/([ #;?&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1');
%
signe doit également être échappé.utilisation
.filter()
avec une fonction personnalisée.txt
devrait contenir votre méchant chaîne, ou vous pouvez simplement remplacerindexOf
avec toute autre fonction que vous choisissez.Je trouve que vous pouvez utiliser \ \ pour échapper à des sélecteurs. Pensez à cela comme un \ pour le regex et un à s'échapper de la regex.
Exemple:
Si vous essayez de faire de l'échappement de la programmation, vous avez seulement besoin d'un ensemble de barres obliques. Cela ne fonctionne pas:
Mais ce sera:
Et il en sera de ce:
Vous pouvez l'utiliser javascript pour construire correctement échappé sélecteur:
Voici un JS Fiddle qui montre une partie de ce comportement étrange:
http://jsfiddle.net/dH3cV/
Le problème est dû à des entités HTML; " la
<
" est vu par le navigateur comme "<
".La même chose pourrait être dite pour l'exemple fourni par bobince; veuillez noter que le code suivant ne fonctionne pas avec jQuery 1.32 sur Win + FF3:
Toutefois, la modification de l'entité à un littéral sera en effet de trouver la valeur souhaitée:
Bien sûr, il y a un problème ici, que la valeur que vous spécifiez est pas la valeur exacte que vous cherchez. Cela peut également être corrigée avec l'ajout d'une fonction d'assistance:
Tous ensemble: les
Tout maintenant, la valeur d'entrée que vous êtes à la recherche d'correspond exactement à la valeur de l'élément select.
Cela peut aussi être écrite à l'aide de méthodes jQuery:
Et puis, finalement, comme un plugin, car ils sont si faciles à faire:
de jQuery forum a une belle solution pour cela:
https://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/
Cette version légèrement modifiée de ce qu'ils suggèrent est également nullsafe.
En toute sécurité échapper CSS chaîne n'est pas facile et ne peut pas être fait avec une simple regex.
Vous pouvez utiliser
CSS.escape()
.ce n'est pas supportée par tous les navigateurs, mais un polyfill existent.