Как реализовать отправку содержимого из iframe нажатием комбинации клавиш ctrl+enter
Здравствуйте!
Мучаюсь второй день над таким вопросом. Разбираю простейший визивиг редактор, по принципу приведённому здесь: // *********************** // ШАГ 1: Выводим iframe и получаем доступ к нему // *********************** // Выводим в HTML-поток iframe document.write("<iframe scrolling='no' frameborder='no' src='#' id='frameId' name='frameId'></iframe><br/>"); // Определим Gecko-браузеры, т.к. они отличаются в своей работе от Оперы и IE var isGecko = navigator.userAgent.toLowerCase().indexOf("gecko") != -1; // Получаем доступ к объектам window & document для ифрейма var iframe = (isGecko) ? document.getElementById("frameId") : frames["frameId"]; var iWin = (isGecko) ? iframe.contentWindow : iframe.window; var iDoc = (isGecko) ? iframe.contentDocument : iframe.document; // *********************** // ШАГ 2: Добавим на пустую страницу ифрейма произвольный HTML-код // *********************** // Формируем HTML-код iHTML = "<html><head>\n"; iHTML += "<style>\n"; iHTML += "body, div, p, td {font-size:12px; font-family:tahoma; margin:0px; padding:0px;}"; iHTML += "body {margin:5px;}"; iHTML += "</style>\n"; iHTML += "<body><u>Содержимое</u> с <b>HTML</b>-<i>разметкой</i></body>"; iHTML += "</html>"; // Добавляем его с помощью методов объекта document iDoc.open(); iDoc.write(iHTML); iDoc.close(); // *********************** // ШАГ 3: Инициализация свойства designMode объекта document // *********************** if (!iDoc.designMode) alert("Визуальный режим редактирования не поддерживается Вашим браузером"); else iDoc.designMode = (isGecko) ? "on" : "On"; // *********************** // ШАГ 4: Простейшие элементы редактирования: жирность, курсив, подчеркивание // *********************** // Выведем HTML-код этих элементов document.write("<input type='button' value='Ж' onclick='setBold()' class='bold' />"); document.write("<input type='button' value='К' onclick='setItal()' class='ital' />"); document.write("<input type='button' value='Ч' onclick='setUnder()' class='under' />"); // Запишем код функции, для выставления форматирования // Используется метод execCommand объекта document function setBold() { iWin.focus(); iWin.document.execCommand("bold", null, ""); } function setItal() { iWin.focus(); iWin.document.execCommand("italic", null, ""); } function setUnder() { iWin.focus(); iWin.document.execCommand("underline", null, ""); } В готовом сайте хочу заменить <textarea> на данный редактор. Но если сейчас сообщения можно отправлять с помощью ctrl+enter, то при использовании iframe я не могу понять, можно ли вообще реализовать отправку содержимого на сервер нажатием комбинации клавиш? В приведённом коде отправку реализовал с помощью нажатия кнопки: document.write("<input name='submitmsg' type='submit' id='submitmsg' value='OK' class='subs' />"); $("#submitmsg").click(function(){ var clientmsg = iDoc.body.innerHTML; $.post("post.php", {text: clientmsg}); iDoc.open(); iDoc.write(""); iDoc.close(); return false; }); Можно ли повесить какой-нибудь обработчик нажатия ctrl+enter именно в самом iframe? И так, что бы было аналогично сценарию нажатия кнопки? Были идеи поместить фрейм в форму, форме назначить событие «onkeypress» - результат отрицательный. Также посещала идея наложить <textarea> на фрейм, сделать её прозрачной, но всё равно не прокатывает. Также как и обрамлять в DIV. Получалось реализовать нажатие ctrl+enter когда курсор находится вне фрейма, но это не подходит.. Естественно здесь включен designMode. Если кто то сталкивался с подобным, прошу поделиться решением или всё же его отсутствием, если такое реализовать невозможно.. |
function runOnKeys(func) { var codes = [17, 13]; var pressed = []; iDoc.onkeydown = function(e) { e = e || iWin.event; pressed[e.keyCode] = 1; for(var i in codes) { if (!pressed[codes[i]]) return; } pressed = []; func(); }; iDoc.onkeyup = function(e) { e = e || iWin.event; delete pressed[e.keyCode]; }; } function sendIframe() { var clientmsg = iDoc.body.innerHTML; $.post('post.php', { text: clientmsg }, function(data) { iDoc.open(); iDoc.write(data); iDoc.close(); }); } runOnKeys(sendIframe); |
Огромное спасибо! Функция отрабатывает просто на ура, но маленькая загвоздка.. Отправляется один раз. После того как произошла очистка и отправляется новый текст, ничего не происходит...
|
Благодарю! Работает как часы )
Есть чему поучиться, буду разбираться. |
Часовой пояс GMT +3, время: 17:29. |