所以我有一个页面,其中包含调用httpRequest的链接。该请求调用一个php文件,该文件从mysql中获取数据并预先填充一个表单,然后将该表单返回到浏览器/网页。我的问题是当页面通过httpRequest / ajax返回到浏览器时,文本区域不显示tinymce编辑器,它只显示一个普通的文本区域。看起来我的请求和ajax工作正常文本区域没有tinycme编辑器。
当我不使用ajax时它工作正常但是当我把它放在一个单独的文件中并通过ajax调用它时它没有引入tinymce编辑器。
有没有人知道如何解决这个问题,以便我的ajax生成的页面显示带有tinymce编辑器的文本区域。谢谢。
答案 0 :(得分:1)
让我们假设您的thinyMCE实例已使用以下代码进行初始化
// initialize tinyMCE in page
tinyMCE.init({
mode: "textareas",
theme: "advanced"
});
你在页面的某个地方有某种按钮。为了这个提示的目的,我不会给它任何ID,但你可以。现在,使用jQuery,您可以轻松地将事件处理程序附加到该按钮,该按钮将通过AJAX调用您的服务器并获取您想要放置tinyMCE编辑器的内容。做这样工作的代码看起来就像下面一样。
$(function() {
$("button").bind("click", function() {
var ed = tinyMCE.get('content');
ed.setProgressState(1); // Show progress
$.getJSON('/page/12.json', { /* your data */
}, function(data) {
ed.setProgressState(0); // Hide progress
ed.setContent(data["body"]);
}
});
});
});
你可以看到,在button.click上,ajax将调用url /page/12.json
,它将返回JSON作为响应。最低限度的回应可能是:
{
title: "Page title",
body: "<html><head><title>Page title</title>......</html>"
}
我附加了匿名函数作为回调,它将处理来自服务器的响应。并隐藏在ajax调用之前显示的进度指示器。
关于JSON
JSON缩短了JavaScript Object Notation。这是JavaScript代码!!!所以不要对此感到困惑。使用JSON,您可以创建javascript对象,该对象可以具有稍后可以在代码中使用的属性,以访问该对象“保留”的特定数据。如果它更容易,您可以将其视为某种数据结构。
无论如何,要向您展示如何手动创建这个JSON,请看下面的示例
var data = new Object();
data.title = "Page title";
data.body = "<html....";
或
var data = {
title: "page title",
body: "<html...."
};
这是完全相同的事情。
如果您想了解有关JSON的更多信息,请将浏览器指向http://json.org。
=====替代=====
json解决方案的替代方案可能只是对服务器的平面ajax调用,响应可以是纯HTML(从你的问题我可以假设你已经有类似的东西)。因此调用$.getJSON
的instad你可以使用$.get(url, callback);
做同样的事情。我的答案顶部的代码不会发生显着变化。而不是在响应中生成JSON,您将获得HTML的字符串。
-----------底线-------
我更喜欢JSON,因为稍后可以使用其他属性轻松扩展它,因此以后不会有任何痛苦的代码更改;)
答案 1 :(得分:0)
这里的问题是当你返回整个页面并使用ajax响应渲染它时,你的tinymce实例之前还没有被关闭。 为此,您可以在呈现ajax响应之前调用这一小段代码:
tinymce.execCommand('mceRemoveControl',true,'editor_id');
在这种情况下,编辑器应该正确初始化。在关闭第一个之前,不允许初始化具有相同id的tinymce编辑器。
答案 2 :(得分:0)
奇怪的是我昨天遇到了这个问题。以下代码应该可以工作,但是YMMV。诀窍是使用ajax events中的正确步骤。我使用了Regular TinyMCE并使用了已经包含的jQuery库。
下面进入你的tinyMCE初始化tinyMCE.init()
。以下所有块都应在document.ready
之外。
myTinyInit = {
//.......All essential keys/values ...........
setup : function(ed) {
ed.onChange.add(function( ed ) {
tinyMCE.triggerSave();
}) }
//.....................
};
// Init the tinyMCE
tinyMCE.init(myTinyInit);
这可确保将内容定期保存到保存值的textarea上。下一步是设置请求事件。
ajax发布之前通常tinyMCE mceAddControl
和ajax成功之后的mceRemoveControl
应该可以解决问题。但我发现通常不起作用。
在我的例子中,我使用了表单作为jQuery选择器。
jQuery( '.myForm' )
.find( 'textarea#myTextArea' )
.ajaxStart(function() {
// If you need to copy over the values, you can do it here.
// If you are using jQuery form plugin you can bind to form-pre-serialize event instead.
// jQuery( this ).val( tinyMCE.get( jQuery( this ).attr( 'id' )).getContent() );
}).ajaxSend( function() {
// ! - step 2
// My case was multiple editors.
myEds = tinyMCE.editors;
for( edd in myEds ) {
myEds[ eds ].remove();
}
// tinyMCE.get( 'myTextarea' ).remove();
// strangely mceRemoveControl didnt work for me.
// tinyMCE.execCommand( 'mceRemoveControl', false, jQuery( this ).attr('id'));
}).ajaxSuccess(function() {
// Now we got the form again, Let's put up tinyMCE again.
txtID = jQuery( this ).attr( 'id' );
// ! - step 3
tinyMCE.execCommand( 'mceAddControl', false, txtID );
// Restore the contents into TinyMCE.
tinyMCE.get( txtID ).setContent( jQuery( this ).val());
});
我遇到的问题:
mceRemoveControl
始终会给我r is undefined
错误。 mce_02
之类的东西替换了textarea的ID,这意味着TinyMCE再次被初始化或者订单有问题。如果是这样,则每次保存都会复制tinyMCE。 答案 3 :(得分:0)
我通过在ajax调用之后调用函数来解决这个问题。在我的ajax的这一部分:
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("Content").innerHTML=xmlhttp.responseText;
tinymce();
现在工作正常。