2010-03-15 5 views
3

В текстовых полях моего JSP я хочу знать, вводит ли пользователь данные или просто вставляет. Как я могу определить это с помощью javascript?Как я могу узнать, что пользователь печатает или вставляет?

EDIT: Согласно ответу Энди, я знаю, как я могу это сделать, но все же диковинки, как эти ребята писали onpaste события.

+0

@Ravi: не уверен, что я понимаю, обновление на ваш вопрос - вы имеете в виду, как это делали производители браузеров написать событие в? или что-то другое? –

+0

Да, если я хочу закодировать свое собственное событие onpaste, как мне это сделать? –

ответ

9

Safari, Chrome, Firefox и Internet Explorer поддерживают событие onpaste (не уверены в Opera). Заблокируйте событие onpaste, и вы сможете поймать всякий раз, когда что-то вставляется.


Написание этого достаточно просто. Добавьте обработчик события к введенному с помощью HTML:

<input type="text" id="myinput" onpaste="handlePaste(event);"> 

или JavaScript-DOM:

var myInput = document.getElementById("myInput"); 

if ("onpaste" in myInput) // onpaste event is supported 
{ 
    myInput.onpaste = function (e) 
    { 
     var event = e || window.event; 
     alert("User pasted"); 
    } 
} 
// Check for mutation event support instead 
else if(document.implementation.hasFeature('MutationEvents','2.0')) 
{ 
    /* You could handle the DOMAttrModified event here, checking 
     new value length vs old value length but it wouldn't be 100% reliable */ 
} 

Из того, что я прочитал, Opera не поддерживает onpaste событие. Вы можете использовать событие DOMAtrrModified, но это срабатывало бы, даже если скрипты меняют значение поля ввода, поэтому вам нужно быть осторожным с ним. К сожалению, я не знаком с событиями мутаций, поэтому я не хотел бы испортить этот ответ, написав пример, на который я не был бы уверен.

+5

Никогда не знал, что это существует, поэтому я люблю SO. –

+1

Жизнь хороша здесь –

+0

Другой анонимный нисходящий слишком грубый, чтобы оставить комментарий? –

1

Подсчитать нажатие клавиши и убедиться, что она соответствует тому, что находится в текстовом поле, в пасте не будет полного количества символов, как в текстовом поле.

+0

Это умный, но не доказательство воды. Что делать, если я вставлял после ввода, возможно, после использования backspace для начала? –

+0

Проверьте общее количество символов в текстовом поле. Паста увеличит это значение больше, чем обнаружено на вашем ключевом событии. Ключ удаления имеет код, который ищет его и уменьшает счетчик :) –

+0

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

0

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

0

Я знаю, что для textarea вы можете захватывать событие вставки, используя событие onPaste.

HTML:

<textarea id="textEditor" /> 

В JS:

var editor = document.getElementById("textEditor"); 

if (isIE /* determine this yourself */) { 
    editor.onPaste = function() { 

    } 
} else { 
    //Not IE 
    editor.onpaste = function() { 

    } 
} 

//The capitalisation of the onpaste (non-IE) and onPaste (IE) makes a difference. 

Что касается набора текста, есть onKeyDown, onKeyUp, onKeyPress события.

Надеюсь, это поможет.

Возможные SO связанные вопросIE onPaste event using javascript not HTML

Смежные вопросы