Форум → Программирование → JavaScript → Переопределить событие по нажатию кнопки "enter"
Переопределить событие по нажатию кнопки "enter"
-
Такая задачка. Есть iframe с designMode = 'on'; Пишем в него текст, всё хорошо. Но если нажимаем enter, то эта сволочь делает финт ушами. А именно: лиса 5 вставляет <br> (это правильно), а все остальные чего только не вставляют, и <div>, и <p>, кто на что горазд. Мне нужен <br>.
Сам кастыль я написал, повесил его на событие keydown. Но толку мало. Вставляется и мой <br>, и вся прочая дрянь. Как сделать так, чтобы браузер не запускал какую-то свою встроенную функцию на это событие?
Наверняка у этого события имя есть, какое? Я бы ему "return false;" сделал. -
-
30 июня 2011 г. 4:18, спустя 1 час 35 минут 50 секунд
Гугл хром я победил:var html = this.iframe[name].doc.getElementsByTagName('HTML')[0];
html.setAttribute('onkeypress', 'return false;');
Ну почти. Надо теперь обработчик написать который бы код кнопочки enter (13) мониторил.
Война продолжается…
// upd
Мде. Можно делать так:this.iframe[name].win.addEventListener('keydown', function(event){
if(event.keyCode == 13){
alert('Я нажал шайтан кнопку');
event.preventDefault();
}
}, false);
Но не работает в лисе и хроме. Отложу ка я эту гадость на завтра. -
30 июня 2011 г. 4:27, спустя 8 минут 49 секунд
Всё, решение найдено:
this.iframe[name].win.addEventListener('keypress', function(event){
if(event.keyCode == 13){
event.preventDefault();
alert('Я нажал шайтан кнопку');
}
}, false);
Я дурак. -
-
30 июня 2011 г. 17:03, спустя 5 часов 41 минуту 49 секунд
Hight, дай исходы
Пока ещё не готово. Вот доделаю, дам.
;) -
30 июня 2011 г. 23:00, спустя 5 часов 57 минут 27 секунд
тролли беснуюююютттццццоооСапожник без сапог -
30 июня 2011 г. 23:02, спустя 1 минуту 48 секунд
Для справочки, если кому интересно. С <br> не прокатило, IE9 напрочь отказывается его показывать как надо. Но получилось с \n. Вот код почти готовой функции:text.editor.newLine = function(event, name){
if(event.keyCode != 13) return;
event.preventDefault();
if(this.config[name].mode){ /* Визуальный режим */
var nl = this.iframe[name].doc.createTextNode('\n');
this.iframe[name].win.focus();
var selection = this.iframe[name].win.getSelection(), range = selection.getRangeAt(0);
range.deleteContents();
range.insertNode(nl);
range.setStartAfter(nl);
range.setEndAfter(nl);
selection.removeAllRanges();
selection.addRange(range);
}else{ /* Текстовый режим */
}
};
И в стили надо прописать вот это:body {white-space:pre-wrap;}
А при смене режима конвертим переводы строки в <br>. По идее так… -
1 июля 2011 г. 0:14, спустя 1 час 11 минут 57 секунд
Нихуя не тру. Совсем забыл, что по keypress в списках <li> вставляется. Блять. Шайтан сука опасен.Спустя 138 сек.Кстати. А кто ещё знает какие действия по умолчанию выполняют браузеры при нажатии шайтан-кнопки "Enter" в iframe с designMod = on? -
-
6 июля 2011 г. 1:32, спустя 4 дня 11 часов 1 минуту
Мужики, есть ещё проблемка… Место действия iframe c designMode = 'on' в браузере firefox. Вставляем туда картину. Надо сделать так, чтобы браузер не реагировал на любое нажатие мышкой по ней. Казалось бы всё просто, но. Нажатие левой кнопки перехватывается событием mousedown, контекстное меню по правой кнопке - contextmenu.
Но если дважды кликнуть по картинке левой кнопкой она "выделяется", появляется рамка и можно изменять размер изображение - dblclick не помогает. Если кликнуть по изображению левой кнопкой, то она опять же "выделяется". Как от этого избавиться? -
8 июля 2011 г. 18:52, спустя 2 дня 17 часов 20 минут
1. Вместо:this.iframe[name].doc.designMode = "on"
надо писать:this.iframe[name].doc.body.contentEditable = "true"
2. После этого можно определить функцию, отменяющую изменение размеров изображения (да и всё остальное заодно):this.iframe[name].doc.onmouseup = function(){this.iframe[name].doc.execCommand("undo", false, null)}
Получается очень весело: клиент тянет за послушный край картинки, отпускает мышь, размер картинки прыгает обратно, как был.
А с designMode = "on" них не работает, не… -
8 июля 2011 г. 19:06, спустя 14 минут 15 секунд
1. Вместо:
надо писать:
спасибо кэп! только ты сам то знаешь что первый вариант для ишака, а второй для остальных браузеров? :-)Сапожник без сапог -
9 июля 2011 г. 0:03, спустя 4 часа 56 минут 40 секунд
В ФФ contentEditable = "true" работает. Оперы счас как-то вот под рукой нету… Да это уже и неважно, нашёл на javascript.ru, как навесить событие при designMode = "on". Оказывается, не зря, блин, придумали все эти addEventListener'ы:
if (this.iframe[name].doc.addEventListener)
this.iframe[name].doc.addEventListener( "mouseup", editUndo, true)
else if (this.iframe[name].doc.body.attachEvent
this.iframe[name].doc.body.attachEvent( "onmouseup", editUndo)
function editUndo(){this.iframe[name].doc.execCommand("undo", false, null)}Спустя 240 сек.В ФФ contentEditable = "true" работает. Оперы счас как-то вот под рукой нету… Да это уже и неважно, нашёл на javascript.ru, как навесить событие при designMode = "on". Оказывается, не зря, блин, придумали все эти addEventListener'ы (всю жизнь как-то без них обходился):
if (this.iframe[name].doc.addEventListener)
this.iframe[name].doc.addEventListener( "mouseup", editUndo, true)
else if (this.iframe[name].doc.body.attachEvent
this.iframe[name].doc.body.attachEvent( "onmouseup", editUndo)
function editUndo(){this.iframe[name].doc.execCommand("undo", false, null)}
Осталось ещё определить, что текущий элемент - картинка (или таблица - тоже стрёмно, когда пользователи растягивают в ФФ). Потому что иначе будут отменяться все команды редактирования (удалить - ввести текст). -
10 июля 2011 г. 17:08, спустя 1 день 17 часов 5 минут
1. Вместо:this.iframe[name].doc.designMode = "on"
надо писать:this.iframe[name].doc.body.contentEditable = "true"
2. После этого можно определить функцию, отменяющую изменение размеров изображения (да и всё остальное заодно):this.iframe[name].doc.onmouseup = function(){this.iframe[name].doc.execCommand("undo", false, null)}
Получается очень весело: клиент тянет за послушный край картинки, отпускает мышь, размер картинки прыгает обратно, как был.
А с designMode = "on" них не работает, не…
С contentEditable была какая-то проблема. Не помню уже какая, но пришлось отказаться. designMode отлично работает, не собираюсь ничего менять. А про функцию execCommand('undo') я как-то не подумал. Попробую вечером…
Пожалуйста, авторизуйтесь, чтобы написать комментарий!