Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как назначить событие html-элементу? (https://javascript.ru/forum/misc/5066-kak-naznachit-sobytie-html-ehlementu.html)

Jony X 12.09.2009 13:45

Как назначить событие html-элементу?
 
Вопрос по теории(а может и по практике):
Как назначить событие html-элементу <iframe>, которое ему не "свойственно"? А ситуация такая: решил висивиг-редактор простенький сам написать, только через <iframe> и <textarea> в тупик зашел, и решил написать собственную функцию обработчик, который бы вызывался по событию keydown и добавлял к значению через innerHtml нажатую букву. Только проблема в том, что события клавиатуры "keydown" поддерживают только элементы формы. Можно ли искуственно назначить событие?

Octane 12.09.2009 15:32

Для создания WYSIWYG-редакторов используют iframe, у которого выставлено свойство document.designMode = "On"; ("on" для Gecko) или элемент (работает не во всех браузерах) с contentEditable = true. События нажатия клавиш отлавливаются на document вашего iframe.

Jony X 12.09.2009 16:04

Я про это читал, только мой редактор пока еще до этого "недожил". Я на этапе ввода символов застрял. И сделать я его хочу, кстати, как раз через <iframe>. Я спрашивал, можно ли как то добавить событие к <iframe>. Мануалы говорят, что у этого узла только события onload, onresize, onunload. А я хочу искусственно навязать событие keydown, так, чтобы при фокусе на <iframe> и нажатии клавиши, её значение присваивалось html содержанию этого фрейма

Octane 12.09.2009 16:33

Цитата:

Сообщение от Jony X
Я спрашивал, можно ли как то добавить событие к <iframe>

Цитата:

Сообщение от Octane
События нажатия клавиш отлавливаются на document вашего iframe.

iframe создает внутреннее окно, доступ к которому нужно получить:
var iframe = document.getElementById("идентификатор_фрейма");
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

iframeDocument.designMode = "On";

iframeDocument.onkeypress = function(e) {
    …
};

Ввод символов позволяет сам браузер, когда вы переводите документ в designMode.

Jony X 13.09.2009 14:14

var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

- Это мы устраняем различие между IE и DOM2-совместимыми браузерами? (Это так, кой какие мысли проверить)

Octane 13.09.2009 15:11

Не помню точно, между старой Оперой и другими браузерами вроде.

Jony X 15.09.2009 14:42

Все вроде заработало, обработчики переприсваиваются, только с установлением designMode в "On" все, что я хотел сделать, стал выполнять сам броузер (т.е. зря я мозг себе парил :( )

Octane, а как можно присвоить ему значение (<iframe>)?
Я пробовал с помощью .innerHtml и write(), а также .value, и чет не получается

Octane 15.09.2009 16:30

iframeDocument.body.innerHTML = "тарам пам пам";

Jony X 15.09.2009 18:57

Я думаю, стоит немного описать ситуацию: я написал (вернее нашел и под себя изменил) скрипт замены обработчиков событий, т.е. при возникновении события (в моем случае keydown) в качестве обработчика (и вместо него) вызывается моя функция, которой передается 3 аргумента: html-элемент target, в котором данное событие произошло, значение клавиши chars, которая сгенерировала это событие и объект event, содержащий дополнительные параметры этого события.
Так вот, если прописать в моей функции:
target.body.innerHTML +=chars ;

желаемого результата это не приносит.
Похоже, в target приходит что-то не то, т.е. должен как раз быть элемент
document.getElementById("идентификатор_фрейма").contentDocument.body;


Как можно проверить, что там приходит?

Octane 15.09.2009 19:13

Например, вывести с помощью alert :)


Часовой пояс GMT +3, время: 16:27.