| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Перехват и обработка события onpaste в DesignMode |
| Автор: Stampede 12.4.2011, 18:59 | ||||
| Всем привет! Взываю к коллективной мудрости. Есть следующая задача. Я http://real-english.ru/blog/introducing-visual-editor.htm визуальный редактор http://nicedit.com/. Выбрал его за компактность, простоту и разборчивый код. Вроде пока все получается, хотя многое приходится затачивать под свои нужды. Сейчас встал вопрос о том, чтобы при копированиии в поле редактирования содержимое буфера очищалось от разметки HTML. В ходе продолжительных поисков и экспериментов наткнулся вот на такую подсказку:
Закодил согласно описанию, получилось вот так: http://download.real-english.ru/test/paste.html Остается одна маленькая досадная мелочь: если вклеивать содержимое буфера через меню или перетаскиванием, то "очистительный фильтр", естественно, не срабатывает. Кто подскажет, что здесь можно сделать? Для удобства привожу полный код страницы:
Заранее спасибо! |
| Автор: ksnk 12.4.2011, 19:13 |
| Можно перехватывать событие onpaste и сохранять контент в переменной. После небольшого таймаута можно выковырять изменения в контенте простым текстовым сравнением с начала и конца текста с сохраненным значением. Правда, вероятно, возможны разные глюки, при вставке некорректного Html, например. При этом броузер будет корректировать контент и сравнение будет глючить. Возможно, можно выковыривать изменения более разумно, используя сохраненную позицию курсора до вставки и после вставки, хотя с этим надо возится... |
| Автор: Котокобра 12.4.2011, 21:24 |
| а что мешает очищать всегда, когда произведена вставка? |
| Автор: Stampede 12.4.2011, 21:34 |
К содержимому буфера в общем случае не так легко доступиться, поэтому приходится идти на такие вот ухищрения. |
| Автор: Котокобра 12.4.2011, 22:16 | ||
посмотрел пример. я думаю, текст нужно парсить. что-нибудь в этом духе:
|
| Автор: Stampede 13.4.2011, 01:09 |
| Котокобра, загвоздка не в том, чтобы руками вычистить разметку (хотя, конечно, это делается не так прямолинейно, как в вашем примере — вспомним хотя бы, что теги могут быть с атрибутами), а в том, чтобы получить содержимое буфера обмена. Firefox, например, скрывает его от программного доступа из соображений безопасности. Потому-то WYSIWYG-редакторы вынуждены делать финт ушами: позволяют браузеру сделать вставку своим внутренними средствами, но при этом перенаправляют вывод в текстовое поле путем изменения фокуса. Какие еще будут идеи? |
| Автор: Stampede 13.4.2011, 01:54 |
Если другого выхода не будет, тупо поставлю на onpaste заглушку с сообщением, чтобы копировали с клавы. Примерно так, http://tinymce.moxiecode.com/tryit/full.php:![]() Но прежде чем капитулировать, хочется все же еще немного повоевать. Так что продолжаем мозговой штурм. |
| Автор: ksnk 13.4.2011, 08:01 | ||
вобще-то, событие onpaste в Мозиле есть. Убедиться в этом достаточно легко
А в чем проблема? Получить содержимое области редактирования? Получить положение "курсора"? |
| Автор: ksnk 13.4.2011, 09:45 | ||||
А зачем нам буфер? Нам нужно получить изменение. Вот небольшая модификация "рабочего примера" для демонстрации. Из за теперешнего перехвата клавиатурной вставки срабатывает только на вставку из copy-paste менюшки. Осталось только прикрутить что-то такое на drag&drop. Но, вроде, даже события такие где-то появились...
Добавлено через 1 минуту и 10 секунд Я проверяю на FireFox. сейчас, к сожалению, нет возможности проверить на других броузерах. :( |
| Автор: Stampede 13.4.2011, 10:58 |
| ksnk, спасибо за деятельное участие в решении вопроса. Метод не без недостатков (например, при большом объеме вклеиваемого форматированного текста будет заметно видимое перемигивание), но в целом "ход вашей мысли мне нравится" © , так что держите плюса. |
| Автор: Stampede 13.4.2011, 23:34 | ||
| Ну что я могу сказать: вроде бы получилось. Посмотреть и потестить можно вживую: http://download.real-english.ru/test/paste1.html Код, приведенный ksnk, пришлось подправить в части коррекции маркеров начала и конца расхождения до границ тегов. Это, конечно, далеко не окончательый вариант, но без этого вообще вставлялось с ненужными хвостами. Ну и перемигивание при вставке, действительно, довольно заметное. Полный код страницы такой:
Если у кого-то будут еще какие-либо другие предложения — давайте обсудим. |
| Автор: Embedded 28.4.2011, 17:12 |
| довольно неплохая штука nicedit, имхо tinymce сильно загружен ненужностямии у tiny какие-то странные глюки при копировании/вставке из ie в opera |