2009-02-03 4 views
0

내 데이터베이스에 위젯을 삽입하라는 Ajax POST 요청을하는 양식이 있습니다. 양식에는 위젯에서 선택할 수있는 선택 상자가 있습니다. DB 삽입이 완료되면 선택 상자를 업데이트해야합니다. 사실 지금은 전체 양식을 대체합니다.AJAX onComplete 이벤트가 호출되기 전에 페이지의 Javascript가 실행되지 않습니다.

선택 상자에 위젯이 있기 때문에 자바 스크립트에 개체 복사본이 있어야합니다. 나는이 변수를 widget_objects라고 부른다. 업데이트 이벤트 중에 폼이 바뀌면 ruby ​​변수 < % = @widget_objects %>를 출력하고 새로 생성 된 객체를 볼 수 있습니다. 그러나 onComplete 이벤트에서 javascript var "widget_objects"에 액세스하려고하면 새 객체가 존재하지 않습니다. 페이지에서이 코드 줄을 사용하여 javascript widget_objects를 만듭니다. widget_objects = < % = @widget_objects %>;

위의 코드 줄은 Ajax 요청의 onComplete 이벤트 전에 실행되지 않습니다. 그러나, 나는 oncomplete 이벤트가 페이지가로드 된 후에 발생한다고 생각하고, 스크립트가 eval 된 것이라고 가정합니다 .... 어떤 아이디어입니까?

<%= submit_to_remote( 
        "save_widget", 
        "Save Widget & Generate Embed Code", 
        { 
         :url => widgets_url(:user_id => @user.id), 
         :update => "widget_form", 
         :method => :POST, 
         :html => { :id => "save_widget_button", 
            :onclick => "this.value='Saving...'; this.disabled = 'true';", 
            :style => "width: 220px;" 
           }, 
         :complete =>" 
          $('save_widget_button').disabled=''; 
          $('save_widget_button').value='Save Widget & Generate Embed Code'; 
          var last_id = $j('select#widget_id').children(':last').attr('value'); 
          alert(widget_objects[last_id]); 
          ", 
         :success => "reportMessage('success', request.headerJSON.success, 'save_widget_status'); $('band_form').reset();", 
         :failure => "reportMessage('failure', request.headerJSON.errors, 'save_widget_status');" 
        }) %> 

답변

1

이러한 종류의 문제를 해결하려면 Firefox의 JS 디버거 (Firebug 애드온 설치)를 사용하고 스크립트 탭에서 예외 자동 차단을 활성화 한 다음 페이지를 다시로드하십시오. Firefox가 예외 (예 : 응답 rjs에서 시작)를 가로 채면 예외가 수정됩니다. rjs 및 : complete 코드를 'try {...} catch (e) {alert (e)}'JS 래퍼로 둘러 쌀 수도 있습니다.

다음으로 JS 디버거를 사용하여 prototype.js의 respondToReadyState 메소드 내에 중단 점을 설정합니다. 여기에서 app에서 rjs 응답을 검사하고 evalResponse() 메소드를 단계별로 수행 할 수 있습니다. 꽤 빨리 좁힐 것입니다.

1

EvalScripts를 true로 설정하면 작동합니다. 다른

이 다음 도움이되지 않습니다 당신이 함수를 호출 할 수 있는지 여부를

> <script> function window.onload(){ 
> alert('I am loaded as the page 
> completes loading') } </script> 

를 사용하여 스크립트를로드 시도 할 수 있습니다 : 응답이 함수가 호출됩니다 수신 동안 아약스 호출에서로드.

1

스크립트의 타이밍이 맞지 않는 PHP 스크립트에서 이와 비슷한 현상이 발생했습니다. 그것은 AJAX 호출 후에 나타난 코드는 onSuccess 이벤트의 코드 전에 실행 할 방법에 대한 자세한 내용을했고,이 솔루션은 다음과 같이 익명 함수 내에서 전체 이벤트 응답 코드를 포장했다 :

onSuccess: function(reply) 
{ 
    resp = reply.reponseText(); 
    pieces = resp.split('|'); 
    (...etc...) 
} 

당신은 수를 당신의 : 완전한 식별자 뒤에 비슷한 것을 시도하십시오. 희망이 도움이!

관련 문제