Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.08.2008, 22:57
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

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 и даже без оного - результат тот-же.
Ответить с цитированием
  #2 (permalink)  
Старый 20.08.2008, 23:57
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Можно издалека? А вам зачем?
Ответить с цитированием
  #3 (permalink)  
Старый 21.08.2008, 12:16
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Kolyaj,
Странный вопрос... :eek:
Мне нужно отловить момент изменения текста в textarea. Поскольку onchange в этот момент не происходит - я ищу альтернативные варианты.
Ответить с цитированием
  #4 (permalink)  
Старый 21.08.2008, 13:30
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

По setTimeout отлавливать изменения, больше никак. Т.к. можно, например, и из другого окна перетащить, и CTRL-V нажать, и контекстным меню вставить.
Ответить с цитированием
  #5 (permalink)  
Старый 21.08.2008, 14:56
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

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

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

Но может быть у кого-то есть еще варианты решения этой проблемы?
Ответить с цитированием
  #6 (permalink)  
Старый 21.08.2008, 15:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Как обрабатывается событие вставки текста из контекстного меню?
Ответить с цитированием
  #7 (permalink)  
Старый 21.08.2008, 16:17
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Kolyaj,
Резонное замечание! :cool:
Действительно это у меня не отработало, пока я не отвел мышку и не завел ее обратно на textarea.
Ща попробую новое событие, которое якобы появилось в FireFox3 "onpaste".
Ответить с цитированием
  #8 (permalink)  
Старый 21.08.2008, 16:56
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

С onpaste - гемор!
Когда это событие происходит тект еще не вставлен. Он реально вставляется после отработки этого события. Прийдется обработку этого события через "нулевую" задержку запускать.
Ответить с цитированием
  #9 (permalink)  
Старый 21.08.2008, 17:07
Аспирант
Отправить личное сообщение для no_alex Посмотреть профиль Найти все сообщения от no_alex
 
Регистрация: 20.08.2008
Сообщений: 56

Kolyaj,
Цитата:
Как обрабатывается событие вставки текста из контекстного меню?
Как вариант, такое событие можно поймать еще по "onchange", но это событие произойдет уже после потери фокуса, а мне желательно обрабатывать его сразу.
Ответить с цитированием
  #10 (permalink)  
Старый 21.08.2008, 18:02
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите как убрать часть текста при нажатии на кномпу или гиперссылку. potkin Общие вопросы Javascript 6 10.10.2008 07:55
FireFox: onmouseover не работает при зажатой кнопке мыши no. Общие вопросы Javascript 4 19.08.2008 13:43
вывод нужного текста в текстовом поле при нажатии на кнопку! fifo4ka Общие вопросы Javascript 7 06.05.2008 13:36