Здесь курят мануал.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 01:05:45

Страниц: [1]
Печать
Автор Тема: Переопределить событие по нажатию кнопки "enter"  (Прочитано 1082 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Hight    ↓ 
30 Июнь, 2011, 02:41:34
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Такая задачка. Есть iframe с designMode = 'on'; Пишем в него текст, всё хорошо. Но если нажимаем enter, то эта сволочь делает финт ушами. А именно: лиса 5 вставляет <br> (это правильно), а все остальные чего только не вставляют, и <div>, и <p>, кто на что горазд. Мне нужен <br>.
 
Сам кастыль я написал, повесил его на событие keydown. Но толку мало. Вставляется и мой <br>, и вся прочая дрянь. Как сделать так, чтобы браузер не запускал какую-то свою встроенную функцию на это событие?
 
Наверняка у этого события имя есть, какое? Я бы ему "return false;" сделал.
Записан

Sinkler    ↓ 
30 Июнь, 2011, 02:42:50 , спустя 1 минуту 16 секунд
НЕ ХУЕТА! ХУЕТА!

Похуй, пляшем!
Группа: Джедаи

Карма: 73
Сообщений: 6806
Сила слова: 1.07

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

Hight    ↓ 
30 Июнь, 2011, 04:18:40 , спустя 1 час 35 минут 50 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Гугл хром я победил:
Javascript
var html = this.iframe[name].doc.getElementsByTagName('HTML')[0];
    html.setAttribute('onkeypress', 'return false;');
Ну почти. Надо теперь обработчик написать который бы код кнопочки enter (13) мониторил.
 
Война продолжается...
 
// upd
 
Мде. Можно делать так:
Javascript
this.iframe[name].win.addEventListener('keydown', function(event){
    if(event.keyCode == 13){
        alert('Я нажал шайтан кнопку');
        event.preventDefault();
    }
}, false);
Но не работает в лисе и хроме. Отложу ка я эту гадость на завтра.
« Последнее редактирование: 30 Июнь, 2011, 04:18:40 от Hight » Записан

Hight    ↓ 
30 Июнь, 2011, 04:27:29 , спустя 8 минут 49 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

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

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

kostyl    ↓ 
30 Июнь, 2011, 11:21:17 , спустя 6 часов 53 минуты 48 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

Hight, дай исходы
Записан

качество жизни обратно пропорционально количеству лени
Hight    ↓ 
30 Июнь, 2011, 05:03:06 , спустя 5 часов 41 минуту 49 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91


Hight, дай исходы
Пока ещё не готово. Вот доделаю, дам.
 
;)
Записан

phpdude    ↓ 
30 Июнь, 2011, 11:00:33 , спустя 5 часов 57 минут 27 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

тролли беснуюююютттццццооо
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Hight    ↓ 
30 Июнь, 2011, 11:02:21 , спустя 1 минуту 48 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

Для справочки, если кому интересно. С <br> не прокатило, IE9 напрочь отказывается его показывать как надо. Но получилось с \n. Вот код почти готовой функции:
Javascript
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{ /* Текстовый режим */
       
    }
};
И в стили надо прописать вот это:
CSS
body {white-space:pre-wrap;}
А при смене режима конвертим переводы строки в <br>. По идее так...
Записан

Hight    ↓ 
01 Июль, 2011, 12:14:18 , спустя 1 час 11 минут 57 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

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

kostyl    ↓ 
01 Июль, 2011, 02:31:00 , спустя 14 часов 16 минут 42 секунды
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3522
Сила слова: 1.7

я не знаю...
Записан

качество жизни обратно пропорционально количеству лени
Hight    ↓ 
06 Июль, 2011, 01:32:04 , спустя 4 дня 11 часов 1 минуту 4 секунды
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91

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

stopkran    ↓ 
08 Июль, 2011, 06:52:24 , спустя 2 дня 17 часов 20 минут 20 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 58
Сила слова: 0

1. Вместо:
Javascript
this.iframe[name].doc.designMode = "on"
надо писать:
Javascript
this.iframe[name].doc.body.contentEditable = "true"

2. После этого можно определить функцию, отменяющую изменение размеров изображения (да и всё остальное заодно):
Javascript
this.iframe[name].doc.onmouseup = function(){this.iframe[name].doc.execCommand("undo", false, null)}

Получается очень весело: клиент тянет за послушный край картинки, отпускает мышь, размер картинки прыгает обратно, как был.
 
А с designMode = "on" них не работает, не...
Записан
phpdude    ↓ 
08 Июль, 2011, 07:06:39 , спустя 14 минут 15 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 345
Сообщений: д-о-х-у-я!
Сила слова: 1.66

1. Вместо:
надо писать:

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
stopkran    ↓ 
09 Июль, 2011, 12:03:19 , спустя 4 часа 56 минут 40 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 0
Сообщений: 58
Сила слова: 0

В ФФ 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)}
Спустя 4 минуты добавил
В ФФ 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    ↓ 
10 Июль, 2011, 05:08:58 , спустя 1 день 17 часов 5 минут 39 секунд
НЕ ХУЕТА! ХУЕТА!

Красный властелин
Группа: Адекваты

Карма: 31
Сообщений: 1626
Сила слова: 1.91


1. Вместо:
Javascript
this.iframe[name].doc.designMode = "on"
надо писать:
Javascript
this.iframe[name].doc.body.contentEditable = "true"

2. После этого можно определить функцию, отменяющую изменение размеров изображения (да и всё остальное заодно):
Javascript
this.iframe[name].doc.onmouseup = function(){this.iframe[name].doc.execCommand("undo", false, null)}

Получается очень весело: клиент тянет за послушный край картинки, отпускает мышь, размер картинки прыгает обратно, как был.
 
А с designMode = "on" них не работает, не...
С contentEditable была какая-то проблема. Не помню уже какая, но пришлось отказаться. designMode отлично работает, не собираюсь ничего менять. А про функцию execCommand('undo') я как-то не подумал. Попробую вечером...
Записан

Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: NRG, adw0rd, Frozzeg, artoodetoo