Вопрос по copy-paste, javascript, input – Javascript OnPaste

17

У меня есть это прямо сейчас:

<input type="text" placeholder="Paste text" onPaste="alert(this.value);">

Это влияет на работу, за исключением того, что возвращает пустое окно предупреждения. Я не получаю никакой ценности. Помогите?

Ваш Ответ

2   ответа
9

Это потому чтоonpaste события пожарыbefore содержимое вставляется в элемент (ссылка на сайт) так что его еще нет в то время, когда вы справляетесь с этим.

Современные браузеры поддерживают методы получения данных буфера обмена внутри обработчика событий. Ссылаться наJavaScript получает данные буфера обмена при вставке события (кросс-браузер) для попыток кросс-браузерного решения.

Кроме того, вы всегда можете обойти вашу проблему, просто запустив таймер в функции обработчика событий (должно хватить 10 мс), которая позже проверит ваше входное значение.

42

onpaste событие происходит доinput& APOS; svalue изменено Вам нужно что-то вродеsetTimeout:

<input type="text" placeholder="Paste text" onPaste="var e=this; setTimeout(function(){alert(e.value);}, 4);">​

Я храню ссылку наthis внутри глобальной переменной какthis недоступен внутри области функции тайм-аута, которая прикреплена к объекту окна.

Я использую 4 милисекунды в качестве тайм-аута, поскольку он является минимальным допустимым интервалом / тайм-аутом в спецификации HTML5.Edit: Как отмечено в комментариях, вы также можете использовать0 милисекунды как timeOut, который автоматически пересчитывается в4. jsPerf tests.

Fiddle

Вы также можете использовать вызов функции внутри вашегоonpaste передача событийthis в качестве параметра, чтобы предотвратить слишком частое смешивание HTML с JS. :)

А вот функция, более удобная для чтения и которую вы можете использовать в нескольких входах:

function pasted(element) {
    setTimeout(function(){
        alert(element.value);
    }, 0); //or 4
}​

Который можно назвать простоonPaste="pasted(this)" для любого входа.

Fiddle

@pst Оба будут интерпретироваться одновременно, я думаю, это больше предпочтение программиста. Я добавлю его при следующем редактировании. :)
Спасибо @pst, я не очень люблю встроенный JS внутри HTML, поэтому я обновил и новую функцию. знак равно
Тайм-аут может быть установлен на ноль
Я предпочитаю & quot; 0 & quot; для "события в очереди", так как тогда мне не нужно угадывать, чтоintent есть (это и делает для согласованного кода), хотя простоomitting значение также должно быть достаточно. Там будетno влияние на производительность для «пересчета».
@DmitryScriptin Да, может, но в спецификации HTML5 это будет интерпретироваться как 4, даже если вы установите его в 0 (в jsperf есть несколько тестовых случаев, чтобы доказать это), поэтому я использовал допустимое число для предотвращения повторных вычислений. :)

Похожие вопросы