Текстовый редактор jQuery Cleditor wysiwyg: keyup() работает в браузерах webkit, но не в Firefox или IE

Я пытаюсь развить предыдущий вопрос Stackru о том, как отображать содержимое из текстового поля Cleditor во внешнем элементе HTML, например <p>, Вот вопрос и скрипка, которая решает мою проблему в браузерах webkit, но не в Firefox или IE:

Вот код из скрипки:

<textarea id="input" name="input"></textarea>
<p id="x"></p>  

<script>
  $("#input").cleditor();

  $(".cleditorMain iframe").contents().find('body').bind('keyup',function(){
    var v = $(this).text(); // or .html() if desired
    $('#x').html(v);
  });
</script>

Я прочитал Получить содержимое iframe из jquery, что мне нужно использовать "window.top.... для доступа к главной странице и передать его таким образом, потому что.contents() поддерживается не всеми браузерами", но я не Я уверен, как использовать window.top для этой цели, и я надеюсь, что кто-то сможет пролить свет на эту тему.

2 ответа

Решение

Документация клэдитора гласит, что у него есть событие "change", которое, по его утверждению, работает с событием "keyup", но, к сожалению, в моем тестировании это не сработало так, как ожидалось с Firefox 7 (требуется щелчок из текстового редактора),

Jsfiddle: http://jsfiddle.net/qm4G6/27/

Код:

var cledit = $("#input").cleditor()[0];

cledit.change(function(){
    var v = this.$area.context.value;
    $('#x').html(v);
});

Существует также еще один вопрос Stackru, в котором задано то же самое, в котором пользователь Ling предлагает изменить плагин для добавления своей собственной функции: получить контент из jquery CLEditor

Изменить: на основе ваших комментариев с вышеупомянутым результатом вопроса SO не работает, я исправил код ниже. Это работает в IE9 и IE9 в режиме разработчика IE8. http://jsfiddle.net/qm4G6/80/

$(document).ready(function(){

 var cledit = $("#inputcledit").cleditor()[0];
 $(cledit.$frame[0]).attr("id","cleditCool");

var cleditFrame;
if(!document.frames)
{
   cleditFrame = $("#cleditCool")[0].contentWindow.document;
}
else
{
    cleditFrame = document.frames["cleditCool"].document;
}

$( cleditFrame ).bind('keyup', function(){
    var v = $(this).text(); 
    $('#x').html(v);
});

});

Другое редактирование: чтобы получить HTML, вы должны найти тело внутри iframe, как $(this).find("body").html(), Смотрите код ниже. JSFiddle: http://jsfiddle.net/qm4G6/84/

var cledit = $("#inputcledit").cleditor()[0];
$(cledit.$frame[0]).attr("id","cleditCool");

var cleditFrame;
if(!document.frames)
{
   cleditFrame = $("#cleditCool")[0].contentWindow.document;
}
else
{
    cleditFrame = document.frames["cleditCool"].document;
}

$( cleditFrame ).bind('keyup', function(){
        var v = $(this).find("body").html();
        $('#x').html(v);
});

$("div.cleditorToolbar, .cleditorPopup div").bind("click",function(){
      var v = $( cleditFrame ).find("body").html();
      $('#x').html(v);
});

Так как я ответил на вопрос, который побудил вас к этому, я думаю, я отвечу и на этот вопрос;)

Это работает в Chrome и Firefox (у меня нет доступа к IE):

$("#input").cleditor();

$( $(".cleditorMain iframe")[0].contentWindow.document ).bind('keyup', function(){
    var v = $(this).text(); // or .html() if desired
    $('#x').html(v);
});

Обновленный jsFiddle

ОБНОВИТЬ

Это также работает в Chrome и Firefox. Может IE тоже?

$("#input").cleditor();

$( $(".cleditorMain iframe")[0].contentDocument ).bind('keyup', function(){
    var v = $(this).text(); // or .html() if desired
    $('#x').html(v);
});

jsFiddle

Другие вопросы по тегам