当我动态设置内容时,TinyMCE无法使用chrome

时间:2009-08-23 10:59:09

标签: javascript javascript-events tinymce google-chrome

我有一个网站:

<body  onload="ajaxLoad()" > 

我有一个javascript函数,然后使用textarea的setContent javascript方法将数据从我的数据库插入到文本编辑器中。它似乎在Firefox和IE中很好,但在Chrome中有时没有任何显示。没有错误,只是一个空白的编辑器。

在身体部分我有:

  <textarea id="elm1" name="elm1" rows="40" cols="60" style="width: 100%"> 
</textarea>

在头部我有:

function ajaxLoad() {
        var ed = tinyMCE.get('elm1');
        ed.setProgressState(1); // Show progress
        window.setTimeout(function() {
            ed.setProgressState(0); // Hide progress
            ed.setContent('<p style="text-align: center;"><strong><br /><span   style="font-size: small;">General Manager&#39;s Corner</span></strong></p><p style="text-align: center;">August&nbsp;2009</p><p>It&rsquo;s been  15<sup>th</sup> and so have a Steak Night (Saturday, 15<sup>th</sup>) and a shore Dinner planned (Saturday, 22<sup>nd</sup>) this month. urday, September 5<sup>th</sup>. e a can&rsquo;t missed evening, shas extended it one additional week. The last clinic will be the week of August 11<sup>th</sup>. </p><p>&nbsp;Alt (Tuesday through Thursday) </p><p>&nbsp;I wouClub.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<strong></strong></p>');
        }, 1);
    }

我不确定Chrome是否拒绝了某些格式,但似乎TinyMCE可以在一个浏览器中解析它,它应该可以在任何浏览器中执行,所以我很困惑。

有什么建议吗?

7 个答案:

答案 0 :(得分:9)

<强>背景

由于各种原因,onload()不被视为加载Javascript的正确方法,请参阅例如Launching Code on Document Ready,最重要/最明显的一个是在页面完成之前Javascript代码未运行完全下载,包括图像等,因此可能需要永久性(例如,如果外部横幅广告服务器关闭等)。

相反,建议在DOM准备好后立即加载Javascript,但遗憾的是,没有与浏览器兼容的原生解决方案,请参阅Getting notified when the page DOM has loaded (but before window.onload);请注意,我的整个答案都是基于最优秀的Javascript库jQuery,它提供了cross browser solution for this problem,因此我绝对赞成对自己接受的解决方案的两个更高的投票答案。

可能原因:

您的问题似乎是由相反的行为引起的:Chrome有助于WebKit渲染引擎,就像Safari一样,后者onload()被讨论到行为方式不同,请参阅{{3>}中的何时加载?。有关Chrome特定问题的另一种说明可以在Is Safari faster?中找到,但无需解释。

总而言之,我怀疑{DOM}实际加载之前会发出onload(),至少关于TinyMCE的要求,这对于像这样的问题是非常脆弱的,只是停止加载。

可能的解决方案:

window.onload not working correctly in Chrome {{}}}中列出的defer标记上的属性script只是不能跨浏览器兼容,因此我只是采用广泛部署且经过验证的方法来使用已经提到window.onload not working correctly in Chrome,这无论如何都是一种好的做法,原则上也应该处理你的反问题。


<强>更新

确实有一些针对jQuery cross browser solution for the onload() problem提出的错误可以支持我的结论(无论这种行为是否真的构成错误或是故意的),请参阅:

答案 1 :(得分:3)

我有一个类似的问题(编辑器没有在chrome中显示)并在某个论坛中读到,如果tinyMCE无法找到某些文件,它就会停止加载。尝试使用firebug的网络标签查找所有内容(首先清除缓存)。

答案 2 :(得分:2)

首先;确保您拥有最新版本的TinyMCE。

根据您提供的信息,我无法重现您的问题。看起来很好(伪造的ajaxload)。

你可以随时尝试去“后门”;

var myed = document.getElementById('elm1_ifr');
myed.contentDocument.getElementById('tinymce').innerHTML="<p style=\"text-align: center;\"><strong>hacking <span style=\"font-size: small;\">my</span> way in.</strong></p>";

希望你好运!

答案 3 :(得分:2)

解决方案:

我一直在努力与TinyMCE工具栏没有出现在各种各样的secnarios ....它可以在一个用户的IE浏览器,但不是另一个。它不适用于Firefox或Chrome等。

原来,如果在最新的3.3版本中存在仍未修复的STILL错误。当您在网页JavaScript代码中实例化TinyMCE时,如果您为插件部分添加了两个特定插件的代码,则会出现这种情况,工具栏无法显示,您会看到HTML:      插件:

"safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,
inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,
fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,**imagemanager,filemanager**",

删除网页中对imagemanagerfilemanager的所有引用,然后刷新浏览器...

当你这样做时,重新测试Chrome和Firefox以及IE和TinyMCE突然出现!哇....奇迹,是吗?

原来他们的“主要开发人员”没有解决问题,但确实如此解释,如果你想尝试仍然使用这些插件,但仍然解决问题。他的引言如下:

  

“如果ImageManager / FileManager是旧的,他们可能不会使用新的   scriptloader api。而新的3.3版本将加载所有依赖   脚本异步而不是同步。 - Spocke - TinyMCE的主要开发者“

答案 4 :(得分:1)

有几种方法可以在TinyMCE编辑器中设置内容。如果您希望在首次加载页面时内容存在,您可以将其放在标记之间。

否则,您可以通过以下方式通过脚本执行此操作:

window.onload = function(){

tinyMCE.getInstanceById( “ProfileText”)setContent( '测试');

};

我已将代码包装在window.onload块中。如果你有其他功能在TinyMCE编辑器加载后通过这种方式动态设置内容,那么你就不需要了。

答案 5 :(得分:1)

函数oninit有一个选项tinyMCE.init(),将您的方法放在那里:

tinyMCE.init({
    oninit: function(){
        tinyMCE.activeEditor.setContent('blah');
    }
});

它以这种方式工作。

编辑器未在document load事件上完全加载,因为编辑器加载器将后加载一堆文件。

答案 6 :(得分:0)

这里也是同样的问题,即需要

var ed = tinyMCE.get('content');
ed.setContent('zzz');

其他浏览器

document.getElementById("content").innerHTML="zzz";

我非常失望

需要在javascript中检查浏览器才能使其正常工作,那就是suxx