2014-03-29 14 views
5

Ich versuche, jQuery-Funktion aufzurufen, wenn auf die Schaltfläche geklickt wird. Aber ich erhalte die Fehlermeldung wie folgt:Uncaught ReferenceError: Funktion ist nicht definiert jQuery

Uncaught Reference: update_question_ajax ist nicht definiert

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; 
    } 
}); 

Ich schätze, wenn euch mir helfen darüber.

Vielen Dank!

+1

Sie müssen den JavaScript-Code vor dem HTML laden. Hast du es am Ende des Dokuments, oder? – Lucio

+0

Ich benutze MVC-Muster und Skript ist in der Ansicht. – curiozity

Antwort

10

Scheint, ein Bereichsproblem zu sein. Sie haben die Funktion im Wesentlichen in einer anderen Funktion definiert. Sie sollten auch versuchen, PHP in Javascript zu vermeiden. Technisch funktioniert es, ist aber nicht wirklich gute Form.

Der Inline-Click-Handler wurde entfernt.

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

Dann erstellen wir eine Selbst ausgeführte Funktion, übergeben jQuery in wie $, die alles in der Fähigkeit gibt, „$“, wie jQuery zu verwenden. Definieren Sie dann Ihren Click-Handler für die Schaltfläche und verwenden Sie ein Datenattribut, um die ID zu übergeben, anstatt PHP in Ihrem JS zu verwenden und es im DOM zu platzieren. Fühlt sich einfach ein bisschen sauberer an. Stellen Sie außerdem sicher, dass Sie jquery/andere Skripte direkt vor dem geschlossenen Text am unteren Rand des Dokuments laden. Auf diese Weise benötigen Sie kein .ready, weil Ihr Dokument bereits geladen ist.

(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

So eine großartige Erklärung! Ich werde das als Antwort akzeptieren. Aber ich habe ein Problem.Click-Handler (button.update-question) löst das Ereignis nicht aus. – curiozity

+0

Haben Sie Ihre JS-Code in der des Dokuments oder am Ende in der Nähe der Schließung des Körpers? Wenn es im Kopf ist, wird die Funktion ausgelöst, bevor das DOM geladen wird, so dass das Element nicht ordnungsgemäß an den Event-Handler gebunden wird. Versuchen Sie, Ihre Referenz auf JQ direkt über dem schließenden Body-Tag zu verschieben, und fügen Sie dann unter dem obigen Code ein weiteres

7

Sie sollten die Funktionsdefinition outside des document.ready Rückruf ($(function() { ... }) bewegen:

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; 
} 

Alles, was Sie in der $(function() {} setzen ausgeführt wird, wenn das DOM bereit ist, ist nicht auf den Umfang privat.

Wenn auf der anderen Seite Sie unaufdringliche Javascript verwenden möchten, dann dieses onclick Attribut aus Ihrem Markup loszuwerden:

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

und dann das Dokument bereit Rückruf verwenden unaufdringlich zum .click Ereignis abonnieren von diese Tasten:

$(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

Eigentlich funktioniert das. Aber in diesem Fall, input.val(); Gibt eine undefinierte oder leere Zeichenfolge zurück. Also habe ich nach dem gesucht und ich fand etwas sagt: "Verschieben der Funktionsdefinition in das Dokument.ready." Ich bin wirklich so verwirrt! – curiozity

+0

Der Grund, warum Sie undefiniert werden, liegt darin, dass Sie einen ID-Selektor verwenden: '$ ('# question-id -' + id)' aber Ihre Schaltfläche hat nicht einmal ein Attribut 'id'. Stellen Sie sicher, dass ein entsprechendes Element in Ihrem DOM mit dieser ID vorhanden ist. –

+0

Darin Letzte Frage: Ich benutze folgenden Selektor, um den Wert der Eingabe zu erhalten: var editedQuestionObj = $ ('. Edit-question-' + id + 'Eingabe [Name = "übersetzt"]'). Val(); Ich versuche, diese Ereignisschaltfläche onclick auszulösen. Was ist die Verbindung zwischen dem ID-Attribut meiner Schaltfläche und dem Selektor? – curiozity

Verwandte Themen