2011-11-06 3 views
1

그래서 httpRequest를 호출하는 링크가있는 페이지가 있습니다. 요청은 mysql에서 데이터를 가져 와서 폼을 미리 채운 다음 브라우저/웹 페이지로 반환되는 PHP 파일을 호출합니다. 내 문제는 httpRequest/ajax를 통해 페이지가 브라우저로 반환 될 때 텍스트 영역에 주석 편집기가 표시되지 않는다는 것입니다. 일반 텍스트 영역 만 표시합니다. 내 요청과 아약스 잘 작동하는 텍스트 영역 그냥 tinycme 편집기가없는 것처럼 보입니다.TinyMCE가 http 요청에서 작동하지 않습니다. xhr ajax가 생성 된 페이지

아약스를 사용하지 않으면 잘 작동하지만 별도의 파일에 넣고 아약스를 통해 호출하면 주석 편집기가 표시되지 않습니다.

내 아약스 생성 페이지에 tinymce 편집기가있는 텍스트 영역이 표시되도록이 문제를 해결하는 방법을 아는 사람이 있습니까? 고맙습니다.

+0

만약 httpRequest 응답이 html로 바뀌었다면 당신은 thinyMCE를 다시 초기화해야만하는 것이 아니라 오히려 응답으로 JSON을 사용하고 textarea의 값을 업데이트 할 것을 제안합니다 –

+0

이것에 대해 자세히 설명해 주시겠습니까? 나는 JSON을 사용한 적이 없지만 내 문제를 이해하는 것처럼 들린다. 어떻게 구현합니까? – user982853

+0

대답에 추가 할 것입니다 –

답변

0

이 문제는 ajax 호출 후 함수를 호출하여 해결되었습니다. 내 아약스의이 부분에서 :

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

이제 제대로 작동합니다.

+0

제대로 작동하지 않습니다. tinymce()의 정의는 어디에 있는가? – deepakgates

0

여기에서 문제는 전체 페이지를 반환하고 ajax 응답을 사용하여 렌더링 할 때 tinymce 인스턴스가 이전에 종료되지 않았기 때문입니다.

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

에디터가 제대로 초기화한다이 경우 : 당신은 아약스 응답을 렌더링하기 전에 코드의이 작은 조각을 호출 할 수 있습니다이 작업을 수행하기 위해 . 처음 idem을 닫기 전에 id가 같은 주석 편집기를 초기화 할 수 없습니다.

+0

저는 초보자이며이 코드를 어디에 넣을 지 모르겠습니다. 나는 세 개의 파일, wepage, PHP 페이지를 호출하고 웹 페이지에 결과를 반환하는 js 스크립트를 가지고있다. 어떤 파일에이 코드를 넣을 수 있으며 파일에 어디에 넣어야합니까? 또한이 작은 코드가 스크립트 태그에 포함됩니까? 고맙습니다. – user982853

+0

"mceAddControl"을 호출하기 전에 바로 ajax-success 함수에 넣어야합니다. – 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); 

이렇게하면 값을 보유하고있는 텍스트 영역에 콘텐츠가 정기적으로 저장됩니다. 다음 단계는 요청 이벤트를 설정하는 것입니다.

아약스 게시 전에 일반적으로 tinyMCE mceAddControl 및 아약스 성공 후 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()); 

}); 

문제는 내가 건너 온 :

  1. mceRemoveControl를 사용하여 항상 지속적으로 나에게 r is undefined 오류를했다.
  2. 빈 tinyMCE 편집기가있는 경우 DOMarea가 mce_02과 같은 것으로 바뀌 었는지 확인하십시오. 즉, TinyMCE가 다시 초기화되거나 순서가 잘못된 것입니다. 그렇다면 tinyMCE는 각 저장과 중복됩니다.
  3. JS를 처음 사용하는 경우 form 플러그인으로 jQuery를 사용하는 것이 좋습니다. 더 쉽게 할 수 있습니다. 그러나 잘 문서화되어 있듯이 정규 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 아약스에 그 응답으로 JSON을 반환 URL /page/12.json를 호출합니다 볼 수 있습니다. 응답의 최소값은 다음과 같습니다.

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

서버의 응답을 처리하는 콜백으로 익명 함수를 첨부했습니다. 아약스 호출 전에 표시되는 진행 표시기를 숨 깁니다. JSON에 대해

JSON 자바 스크립트 객체 표기법의 단축된다. 자바 스크립트 코드입니다! 그래서 그것에 대해 혼동하지 마십시오. 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 솔루션에 대한 대안은 일반 HTML은 (귀하의 질문에서 당신이 뭔가가 있다고 가정 할 수 있습니다 서버 및 응답 그냥 비행기 아약스 호출을 수 이미 이렇게). 그래서 $.getJSON을 호출하는 instad는 $.get(url, callback);을 사용하여 같은 일을 할 수 있습니다. 내 대답의 상단에있는 코드가 크게 바뀌지는 않습니다. 응답으로 JSON을 얻는 대신 HTML 인 문자열을 얻습니다.

----------- BOTTOM 라인 ------- 내가 쉽게 다른 속성을 나중에 확장 할 수 있기 때문에 JSON을 선호하는, 그래서 나중에 더 고통스러운 코드 변경이없는

;)

관련 문제