2011-11-06 86 views
1

所以我有一個包含調用httpRequest的鏈接的頁面。該請求調用一個從mysql獲取數據的php文件,並預填充一個表單然後返回到瀏覽器/網頁。我的問題是,當通過httpRequest/ajax將頁面返回給瀏覽器時,文本區域不會顯示tinymce編輯器,它只會顯示普通文本區域。它看起來像我的請求和Ajax工作正常的文本區域沒有tinycme編輯器。TinyMCE在http請求中不起作用xhr ajax生成頁面

當我不使用AJAX它工作正常,但是當我把它放在一個單獨的文件,並通過AJAX調用它,它不會在TinyMCE的編輯器帶來的。

有誰知道如何讓自己的AJAX生成的頁面顯示與TinyMCE的編輯文本區域解決這個問題。謝謝。這裏

+0

如果httpRequest響應是你用老的替換的html比你不得不重新初始化thinyMCE,而是這樣做,我會建議你使用JSON作爲響應,只需更新textarea的值 –

+0

你能詳細說明一下嗎?我從來沒有使用JSON,但聽起來像你理解我的問題。我將如何實現這一點? – user982853

+0

我會加入回答 –

回答

0

我通過在ajax調用之後調用函數來解決了這個問題。在我的ajax的這部分:

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("Content").innerHTML=xmlhttp.responseText; 
    tinymce(); 

現在它工作正常。

+0

我不能讓它工作。 tinymce()的定義在哪裏? – deepakgates

0

問題將是當您返回完整的頁面,並使用Ajax響應渲染它,你的TinyMCE的實例尚未關閉之前。 爲了做到這一點,你可以調用這個小塊代碼渲染Ajax響應前:

tinymce.execCommand('mceRemoveControl',true,'editor_id'); 

在這種情況下,編輯應正確初始化。在關閉第一個關閉之前,您不允許使用相同的ID初始化tinymce編輯器。

+0

我是一個新手,不知道我把這一點的代碼。我有三個文件,wepage,我的js腳本,它調用一個php頁面並將結果返回給網頁。我把這個代碼放在哪個文件中以及文件中的哪個位置。這個小小的代碼也放在腳本標籤中嗎?謝謝。 – user982853

+0

你需要把它放在ajax-success函數之前,「mceAddControl」調用 – Thariama

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。下一步是設置請求事件。

通常tinyMCE mceAddControl之前的ajax後和mceRemoveControl ajax成功後應該做的伎倆。但我發現這往往不起作用。

我使用的形式,在我的情況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()); 

}); 

問題,我碰到:

  1. 使用mceRemoveControl一直堅持給我r is undefined錯誤。
  2. 如果你得到一個空白TinyMCE的編輯器,檢查DOM textarea的ID是否被更換的東西,如mce_02,這意味着TinyMCE的再次被初始化或東西是錯誤的順序。如果是這樣,則每次保存時都會複製tinyMCE。
  3. 如果你是新的JS,我建議使用jQuery與form插件,它可能會更加容易。但是使用常規的非jquery tinyMCE,因爲它有很好的文檔。
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阿賈克斯將調用URL /page/12.json將返回JSON作爲響應。該響應的最低限度可以是:

{ 
    title: "Page title", 
    body: "<html><head><title>Page title</title>......</html>" 
} 

我連着匿名函數回調將處理來自服務器的響應。並隱藏在ajax調用之前顯示的進度指示器。

關於JSON

JSON是縮短JavaScript對象符號的。這是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的時候,你可以使用$.get(url, callback);來做同樣的事情。我答案頂部的代碼不會發生顯着變化。作爲響應而不是創建JSON,您將獲得HTML格式的字符串。

-----------底線-------

我更喜歡JSON,因爲它可以很容易地後與其他屬性擴展,所以沒有痛苦的代碼更改後;)