2014-05-15 16 views
22

Sprawdź skrzypce, aby zobaczyć występujący błąd.Javascript Uncaught Błąd odniesienia Funkcja nie została zdefiniowana

Kiedy dodaję dane (nawet jeśli zostawiam je puste) do pola tekstowego i spróbuję kliknąć "Dodaj", to nic nie da.

Otwieranie konsoli Chrome i Firefox powoduje, że mam ten sam błąd, mówi "changeText2()" nie jest zdefiniowany.

Jak mogę to naprawić? Kilka razy spotkałem się z tym błędem i przeważnie miałem naprawdę dziwne obejścia, ale nie jestem pewien, jak go uniknąć lub co robię źle.

Wygląda na to, że usunięcie deklaracji zmiennej globalnej rozwiązuje ją przez większość czasu, jednak w tym przypadku potrzebuję ich i wolę wiedzieć, dlaczego i jak ten błąd występuje.

Każda pomoc jest bardzo doceniana.

Javascript:

var list = document.getElementById('deliveryIdArray'); 
var names = []; 

function changeText2() { 
    var deliveryIdentification = document.getElementById('deliveryIdentification').value; 
    names.push(deliveryIdentification);//simply add new name to array; 
    //array changed re-render list 
    renderList(); 
} 

function renderList(){ 
    while (list.firstChild) { 
     list.removeChild(list.firstChild); 
    } 
    //create each li again 
    for(var i=0;i<names.length;i++){ 
     var entry = document.createElement('li'); 
     entry.appendChild(document.createTextNode(names[i])); 
     var removeButton = document.createElement('button'); 
     removeButton.appendChild(document.createTextNode("remove")); 
     removeButton.setAttribute('onClick','removeName('+i+')'); 
     entry.appendChild(removeButton); 
     list.appendChild(entry); 
    } 
} 


function removeName(nameindex){ 
    names.splice(nameindex,1); 
    //array changed re-render list 
    renderList(); 
} 

function getDeliveries(){ 
    return names; 
} 

HTML:

<b>Number(s): </b> 
    <input id = "deliveryIdentification" name = "deliveryIdentification" type = "text" size = "16" maxlength = "30"> 

    <!-- Array Area Creation --> 
    <input type='button' onclick='changeText2()' value='Add' /> 

    <ol id="deliveryIdArray"> 
    </ol> 

Fiddle:http://jsfiddle.net/vSHQD/

+1

Zmień zawijanie w skrzypcach (menu po lewej stronie) na "Bez obijania głowy". –

+0

@dystroy Powoduje błędy, ponieważ elementy jeszcze nie istnieją;) –

+0

to ci pomoże ... http: //stackoverflow.com/questions/17378199/uncaught-referenceerror-function-is-not-defined-w- onclick – chandu

Odpowiedz

77

W JSFiddle, kiedy ustawić zawijanie do "onLoad" lub „onDomready ", zdefiniowane funkcje to o zdefiniowane wewnątrz tego bloku i nie mogą być dostępne przez zewnętrzne programy obsługi zdarzeń.

Najprostszym rozwiązaniem jest zmienić:

function something(...) 

Do:

window.something = function(...) 
+2

To działa. http://jsfiddle.net/vSHQD/1/ zaktualizowane skrzypce pokazujące, że działa. Dziękuję za szybką i poprawną odpowiedź. – Erick

4

Zmian owijania od "onload" do "No wrap - in <body>"

funkcję zdefiniowaną ma inny zakres.

0

Jeśli używasz Angular.js, to funkcje są wbudowane w HTML, na przykład onclick = "function()" lub onchange = "function()". Nie zarejestrują się. Musisz wprowadzić zmiany w javascript. Takich jak:

$('#exampleBtn').click(function() { 
    function(); 
}); 
Powiązane problemy