ФорумПрограммированиеJavaScript → Переопределить событие по нажатию кнопки "enter"

Переопределить событие по нажатию кнопки "enter"

  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 30 июня 2011 г. 2:41

    Такая задачка. Есть iframe с designMode = 'on'; Пишем в него текст, всё хорошо. Но если нажимаем enter, то эта сволочь делает финт ушами. А именно: лиса 5 вставляет <br> (это правильно), а все остальные чего только не вставляют, и <div>, и <p>, кто на что горазд. Мне нужен <br>.

    Сам кастыль я написал, повесил его на событие keydown. Но толку мало. Вставляется и мой <br>, и вся прочая дрянь. Как сделать так, чтобы браузер не запускал какую-то свою встроенную функцию на это событие?

    Наверняка у этого события имя есть, какое? Я бы ему "return false;" сделал.
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 30 июня 2011 г. 2:42, спустя 1 минуту 16 секунд

    а хайт все же мужик с большущими яйцами))))
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 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);

    Но не работает в лисе и хроме. Отложу ка я эту гадость на завтра.
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 30 июня 2011 г. 4:27, спустя 8 минут 49 секунд

    Всё, решение найдено:

    this.iframe[name].win.addEventListener('keypress', function(event){
    if(event.keyCode == 13){
    event.preventDefault();
    alert('Я нажал шайтан кнопку');
    }
    }, false);

    Я дурак.
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 30 июня 2011 г. 11:21, спустя 6 часов 53 минуты 48 секунд

    Hight, дай исходы
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 30 июня 2011 г. 17:03, спустя 5 часов 41 минуту 49 секунд


    Hight, дай исходы

    Пока ещё не готово. Вот доделаю, дам.

    ;)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 июня 2011 г. 23:00, спустя 5 часов 57 минут 27 секунд

    тролли беснуюююютттццццооо
    Сапожник без сапог
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 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>. По идее так…
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 1 июля 2011 г. 0:14, спустя 1 час 11 минут 57 секунд

    Нихуя не тру. Совсем забыл, что по keypress в списках <li> вставляется. Блять. Шайтан сука опасен.
    Спустя 138 сек.
    Кстати. А кто ещё знает какие действия по умолчанию выполняют браузеры при нажатии шайтан-кнопки "Enter" в iframe с designMod = on?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 1 июля 2011 г. 14:31, спустя 14 часов 16 минут 42 секунды

    я не знаю…
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 6 июля 2011 г. 1:32, спустя 4 дня 11 часов 1 минуту

    Мужики, есть ещё проблемка… Место действия iframe c designMode = 'on' в браузере firefox. Вставляем туда картину. Надо сделать так, чтобы браузер не реагировал на любое нажатие мышкой по ней. Казалось бы всё просто, но. Нажатие левой кнопки перехватывается событием mousedown, контекстное меню по правой кнопке - contextmenu.

    Но если дважды кликнуть по картинке левой кнопкой она "выделяется", появляется рамка и можно изменять размер изображение - dblclick не помогает. Если кликнуть по изображению левой кнопкой, то она опять же "выделяется". Как от этого избавиться?
  • stopkran

    Сообщения: 53 Репутация: N Группа: Кто попало

    Spritz 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" них не работает, не…
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 8 июля 2011 г. 19:06, спустя 14 минут 15 секунд

    1. Вместо:

    надо писать:


    спасибо кэп! только ты сам то знаешь что первый вариант для ишака, а второй для остальных браузеров? :-)
    Сапожник без сапог
  • stopkran

    Сообщения: 53 Репутация: N Группа: Кто попало

    Spritz 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)}

    Осталось ещё определить, что текущий элемент - картинка (или таблица - тоже стрёмно, когда пользователи растягивают в ФФ). Потому что иначе будут отменяться все команды редактирования (удалить - ввести текст).
  • Hight

    Сообщения: 1489 Репутация: N Группа: Адекваты

    Spritz 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') я как-то не подумал. Попробую вечером…

Пожалуйста, авторизуйтесь, чтобы написать комментарий!