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

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

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

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

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

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

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

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 20 августа 2010

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

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

6 голосов
/ 27 августа 2010

Вы можете перехватить вставку с помощью 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 Учитывая ваши изменения в исходном сообщении, если вы беспокоитесь о гиганте рынке акции , то есть Opera, вам нужно будет отслеживать значение вашего текстового поля с setInterval() и сравнивать его с самим собой на предмет изменений.

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

3 голосов
/ 30 августа 2010

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

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

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

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

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

2 голосов
/ 31 августа 2010

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

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

0 голосов
/ 18 января 2012

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

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

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

Работает нормально.

...