Обнаружение попадания в текстовую область с помощью Javascript

Все, что мне нужно, это иметь возможность определять, когда текст помещается в текстовую область. Затем я беру этот текст, делаю с ним что-то и очищаю текстовое поле. Может быть много таких текстовых областей и очень высокие требования к пользовательскому интерфейсу, поэтому опрос является последним средством.

Для IE «onfocus» делает свое дело, поскольку это событие запускается после того, как пользователь помещает что-то в текстовую область.

Для Firefox я не могу найти работающее событие. Я пробовал onmouseup и onchange .. не знаю, что еще попробовать оттуда. Я бы не хотел опрашивать текстовое поле на наличие контента. Помощь очень ценится. Спасибо.

Редактировать: для пояснения, «отброшено» означает, что пользователь выбирает текст (обычно) со страницы, но не имеет значения, где, перетаскивает его и опускает в текстовую область. Это не то же самое, что Ctrl+V или вставка правой кнопкой мыши (которая использует два разных метода обнаружения, BTW) или (очевидно) ввод текста в текстовую область. В частности, это аспект «перетаскивания» при перетаскивании. Я действительно не знаю, как еще это сформулировать.

Я чувствую, что этот вопрос был сформулирован довольно точно. Чтобы развеселить меня, предположим, что я имел в виду любые другие операции с текстовой областью, которыми вы все решили поделиться. Если бы я имел в виду «вставку», вы не думаете, что я упомянул бы что-то о вставке в заголовке или содержании моего вопроса? То же самое касается ввода в текстовое поле. Но, возможно, вы все просто недостаточно хорошо меня знаете, чтобы знать, что я печатаю то, что имею в виду, а не ошибочно печатаю то, что лишь отчасти связано с тем, что я имею в виду.


person sam    schedule 23.01.2009    source источник
comment
Сэм, не мог бы ты быть менее язвительным? Люди не обязаны тебе помогать. Я предлагаю обернуть события, которые вы упомянули, символом `, чтобы они выделялись. Ваши шансы связаны с опросом элемента.   -  person Robert K    schedule 23.01.2009
comment
Да, я буду менее язвителен. Это расстраивает, когда люди не читают вопрос.   -  person sam    schedule 23.01.2009
comment
Вопрос был бы намного яснее, если бы вы просто упомянули перетаскивание. «Капля» сама по себе может иметь любое количество значений; перетаскивание в текстовое поле — чрезвычайно необычная операция для большинства веб-пользователей.   -  person bobince    schedule 23.01.2009
comment
Лол, извини, я думал, там сказано, что ты пробовал onkeyup, мне очень жаль.   -  person Pim Jager    schedule 24.01.2009


Ответы (4)


Для Firefox это работает для меня:

window.addEventHandler("dragdrop", function(event) {alert("Drop it like it's hot!")}, true)

Однако не работает в Safari. IE не пробовал.

person Chuck    schedule 23.01.2009
comment
Спасибо! Приятно знать, что есть событие перетаскивания. Я использую опрос, потому что он не зависит от браузера и работает хорошо. - person sam; 24.01.2009

Голосование кажется единственным выходом.

Когда в браузере запускается операция Drag+Drop, кажется, что все остальное, что происходит, отменяется. Вы можете убедиться в этом, поместив события onmouseover на что-то на странице, затем запустив операцию DnD и перетащив ее. События не будут срабатывать.

Кажется, только совпадение того, как браузер внутренне обрабатывает «перетаскивание», вызывает запуск onfocus() для текстовой области в IE и Safari. Сомневаюсь, что в спецификации W3 многое определено... да это и не важно, W3 - дерьмо, к тому же никто не придерживается его полностью.

В своем вопросе я указал на роскошь очистки текстовой области после каждого использования, поэтому я чувствую, что опрос для: textarea.value.length>0 вряд ли стоит каких-либо затрат и не должен сильно влиять на производительность.

Но, увы, это конкретно связано с перетаскиванием содержимого в текстовое поле.

Понизьте мод, чтобы успокоить вашу боль.

person sam    schedule 23.01.2009
comment
Я не собираюсь ставить вам минусы, но если вы собираетесь прийти сюда и задать вопрос, сформулировать его странно, и заставить людей ПОПЫТАТЬСЯ ВАМ ПОМОЧЬ, хотя и не в том вопросе, у вас нет причин быть Дик. Серьезно. - person Paolo Bergantino; 23.01.2009
comment
Вы читали ответы? Эти люди НЕ ЧИТАЛИ ВОПРОС. Потом меня спрашивают: ты уверен, что ты это имел в виду? Падение? Потому что я знаю о keydown, keyup и прочем, что вы уже пробовали, но я не прочитал в вашем вопросе. - person sam; 23.01.2009
comment
Знаю, знаю. Но, как обычно на этом сайте, люди, которые задают вопросы, чаще всего теряются. У них были благие намерения, я понимаю, откуда исходит ваше разочарование, но нет причин вести себя с ними задницей, когда все, что они действительно хотели сделать, это помочь. - person Paolo Bergantino; 23.01.2009
comment
Ну, наверное, я слишком резок. Я бы точно не был таким придурком, если бы не магия анонимности. С другой стороны, всего 4 минуты назад Винсент Роберт предложил использовать события mouseup и keyup. - person sam; 23.01.2009
comment
Просто постарайтесь помнить, что эти люди (включая меня) пытаются вам помочь. Даже если ответ неверный, совершенно незачем быть таким неблагодарным и грубым. Надеюсь, вы помните, что задали свой следующий вопрос. - person Aron Rotteveel; 24.01.2009

Если вы хотите, чтобы ваша текстовая область реагировала на перетаскивание, вставку или ввод текста, единственным решением будет кнопка. Даже таймер, опрашивающий контент, вам не поможет.

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

Теперь для перетаскивания или вставки вы можете полагаться на события mouseup и keyup, чтобы обнаружить это.

person Vincent Robert    schedule 23.01.2009

Что ты имеешь в виду под "выпал"? Вы говорите об операции вставки (^V)? Если ответ Арона действительно правильный, вы получите keydown/keyup (и значение будет доступно для чтения в keyup).

Общий обратный вызов, который будет происходить при любом обновлении ввода, называется «onchange» — вы можете попробовать это. Обратите внимание, что при вводе он не вызывается до тех пор, пока вы не закончите и не расфокусируете ввод, поэтому, если вам нужны мгновенные обновления как при вводе, так и при других формах ввода, вам также понадобится «onkeyup».

Изменить разъяснение: IMO «onchange» следует запускать, когда перетаскивание приводит к добавлению содержимого в текстовую область; Я считаю это ошибкой браузера, которой нет (по крайней мере, в Firefox). В данном случае я могу только согласиться с тем, что голосование — это все, что у вас осталось.

person bobince    schedule 23.01.2009
comment
Спасибо за предложение onchange. Однако я уже заявил в своем вопросе, что пробовал это. Возможно, вы не стали бы спрашивать меня, что я имею в виду? если бы вы прочитали мой вопрос. - person sam; 23.01.2009
comment
Кроме того, спасибо, что научили меня тому, что ^ V — это ярлык для вставки. Иначе я бы никогда не догадался. К счастью, я родился со знанием того, что символ моркови (^) означает Ctrl. Фу. - person sam; 23.01.2009
comment
Извиняюсь за то, что был слишком резок. Это лучший из ответов на данный момент, поскольку вы заметили, что onchange срабатывает только после расфокусировки и когда вставленное значение доступно для чтения (после нажатия клавиши). - person sam; 23.01.2009