Событие / обнаружение щелчка по контекстному меню Javascript - фильтрация содержимого вставки

Сценарий: Я пытаюсь перехватить вставку событий внутри текста / входного текста и отфильтровать содержимое

Webkit / IE обрабатываются довольно хорошо, так как я могу прикрепить код к событию onpaste , а затем прочитать из буфера обмена то, что вставляется. Много из примеров вокруг.

Геккон хитрее, потому что, насколько я знаю , это не так. Невозможно прочитать содержимое буфера обмена в Firefox (разве кто-то знает обходной путь для этого?)
Я просто использую для этого трюк с обменом входными данными.

Опера раздражает, хотя. Я могу перехватить CTRL + V и SHIFT + INS , но нет события onpaste .
Не говоря уже о каком-либо взаимодействии с буфером обмена, по-видимому.

Итак, мой вопрос:

Могу ли я определить, нажал ли пользователь на вставить в контекстном меню в Opera? Есть ли другой способ обнаружить событие?

РЕДАКТИРОВАТЬ:

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

Примечания для тех, у кого моя проблема ( входная фильтрация):

  • можно захватывать перетаскиваемый контент: mouseup + setTimeout делает трюк везде почти идеально.
  • без вспышки, Вероятно, нет решения . Даже со вспышкой это не совсем твердое решение. Слишком много усилий для поддержки 100% случаев.

17
задан Brian Tompsett - 汤莱恩 23 September 2019 в 07:38
поделиться

4 ответа

Я хотел бы отметить виджет меню DOJO, который отлично создает контекстные меню в разных браузерах. http://www.dojotoolkit.org/reference-guide/dijit/Menu.html#dijit-menu

Что вы можете сделать, так это определить событие вставки в браузерах, которые его поддерживают, и переопределить контекстное меню в браузерах. которые не поддерживают это событие, как опера.

После того, как вы создадите собственное контекстное меню, вы можете добавить пункт меню «копировать вставить» или создать контекстное меню, аналогичное меню по умолчанию, используя css.

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

Его полная реализация может иметь больше проблем, чем предполагалось, но это возможно, и мы всегда можем попробовать (я обязательно это сделаю).

3
ответ дан 30 November 2019 в 13:45
поделиться

Я столкнулся с этим в прошлом году. Короче нет.

Я закончил тем, что использовал обработчик onchange и отфильтровал контент после того, как он уже был вставлен в текстовое поле.

9
ответ дан 30 November 2019 в 13:45
поделиться

Вы можете перехватить вставку с помощью jQuery, используя bind('paste', function() {});, сравните строку до и после вставки и примените форматирование.

Следующее было протестировано в IE7/FF3.6/Chrome/Safari 5

$("#textarea").bind('paste', function(e){ 
    // Do whatever you needed to do with the code here.
});

Живой пример http://jsfiddle.net/VSrTg/2/

Edit например:

$("#textarea").bind('paste', function(e){ 
    var oldText = this.value;
    setTimeout(function() { 
        // Compare oldText to $("#textarea").val() and format accordingly.
    }, 1000);
});

Редактировать 2 Учитывая ваши изменения в исходном сообщении, если вас беспокоит гигантская доля рынка Opera, вы вам придется отслеживать значение вашего текстового поля с помощью setInterval() и сравнивать его с самим собой на предмет изменений.

В конце концов, всегда найдется способ обойти ваш скрипт, даже в приведенном выше примере можно просто перетащить в него текст из другого текстового поля (или адресной строки) без запуска события paste. определено выше.

6
ответ дан 30 November 2019 в 13:45
поделиться

Ответ на вопрос – простое нет. Основные браузеры, в которых нет события paste, — это последние версии Opera и Firefox 2. Учитывая, что события paste нет, вам нужно найти альтернативное событие или набор событий для обнаружения. вставка из контекстного меню , как это происходит на самом деле. Вы можете добавить обработчики для каждого существующего события (я сделал это), и вы просто ничего не получите в соответствующих браузерах, когда пользователь запустит вставку из контекстного меню.

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

2
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

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