2014-03-29 7 views
5

버튼을 클릭 할 때 jQuery 함수를 호출하려고합니다.잡히지 않은 ReferenceError : 함수가 정의되지 않았습니다. jQuery

catch되지 않은 오류 ReferenceError을 : 다음과 같이하지만 오류를 얻고있다 update_question_ajax은 정의되지 않은

HTML :

<button type="button" class="update-question-<?php echo $i; ?> button" onclick="update_question_ajax(<?php echo $i; ?>)" style="outline: 0 none;"><?php _e('Update') ?></button> 

jQuery를 :

$(function(){ 
    function update_question_ajax(id) 
    { 
     var test = $('.edit-question-' + id + ' input[name="translated"]'); 
     var editedQuestionId = $('#question-id-'+id).val(); 
     var editedQuestionObj = $('.edit-question-' + id + ' input[name="translated"]').val(); 
     var modalObj = $('#myQuestionModal'); 

     $.ajax({ 
      type: "POST", 
      url: "<?php echo base_url('admin/question/admin_edit_question'); ?>", 
      data:{ 
       edited_question: editedQuestionObj, 
       question: editedQuestionId 
      }, 
      success: function(){ 
       modalObj.dialog('close'); 
       modalObj.html(''); 
      }, 
      complete: function(){ 
       //window.location.reload(true); 
      } 
     }); 
     return false; 
    } 
}); 

너희들이 나를 도와 주면 내가 감사 이것에 관해서.

감사합니다.

+1

HTML보다 먼저 JavaScript 코드를로드해야합니다. 문서 끝 부분에 있으십니까? – Lucio

+0

MVC 패턴을 사용하고 스크립트가 뷰에 있습니다. – curiozity

답변

10

범위 문제인 것으로 보입니다. 기본적으로이 함수를 다른 함수 안에 정의했습니다. 당신은 또한 자바 스크립트 안에 PHP를 배치하지 않도록하려고합니다. 기술적으로는 작동하지만 실제로 좋은 형태는 아닙니다.

인라인 클릭 처리기를 제거했습니다.

<button type="button" class="update-question button" data-id="<?php echo $i; ?>" style="outline: 0 none;"><?php _e('Update') ?></button> 

그런 다음 우리는 자체 실행 함수를 만드는 jQuery를로 "$"를 사용하는 능력 안에 모든 것을 제공하는 등 $에 jQuery를 전달합니다. 그런 다음 버튼에 대한 클릭 핸들러를 정의하고 JS에서 혼합 된 PHP를 사용하여 DOM에 배치하는 대신 데이터 속성을 사용하여 ID를 전달하십시오. 조금 더 청결한 느낌. 또한 닫는 본문 바로 전에 문서 하단에 jquery/other 스크립트를로드했는지 확인하십시오. 이렇게하면 문서가 이미로드되어 있기 때문에 .ready가 필요하지 않습니다.

(function($){ 
    // Define click handler. 
    $('button.update-question').on('click', function(e){ 
     e.preventDefault(); 
     var id = $(this).data('id'); 

     update_question_ajax(id); 
    }); 

    function update_question_ajax(id) { 
     var test = $('.edit-question-' + id + ' input[name="translated"]'), 
      editedQuestionId = $('#question-id-'+id).val(), 
      editedQuestionObj = $('.edit-question-' + id + ' input[name="translated"]').val(), 
      modalObj = $('#myQuestionModal'); 

     $.ajax({ 
      type: "POST", 
      url: "YOURURL", 
      data:{ 
       edited_question: editedQuestionObj, 
       question: editedQuestionId 
      }, 
      success: function(){ 
       modalObj.dialog('close'); 
       modalObj.html(''); 
      }, 
      complete: function(){ 
       //window.location.reload(true); 
      } 
     }); 
    } 

}(jQuery)); 
+0

