Подтвердить что ты не робот

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

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

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

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

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

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

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

EDIT:

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

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

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

Ответ 1

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

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

Как только вы создадите свое собственное контекстное меню, вы можете добавить пункт меню "Вставить копию" или создать контекстное меню, аналогичное по умолчанию, используя css.

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

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

Ответ 2

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

Я закончил использование обработчика onchange и фильтрацию содержимого после его вставки в текстовое поле.

Ответ 3

Вы можете перехватить вставку с помощью 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/

Изменить. Подход будет примерно таким:

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

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

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

Ответ 4

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

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

Ответ 5

Я использую setTimeout для вставки событий. Но для контекстного меню выберите ничего, похоже, не работает (как указано выше). Я привязываю mousemove к форме ввода, которая запускает функцию обновления. Затем отвяжите/привяжите, чтобы они не складывались.

Это позволяет выбрать контекстное меню и перетащить его в поле ввода.

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

Прекрасно работает.