Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Оставить выделение при смене фокуса (https://javascript.ru/forum/events/17280-ostavit-vydelenie-pri-smene-fokusa.html)

DZHETIGAPA 12.05.2011 22:32

Оставить выделение при смене фокуса
 
Есть текст на странице+есть textarea. Суть в том, что после выделения текста нужно ввести текст в textarea. Но, как только текстареа получает фокус, то все выделение пропадает.

можно ли как-то средствами js решить данную проблему, чтобы при смене фокуса выделение оставалось?

Маэстро 13.05.2011 21:55

Если Вам нужно "оставить выделение", чтобы затем его взять и, например, вставить в этот же textarea, то не используйте onfocus(), а используйте onmousedown()
<div id="mama">11111111111 222222222222222 333333333333333 выделите часть текста</div>
<br>
<script type="text/javascript">
var ta = document.createElement('textarea');
document.body.appendChild(ta);

//ta.onfocus = function() {...}; //-BAD
ta.onmousedown = function(){gettext();};

function gettext()
{
var selected;  
if (window.getSelection) selected = window.getSelection()
else if (document.getSelection) selected = document.getSelection()
else selected = document.selection.createRange().text
alert(selected);
};
</script>

subzey 14.05.2011 11:57

Маэстро,
А что, если подойти совсем с другой стороны и «гасить» defaultAction у mousedown на textarea, если на той нет фокуса? При переходе по Tab-то выделение сохраняется нормально.

<script type="text/javascript">
(function(){
	function handleBlur(e){
		var trigger =  e.srcElement || e.target;
		if (trigger && trigger.tagName.toLowerCase() == "textarea" && (trigger.getAttribute("lockedselection")||"").toLowerCase() == "true"){
			trigger.skipClickEvent = true;
		};
	};
	function handleFocus(e){
		var trigger =  e.srcElement || e.target;
		if (trigger && trigger.skipClickEvent && trigger.tagName.toLowerCase() == "textarea"){
			trigger.skipClickEvent = false;
		};
	};
	function handleMousedown(e){
		var trigger =  e.srcElement || e.target;
		if (trigger && trigger.skipClickEvent && trigger.tagName.toLowerCase() == "textarea"){
			trigger.skipClickEvent = false;
			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			trigger.focus();
		};
	};
	if (document.addEventListener){
		document.addEventListener("blur", handleBlur, true);
		document.addEventListener("focus", handleFocus, true);
		document.addEventListener("mousedown", handleMousedown, false);
	} else if (document.attachEvent){
		document.attachEvent("onbeforedeactivate", handleBlur);
		document.attachEvent("onbeforeactivate", handleFocus);
		document.attachEvent("onmousedown", handleMousedown);
	};
})();
</script>


<div><textarea lockedselection="true">В этой текстарии выделение будет «заблокировано»</textarea></div>
<div><textarea lockedselection="true">И в этой</textarea></div>
<div><textarea>А в этой нет</textarea></div>


Но вот беда. Кажется, IE 6—8 не сохраняет выделение на текстарии. :-?

Маэстро 14.05.2011 18:14

Цитата:

Сообщение от subzey (Сообщение 104629)
...Но вот беда. Кажется, IE 6—8 не сохраняет выделение на текстарии. :-?

Откровенно говоря, не понял, что Вы хотели показать своим фрагментом. Да, IE8 не "держит" выделение в textarea. Но как я понял - это и не нужно. Там вроде сказано, что текст выделенн на странице, а не в textarea, т.е. вне textarea. Хотя, как частный случай можно понимать и внутри textarea. Но это уже другая задача..

subzey 14.05.2011 19:42

Хм... А я понял задачу как „не сохраняется выделение в текстарии”. Ну, да ладно, у автора темы будут два кода на разные случаи жизни :)

Chile 01.02.2018 20:11

Мне тоже надобно, чтобы при потере фокуса выделение сохранялось
 
:) Помогите скриптом, пожалуйста. У меня textarea, сверху кнопки, для вставки тегов, для форматирования текста в textarea. Если выделить, а потом кликнуть по кнопке, то, выделение пропадает и текст тегами не обрамляется:(


Часовой пояс GMT +3, время: 09:45.