그런 훌륭한 설명! 나는 이것을 대답으로 받아 들일 것이다. 그러나 나는 문제가있다.클릭 핸들러 (button.update-question)는 이벤트를 발생시키지 않습니다. – curiozity

+0

문서의 에 JS 코드가로드되어 있습니까? 아니면 신체 가까이있는 끝에입니까? DOM이로드되기 전에 함수가 시작되면 요소가 이벤트 처리기에 제대로 바인딩되지 않습니다. 닫기 body 태그 바로 위의 JQ로 참조를 이동 한 다음 다른 코드

7

당신은 document.ready 콜백 ($(function() { ... })의 함수 정의 outside를 이동해야합니다 : DOM을 준비하지만, 그 범위에 민간 때이 $(function() {} 안에 넣어

function update_question_ajax(id) { 
    var test = $('.edit-question-' + id + ' input[name="translated"]'); 
    var editedQuestionId = $('#question-id-'+id).val(); 
    var editedQuestionObj = $('.edit-question-' + id + ' input[name="translated"]').val(); 
    var modalObj = $('#myQuestionModal'); 

    $.ajax({ 
     type: "POST", 
     url: "<?php echo base_url('admin/question/admin_edit_question'); ?>", 
     data:{ 
      edited_question: editedQuestionObj, 
      question: editedQuestionId 
     }, 
     success: function(){ 
      modalObj.dialog('close'); 
      modalObj.html(''); 
     }, 
     complete: function(){ 
      //window.location.reload(true); 
     } 
    }); 
    return false; 
} 

모두가 실행됩니다.

<button type="button" class="button update-question-<?php echo $i; ?>" dtaa-id="<?php echo $i; ?>" style="outline: 0 none;"><?php _e('Update') ?></button> 

을 다음 겸손의 .click 이벤트를 구독 할 문서 준비 콜백을 사용하면 눈에 거슬리지 자바 스크립트를 사용할 반면에 경우

, 다음 마크 업에서이 onclick 속성 제거 버튼 :

$(function() { 
    function update_question_ajax(id) { 
     var test = $('.edit-question-' + id + ' input[name="translated"]'); 
     var editedQuestionId = $('#question-id-'+id).val(); 
     var editedQuestionObj = $('.edit-question-' + id + ' input[name="translated"]').val(); 
     var modalObj = $('#myQuestionModal'); 

     $.ajax({ 
      type: "POST", 
      url: "<?php echo base_url('admin/question/admin_edit_question'); ?>", 
      data:{ 
       edited_question: editedQuestionObj, 
       question: editedQuestionId 
      }, 
      success: function(){ 
       modalObj.dialog('close'); 
       modalObj.html(''); 
      }, 
      complete: function(){ 
       //window.location.reload(true); 
      } 
     }); 
     return false; 
    } 


    $('.button').click(function() { 
     var id = $(this).data('id'); 
     return update_question_ajax(id); 
    }); 
}); 
+0

실제로 작동합니다. 하지만이 경우 input.val(); undefined 또는 빈 문자열을 반환합니다. 그래서 저는 그것에 대해 조사하고 있는데, "document.ready 내부에서 함수 정의를 이동하십시오."라는 것을 발견했습니다. 나는 정말로 그렇게 혼란 스럽다! – curiozity

+0

당신이 정의되지 않은 이유는 당신이 id selector를 사용하고 있기 때문입니다 :'$ ('question-id -'+ id)'그러나 당신의 버튼은'id' 속성조차 가지고 있지 않습니다. 이 ID를 가진 DOM에 해당 요소가 있는지 확인하십시오. –

+0

Darin 마지막 질문 : 나는 입력 값을 얻기 위해 다음 선택기를 사용합니다 : var editedQuestionObj = $ ('edit-question-'+ id + '입력 [name = "번역"] "). 클릭하여이 이벤트 버튼을 트리거하려고합니다. 내 버튼의 id 속성과 선택자 사이의 연결은 무엇입니까? – curiozity

관련 문제