Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Firefox: перехватить соббытие при перетаскивании текста (https://javascript.ru/forum/misc/1593-firefox-perekhvatit-sobbytie-pri-peretaskivanii-teksta.html)

no_alex 20.08.2008 22:57

Firefox: перехватить соббытие при перетаскивании текста
 
Народ, подскажите реально ли каким-либо образом перехватить событие (хоть какое-нибудь), при перетаскивании текста мышкой (drag-n-drop) в момент "бросания" его в textarea или input.

Вот примеры кодов с которыми с которыми я экспериментировал:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test 1</title>
<script type="text/javascript">
<!--//--><![CDATA[//><!--
function t1()
{
    alert("onchange");
}
function t2()
{
    alert("onmouseup");
}
//--><!]]>
</script>
</head>
<body>
<form action="#" method="get" name="f0" id="f0">
<textarea rows="5" cols="180" name="q1" id="q1">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</textarea>
<textarea rows="5" cols="180" name="q2" id="q2" onchange="t1();" onmouseup="t2();"></textarea>
</form>
</body></html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test 2</title>
</head>
<body>
<form action="#" method="get" name="f0" id="f0">
<textarea rows="5" cols="180" name="q1" id="q1">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</textarea>
<textarea rows="5" cols="180" name="q2" id="q2"></textarea>
</form>

<script type="text/javascript">
<!--//--><![CDATA[//><!--
document.forms.f0.q2.onchange = function()
{
    alert("onchange");
}
document.forms.f0.q2.onmouseup =  function()
{
    alert("onmouseup");
}
//--><!]]>
</script>
</body></html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Test 3</title>
</head>
<body>
<form action="#" method="get" name="f0" id="f0">
<textarea rows="5" cols="180" name="q1" id="q1">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</textarea>
<textarea rows="5" cols="180" name="q2" id="q2"></textarea>
</form>

<script type="text/javascript">
<!--//--><![CDATA[//><!--
function t1()
{
    alert("onchange");
}
document.forms.f0.q2.addEventListener("change", t1, true);

function t2()
{
    alert("onmouseup");
}
document.forms.f0.q2.addEventListener("mouseup", t2, true);

//--><!]]>
</script>

</body></html>



Во всех случаях не происходит никакого события при перетаскивании текста из верхнего textarea в нижний.


Я попробовал все возможные события, на примере вот такого скрипта (для третьего примера):
var a = [
"change",
"focus",
"blur",
"paste",
"mousedown",
"mouseup",
//"mouseover",
//"mouseout",
//"mousemove",
"click"
];
function t(event)
{
    alert(event.type);
}
for (var i in a) {
    document.forms.f0.q2.addEventListener(a[i], t, true);
}



Единственное событие, которое здесь происходит и может мне помочь хоть косвенно решить данную проблему это "mouseover", потому что реально это событие происходит сразу после "бросания" текста. И все-же это решение очень грязное, т.к. событие "mouseover" будет генерировать множество ложных срабатываний, которые мне надо будет отсеивать.


Опера (по крайней мере 9.27 - в других я не проверял) ведет себя точно так-же. Но на данный момент меня устроит решение, которое будет работать только в FireFox 3+.


P.S. Я на всякий случай протестил с различными DOCTYPE и даже без оного - результат тот-же.

Kolyaj 20.08.2008 23:57

Можно издалека? А вам зачем?

no_alex 21.08.2008 12:16

Kolyaj,
Странный вопрос... :eek:
Мне нужно отловить момент изменения текста в textarea. Поскольку onchange в этот момент не происходит - я ищу альтернативные варианты.

Kolyaj 21.08.2008 13:30

По setTimeout отлавливать изменения, больше никак. Т.к. можно, например, и из другого окна перетащить, и CTRL-V нажать, и контекстным меню вставить.

no_alex 21.08.2008 14:56

По setTimeout это очень накладно. Сильно часто его делать - перегружать клиентский компьютер множеством холостых операций, а если редко, то это будет неэффективно.

Пока что, как я смотрю, меня "mouseover" для этих целей устраивает (в комплексе с событиями обрабатывающими клавиатуру). По крайней мере сейчас у меня еще не возникало ситуаций, которые бы остались "не отслежены".

Но может быть у кого-то есть еще варианты решения этой проблемы?

Kolyaj 21.08.2008 15:18

Как обрабатывается событие вставки текста из контекстного меню?

no_alex 21.08.2008 16:17

Kolyaj,
Резонное замечание! :cool:
Действительно это у меня не отработало, пока я не отвел мышку и не завел ее обратно на textarea.
Ща попробую новое событие, которое якобы появилось в FireFox3 "onpaste".

no_alex 21.08.2008 16:56

С onpaste - гемор!
Когда это событие происходит тект еще не вставлен. Он реально вставляется после отработки этого события. Прийдется обработку этого события через "нулевую" задержку запускать.

no_alex 21.08.2008 17:07

Kolyaj,
Цитата:

Как обрабатывается событие вставки текста из контекстного меню?
Как вариант, такое событие можно поймать еще по "onchange", но это событие произойдет уже после потери фокуса, а мне желательно обрабатывать его сразу.

Kolyaj 21.08.2008 18:02

Как к setTimeout придете, скажете :)

Главное не делать свой таймер для каждого контрола, а один на всех, тогда особых тормозов не будет. А можно вообще один таймер для подобных нужд держать. Ну и, разумеется, не запускать следующую итерацию, пока предыдущая не отработала.


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