Поле редактирования: отключить пользовательское форматирование, но добавить мое собственное - PullRequest
0 голосов
/ 23 сентября 2011

Я знаю, что расширенные текстовые поля в HTML являются чем-то вроде минного поля, но я надеюсь, что эта конкретная ситуация не будет слишком сложной. Мне нужно текстовое поле, которое пользователь не может отформатировать, но с помощью сценариев я могу добавить в него небольшое форматирование (чтобы текстовая область не работала).

Моей первой мыслью было, что я мог бы использовать contentEditable, и если у пользователя нет панели инструментов, он не может ничего сделать, но все равно есть комбинации Ctrl + B, Ctrl + I и т. Д. Итак, я сделал это:

ctrlHandler = function (event) {
    event.preventDefault();
};

this.keydown(function (event) {
    if (event.ctrlKey) {
        $(this).bind('keypress', ctrlHandler);
    }
});
this.keyup(function (event) {
    if (event.ctrlKey) {
        $(this).unbind('keypress', ctrlHandler);
    }
});

Таким образом, когда клавиша Ctrl нажата (keydown), обработчик событий привязывается к нажатию клавиши, что предотвращает использование по умолчанию, а когда он освобождается, обработчик событий не связывается. Умно, а? (Я бы поработал, как обрабатывать комбинации вырезать / копировать / вставить и т. Д. Позже.) При этом обработчик событий привязывается правильно, но event.preventDefault() на самом деле не предотвращает использование по умолчанию! Текст выделен жирным шрифтом / курсивом / подчеркнут, как если бы я ничего не делал. Изменение форматирования, кажется, происходит до того, как сработает событие. Использование keydown или keyup вместо keypress также не работает. Кто-нибудь может придумать другой (кросс-браузерный) подход или как заставить этот работать?

1 Ответ

0 голосов
/ 23 сентября 2011

Aha! Кажется, я неправильно понял, что делает event.ctrlKey. Нажатие Ctrl + B не запускает два события нажатия клавиши ... оно запускает одно с event.ctrlKey, установленным в true. Так что if (event.ctrlKey) event.preventDefault() сделает свое дело. Еще не протестирован во всех браузерах.

...