@Blender: Nie, to pytanie dotyczy podświetlania tekstu w elemencie, a nie textarea. Te dwie rzeczy są całkiem różne.
Tim Down
Odpowiedzi:
194
Aby użytkownik nie denerwował się, gdy cały tekst jest zaznaczany za każdym razem, gdy próbuje przesunąć kursor za pomocą myszy, należy to zrobić za pomocą focuszdarzenia, a nie clickzdarzenia. Następujące będzie wykonać zadanie i radzi sobie z problemem w Chrome, który zapobiega najprostsza wersja (czyli po prostu wywołanie textarea za select()metodę w focusobsługi zdarzeń) z pracy.
<textarea id="foo">Some text</textarea>
<scripttype="text/javascript">var textBox = document.getElementById("foo");
textBox.onfocus = function() {
textBox.select();// Work around Chrome's little problem
textBox.onmouseup = function() {// Prevent further mouseup intervention
textBox.onmouseup = null;returnfalse;
};
};</script>
Wersja jQuery:
$("#foo").focus(function() {
var $this = $(this);
$this.select();
// Work around Chrome's little problem
$this.mouseup(function() {
// Prevent further mouseup intervention
$this.unbind("mouseup");
returnfalse;
});
});
Myślę, że lepiej jest zaimplementować to za pomocą osobnego przycisku „zaznacz cały tekst”, ponieważ automatyczne zaznaczanie tekstu przy aktywnym lub kliknięciu jest naprawdę denerwujące.
@zack: Przykład jsFiddle w tej odpowiedzi działa dla mnie w Chrome. Czy to nie dla ciebie? Zgadzam się, że odpowiedź, z którą się łączysz, jest bardziej niezawodna.
Tim Down
@TimDown: masz rację, byłem trochę zbyt gorliwy - faktycznie działa poprawnie na „kliknięciu”, ale zawodzi, jeśli wchodzisz tabw obszar tekstowy - twoje drugie rozwiązanie działa w obu przypadkach :)
zack
Zmień nieznacznie powyższy kod i będzie działał jak urok .. $("#foo").mouseup(function() {$("#foo").unbind("mouseup");return false;}); musisz odwołać się do pola tekstowego bez używania thispo prostu odesłać go z pełną ścieżką .. i będzie działać ..
pratikabu
14
Lepszy sposób, z rozwiązaniem problemu zakładek i chrome oraz nowym sposobem jQuery
$("#element").on("focus keyup", function(e){
var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
if(keycode === 9 || !keycode){
// Hacemos selectvar $this = $(this);
$this.select();
// Para Chrome's que da problema
$this.on("mouseup", function() {
// Unbindeamos el mouseup
$this.off("mouseup");
returnfalse;
});
}
});
ale nie wiem, jak sprawdzić, czy tekst jest już zaznaczony, więc mogę odwrócić te dwie akcje :(
Alex
1
@Alex: Na twoim miejscu nie bałbym się tym zbytnio. Użytkownicy oczekują standardowego zachowania od obszarów tekstowych.
Tim Down
nie, ten konkretny obszar tekstu jest przeznaczony tylko do kopiowania i wklejania. cały tekst, który mam w środku, to duży zaszyfrowany ciąg, który można albo całkowicie zastąpić, albo skopiować do schowka
Alex
@Alex: Ach, racja. Możesz chcieć, aby był tylko do odczytu, dodając readonlynastępnie atrybut.
Tim Down
1
@Hollister: Nie, jest całkowicie możliwe, aby użytkownik lub skrypt wybrał zawartość w div. Prawdopodobnie myślisz o skopiowaniu do schowka, co nie jest możliwe w skrypcie bez biblioteki opartej na Flashu, takiej jak ZeroClipboard.
Odpowiedzi:
Aby użytkownik nie denerwował się, gdy cały tekst jest zaznaczany za każdym razem, gdy próbuje przesunąć kursor za pomocą myszy, należy to zrobić za pomocą
focus
zdarzenia, a nieclick
zdarzenia. Następujące będzie wykonać zadanie i radzi sobie z problemem w Chrome, który zapobiega najprostsza wersja (czyli po prostu wywołanie textarea zaselect()
metodę wfocus
obsługi zdarzeń) z pracy.jsFiddle: http://jsfiddle.net/NM62A/
Kod:
<textarea id="foo">Some text</textarea> <script type="text/javascript"> var textBox = document.getElementById("foo"); textBox.onfocus = function() { textBox.select(); // Work around Chrome's little problem textBox.onmouseup = function() { // Prevent further mouseup intervention textBox.onmouseup = null; return false; }; }; </script>
Wersja jQuery:
$("#foo").focus(function() { var $this = $(this); $this.select(); // Work around Chrome's little problem $this.mouseup(function() { // Prevent further mouseup intervention $this.unbind("mouseup"); return false; }); });
źródło
tab
w obszar tekstowy - twoje drugie rozwiązanie działa w obu przypadkach :)$("#foo").mouseup(function() {
$("#foo").unbind("mouseup");
return false;
});
musisz odwołać się do pola tekstowego bez używaniathis
po prostu odesłać go z pełną ścieżką .. i będzie działać ..Lepszy sposób, z rozwiązaniem problemu zakładek i chrome oraz nowym sposobem jQuery
$("#element").on("focus keyup", function(e){ var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode; if(keycode === 9 || !keycode){ // Hacemos select var $this = $(this); $this.select(); // Para Chrome's que da problema $this.on("mouseup", function() { // Unbindeamos el mouseup $this.off("mouseup"); return false; }); } });
źródło
Skończyło się na tym:
$('.selectAll').toggle(function() { $(this).select(); }, function() { $(this).unselect(); });
źródło
readonly
następnie atrybut.$('textarea').focus(function() { this.select(); }).mouseup(function() { return false; });
źródło
Nieco krótsza wersja jQuery:
$('your-element').focus(function(e) { e.target.select(); jQuery(e.target).one('mouseup', function(e) { e.preventDefault(); }); });
Prawidłowo obsługuje narożną obudowę Chrome. Zobacz przykład http://jsfiddle.net/Ztyx/XMkwm/ .
źródło
Zaznaczanie tekstu w elemencie (podobne do podświetlania myszą)
:)
Korzystając z zaakceptowanej odpowiedzi w tym poście, możesz wywołać funkcję w następujący sposób:
$(function() { $('#textareaId').click(function() { SelectText('#textareaId'); }); });
źródło
$(this).select()
, użyję tego, ponieważ jest mniej kodu :)