Modifier le CSS du texte sélectionné à l'aide de Javascript
Je suis en train de faire un script javascript bookmarklet qui va agir comme un surligneur, changer le fond du texte sélectionné sur une page web pour en jaune lorsque le bookmarklet est pressé.
J'utilise le code suivant pour obtenir le texte sélectionné, et il fonctionne très bien, retourner la chaîne correcte
function getSelText() {
var SelText = '';
if (window.getSelection) {
SelText = window.getSelection();
} else if (document.getSelection) {
SelText = document.getSelection();
} else if (document.selection) {
SelText = document.selection.createRange().text;
}
return SelText;
}
Cependant, lorsque j'ai créé une fonction similaire pour modifier le CSS du texte sélectionné à l'aide de jQuery, ce n'est pas le travail:
function highlightSelText() {
var SelText;
if (window.getSelection) {
SelText = window.getSelection();
} else if (document.getSelection) {
SelText = document.getSelection();
} else if (document.selection) {
SelText = document.selection.createRange().text;
}
$(SelText).css({'background-color' : 'yellow', 'font-weight' : 'bolder'});
}
Des idées?
Double Possible: stackoverflow.com/questions/2584301/..., stackoverflow.com/questions/2582831/... et stackoverflow.com/questions/1622629/...
OriginalL'auteur Chris Armstrong | 2010-07-11
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple pour ce faire est d'utiliser
execCommand()
, qui a une commande pour changer la couleur de fond dans tous les navigateurs modernes.Les éléments suivants doivent faire ce que vous voulez sur n'importe quel choix, y compris celles s'étendant sur plusieurs éléments. Non-IE navigateurs, elle tourne sur
designMode
, applique une couleur de fond et passe ensuitedesignMode
à nouveau.Mise à JOUR
Fixe dans IE 9.
OriginalL'auteur
Ici est un bon exemple de la façon dont cela pourrait fonctionner. Comme Zack points que vous devez être au courant de cas où la sélection s'étend sur plusieurs éléments. Ce n'est pas destiné à être utilisé comme tel, juste quelque chose pour aider à faire circuler des idées. Testé dans Chrome.
Dans mon cas, le parent de l'élément a été le contenant <p> tag. Vous faites un bon point sur les instances répétées de la chaîne, surtout si ils mettent en évidence une parole commune. Je ne suis pas sûr de savoir comment obtenir autour de ça pour l'instant mais je vais poster si je pense à quelque chose.
OriginalL'auteur
Dans Firefox, vous pouvez utiliser le
::-moz-selection
pseudo-classe.Dans Webkit, vous pouvez utiliser le
::selection
pseudo-classe.OriginalL'auteur
Regarder un petit exemple que j'ai fait à http://www.jsfiddle.net/hbwEE/3/
Il ne prend pas en compte les sélections qui s'étendent sur plusieurs éléments..
(IE vais faire, mais mess le html un peu ..)
OriginalL'auteur
Pour faire le bâton de mettre en évidence de façon permanente, je crois que vous allez avoir à envelopper la sélection dans un nouveau élément du DOM (
span
devrait faire), à laquelle vous pouvez attacher des propriétés de style. Je ne sais pas si jQuery peut le faire pour vous. Gardez à l'esprit que les sélections peuvent s'étendre les limites d'élément, donc dans le cas général, vous allez avoir à injecter un tas de nouveaux élémentsOriginalL'auteur
J'aime Tim réponse, c'est propre et rapide. Mais il arrête également les portes à toutes les interactions avec les faits saillants.
L'insertion d'éléments en ligne directement sur les textes est un mauvais choix, comme ils ont cassé le flux de texte et le désordre des choses dans des situations complexes,
Donc je suggère une sale hack que
Ce extension chrome est un exemple de comment cela peut être fait.
Il utilise l'API de cette bibliothèque pour obtenir la disposition absolue de chaque ligne sélectionnée.
OriginalL'auteur