2016-10-20 2 views
1

Ich bin ein Java-Programmierer, der versucht, ein wenig javaScript zu schreiben. Trage mit mir.jQuery-Fehler "kann Eigenschaft 'Aufruf' von undefined nicht lesen"

Ich möchte eine Funktion, die eine Summe aktualisiert, wenn eine Ziffer in einem der Eingabefelder in einer Tabelle eingegeben wird. Ich habe die folgende Zeile in $(document).ready(function() { ... }

$("#lineCountTable").find('input').each().bind('keyup', function() { 
    updateTotal(this); 
}); 

In Chrome Debug-Fenster, die ich erhalten:

Uncaught TypeError: cannot read property 'call' of undefined". The line number pointed to is jQuery-1.8.2.js:611.

Ich denke, ich einen Syntaxfehler haben die Funktion, bei der Definition genannt werden. Die Funktion updateTotal(inputVar) wird später in der JS-Datei ordnungsgemäß definiert; falls jemand interessiert, ist es:

function updateTotal(inputVar) { 
    var row = inputVar.closest('tr'); 
    var lineCharge = row.find("dlsRowCharge").html().trim(); 
    var total = 0.0 
    var lineCount = inputVar.val(); 
    if (isNumeric(lineCount)) { 
     total = math.abs(lineCount * lineCharge).toFixed(2); 
     row.children(".dlsRowTotal").html("$ " + total); 
    } 
} 

Ich weiß, dass diese Funktionen in der Regel inline gestellt werden; Ich würde sie lieber getrennt definieren und nennen, wenn das nicht unmöglich ist.

+3

Entfernen der leeren 'each()' und Verwendung 'on()' statt ' bind() ' –

+1

Funktionsparameter zu' $ .fn.each() 'ist obligatorisch und trotzdem macht die Verwendung von' .each() 'keinen Sinn –

+0

Also' on() 'funktioniert auf jedem Mitglied des zurückgegebenen Arrays ? – arcy

Antwort

1

Sie haben ein paar Probleme hier:

  • each() erfordert eine Handler-Funktion und ist die Ursache für Ihre Fehler. Das heißt, es ist in diesem Fall nicht erforderlich.
  • sollten Sie on() über bind() seit jQuery 1.7 verwenden.
  • this wird ein DOM-Element sein, das Sie jQuery closest() Methode nicht aufrufen können. Zugegeben, es gibt eine native closest() Methode, aber es ist noch nicht gut unterstützt. Damit der Code zuverlässig funktioniert, müssen Sie this in ein jQuery-Objekt einbinden.
  • find() erfordert einen gültigen Selektor, der nicht dlsRowCharge ist. Vermutlich sollte dies .dlsRowCharge
  • mathMath

Mit all sein sollte, was gesagt, versuchen Sie dies:

+0

Was für eine schöne vollständige Antwort - Wunsch, den Upvote-Button zu klicken, hat mehr als einmal funktioniert. Vielen Dank. Ich fürchte, ich weiß nicht, was "wrap' this "in einem jQuery-Objekt" bedeutet, aber ich nehme an, es ist in Ihrem Beispiel verkörpert. – arcy

+0

ah, fast sicher die $() um 'dies' im Anruf.Ich werde wirklich mit einem jQuery-Buch sitzen müssen, da der Job sonst gut ist und ich werde erwartet, diese Dinge zu tun ... – arcy

+0

Wenn Sie eine Chance bekommen, haben Sie einen schnellen Scan durch die Methodenliste von jQuery: http: //api.jquery.com. Auch wenn Sie nicht ins Detail gehen, geben nur die Namen der Methoden einen Hinweis darauf, was getan werden kann. –

Verwandte Themen