Событие onpaste / paste не запускается для таблицы при первых нескольких попытках

Google Chrome - это приложение для внутреннего использования, которое не требует кросс-браузерной совместимости

Смотрите http://jsfiddle.net/spetnik/vpcyt4yv/

У меня есть таблица, в которую я пытаюсь разрешить вставку данных. Я сделал отдельные ячейки по выбору:

<td tabindex="0">

Первоначально я пытался добавить событие onpaste к самим элементам TD, но это не сработало вообще. Поэтому вместо этого я добавил событие в элемент таблицы и просто проверил, является ли сфокусированный элемент TD, а затем вставил данные в этот элемент:

document.getElementById("tblData").onpaste = function(evt){
    if(document.querySelector(":focus").tagName.toLowerCase() != "td"){
        return;
    }

    document.querySelector(":focus").innerText = evt.clipboardData.getData("text/plain");
};

Хотя это, по сути, работает, событие обычно не срабатывает с первой попытки. Кажется, мне нужно либо: а) щелкнуть по таблице случайное число раз (каждый раз отличается) или б) изменить фокус на другое окно, а затем снова вернуться, прежде чем событие сработает. В jsFiddle я добавил вызов console.log() в самом начале события, чтобы я мог точно видеть, когда событие запускается на панели отладки.

Смотрите выше jsFiddle или просто результат на https://jsfiddle.net/spetnik/vpcyt4yv/embedded/result/

1 ответ

Решение

Вот это да. Похоже, виновником является -webkit-user-select/user-select CSS! Я обнаружил это, когда заметил, что вставка будет разрешена только после первоначального щелчка и перетаскивания мыши над ячейкой (что объясняет случайный щелчок - только после того, как я нажал, пока моя мышь не переместилась в середине щелчка, это сработало). Я удалил этот CSS и теперь он работает. Конечно, теперь мне нужно найти обходной путь для предотвращения выбора, но, по крайней мере, я больше не в тупике.

Редактировать: Кажется, что на обычном элементе (например, DIV с onpaste, установленным на сам элемент), onpaste вообще не работает, когда -webkit-user-select имеет значение none. Я отправил сообщение об ошибке здесь

РЕДАКТИРОВАТЬ 2: Мне удалось найти следующий обходной путь: Если я программно выделю содержимое ячейки до нажатия Ctrl-V, то он будет работать, даже если для -webkit-user-select установлено значение none. Я достиг этого, добавив следующий обработчик событий (jQuery, показанный здесь) к TD (это все еще не работает в автономном DIV с параметром -webkit-user-select, равным none):

$(elem).click(function(evt){
    var selection = window.getSelection();            
    var range = document.createRange();
    range.selectNodeContents(this);
    selection.removeAllRanges();
    selection.addRange(range);
})
Другие вопросы по тегам