J’ai l’obligation de désactiver la sélection sur une page Web pour tout sauf les éléments input [type = text].
Cette réponse acceptée à une question similaire fait presque l’affaire, mais elle ne désactive pas la sélection des conteneurs contenant des éléments input [type = text]. Par conséquent, l’utilisateur peut toujours sélectionner en commençant une opération de glisser dans l’un de ces conteneurs.
Est-ce même possible, c’est-à-dire qu’il est possible de désactiver la sélection d’un élément conteneur tout en l’activant pour les éléments enfants (en particulier, entrée enfant = éléments de texte).
@Pointy, “Pourquoi ne pas simplement supprimer ce premier appel .not ()?”
- Animer HTML Text Change jQuery
- Comment redimensionner div en redimensionnant le navigateur
- jQuery Basculer Afficher / Masquer avec plusieurs ID DIV
- Enregistrement d’une image téléchargée sur localStorage (extension chrome)
- Fractionner le code HTML dans les divs avec Javascript / JQuery en fonction des balises HR
En prenant le premier appel .not
, donnera:
$('body').not('input').disableSelection();
qui, comme indiqué dans la question liée, désactivera toujours tout sur la page, y compris les éléments input [type = text].
@David Thomas, “Avez-vous une démonstration en direct …”
Je n’ai pas de démo en direct, mais c’est assez sortingvial. Par exemple, un div avec un peu de remplissage qui contient un élément input [type = text]. Le résultat est:
Avec $('body').not('input').disableSelection();
selectiopn est désactivé pour toute la page, y compris les éléments d’entrée.
Avec $('body *').not(':has(input)').not('input').disableSelection();
la sélection est désactivée pour tous les éléments ne contenant pas d’élément d’entrée. Mais il est possible de sélectionner la page entière en lançant une opération de glisser à partir d’un conteneur contenant un élément d’entrée.
Eh bien, attachez vos bretelles et préparez-vous à un sale bidouille .
Je ne pense pas que ce soit une bonne façon de faire les choses. Je voulais simplement relever le défi d’obtenir la fonctionnalité souhaitée du PO. Si quelqu’un d’autre peut faire en sorte que cela fonctionne de manière plus propre, merci de le poster.
Après avoir joué avec la fonction disableSelection()
, il semblait que si un élément parent avait été désactivé, tous ses enfants seraient également non sélectionnables ( corrigez-moi si je me trompe ). J’ai donc décidé que si vous vouliez que tout soit non sélectionnable, à l’exception des petites pièces, vous pouvez mettre tout votre balisage dans un
non sélectionnable et utiliser le positionnement absolu pour placer des clones sélectionnables de vos balises (ou toute balise, vraiment). au-dessus des non sélectionnables. Ces clones résideraient dans une seconde
qui n’était pas désactivée.
Voici un exemple de cette idée: http://jsfiddle.net/pnCxE/2/ .
Ainsi, pendant que vous pouvez contourner les limitations sélectionnables, il peut être préférable d’accepter simplement la sélection du conteneur. Je réfléchirais longuement avant de mettre ce code dans un environnement de production.
J’ai trouvé une solution qui semble faire ce que je veux et je serais intéressé par les commentaires / améliorations des experts de jquery / javascript.
$(document).ready(function () { $("body").disableSelection(); $("body").delegate('input[type=text],textarea', "focus", function () { $("body").enableSelection(); }); $("body").delegate("input[type=text],textarea", "blur", function () { $("body").disableSelection(); }); });
Lorsqu’une zone de texte (input [type = text] ou textarea) a le focus, le fait de faire glisser avec la souris ne sélectionne que le texte dans la zone de texte. Par conséquent, il est “sûr” d’activer la sélection pour toute la page lorsqu’une zone de texte a le focus (entre les événements de focus et de flou).
Il y a un retard notable lors de la tabulation entre les zones de texte sur IE8 / 9. Ce n’est pas perceptible sur Google Chrome, qui a, je crois, un moteur javascript plus rapide. Donc, je peux vivre avec la baisse de performance, d’autant plus que IE10 va avoir un moteur javascript plus rapide.
METTRE À JOUR
Lorsque vous utilisez ASP.NET UpdatePanel
, vous devez le modifier pour désactiver la sélection après chaque publication partielle:
Sys.Application.add_load(function () { $("body").disableSelection(); });
Essayez ceci, même si c’est pareil avec ce que vous utilisez déjà:
$('* :not(input)').disableSelection();
Je ne comprends pas pourquoi vous devez utiliser un élément de body
entier et ne pas le réduire aux nœuds de texte (p, h [..], ul, ol, etc.)
Et je suis d’accord avec @David Thomas – il serait plus facile de voir une page de test sur laquelle vous travaillez.