2016-05-23 11 views
0

Ich erhalte weiterhin den folgenden Fehler von der Browserkonsole, wenn ich mein Skript in meine Magento store lade. Es ist nur ein Onclick-Ereignis auf einem Div, aber ich erhalte diesen Fehler:Onclick funktioniert nicht. Die Eigenschaft 'click' von null kann nicht gelesen werden

"Uncaught TypeError: Kann Eigenschaft 'Klick' von Null nicht lesen."

Das Skript funktioniert in JSfiddle, so dass ich wirklich nicht ganz sicher bin, warum es nicht funktioniert. Ich habe versucht, es innerhalb eines $ (Dokument) .ready() auch einzuschließen, aber ich empfange den gleichen Fehler.

Code:

var step = 0; 
var deviceType = ""; 
var modelType = ""; 

function showGen(){ 
    $('.phoneTypes').css("display", "none"); 

    if (deviceType == "Samsung"){ 
     $('.sphoneGens').css("display", "block"); 
    } 
    if (deviceType == "iPhone"){ 
     $('.iphoneGens').css("display", "block"); 
    } 
    if (deviceType == "iPad"){ 
     $('.ipadGens').css("display", "block"); 
    } 
} 

// Pick Device Type 
$('.choicelabel').click(function(){ 
    deviceType = $(this).children('input').val(); 
    showGen(); 
}); 

//Pick Device Gen 
$('.choiceType').click(function(){ 
    modelType = $(this).children('input').val(); 
    //$(".iphoneGens").css("display", "none"); 
    console.log(deviceType); 
    console.log(modelType); 
    $(this).parents(".row").hide(); 
}); 

Jede Hilfe Debuggen dieses Problem wird sehr geschätzt.

+1

Dann bedeutet das Choice oder choicelabel doesnt existieren – Li357

+1

Sollte es dann nicht leer jQuery Sammlung zurück? –

+0

Ich stelle fest, dass die meisten Klassen camelCased sind außer '.choicelabel', ist das ein Tippfehler, wo es '.choiceLabel' sein sollte? – TowerFan

Antwort

4

TL; DR:

jQuery(document).ready(function($) { 
    // Code using $ as usual goes here. 
    // And document is ready too 
}); 

Was das Problem ist?

Prototype.js wurde nach jQuery geladen und wurde global $ Symbol überschrieben.

Wie können wir damit umgehen?

Sie haben noch jQuery global zu verwenden. Verwenden Sie es einfach überall, wo Sie $ verwenden möchten.

// Pick Device Type 
jQuery('.choicelabel').click(function(){ 
    deviceType = jQuery(this).children('input').val(); 
    showGen(); 
}); 

//Pick Device Gen 
jQuery('.choiceType').click(function(){ 
    modelType = jQuery(this).children('input').val(); 
    //jQuery(".iphoneGens").css("display", "none"); 
    console.log(deviceType); 
    console.log(modelType); 
    jQuery(this).parents(".row").hide(); 
}); 

Sie können auch einige Kurzschrift definieren für sie vereinfachen:

jQ = jQuery; 

gemeinsame bewährte Methode für Fälle wie diesen IIFE wrap für Ihren Code zu verwenden ist:

;(function($){ // see note-1 
    // Use $ here! It's jQuery now 
    $(function(){ 
    // be sure DOM was loaded before work with it(ex: binding events) 
    }); 
})(jQuery); 

Dies fügt dem globalen Umfang nichts hinzu und erreicht, was wir brauchen.
Sie können immer einige andere Bibliotheken (prototypejs?) Mit Alias ​​injizieren, was Sie zu diesem IIFE wollen.

hinweis-1: Semikolon vor IIFE schützt JavaScript vor einem Ausdruck mit einem verpassten Semikolon, das als Funktionsaufruf interpretiert werden soll.


jQuery selbst stellt eine Abkürzung für diesen Fall:

jQuery(document).ready(function($) { 
    // Code using $ as usual goes here. 
    // And document is ready too 
}); 
+1

einige jQuery-Plugins können sich auf '$' globales Symbol verlassen. Sie sind schlechter gestaltete Plugins und alles, was Sie tun können, ist seinen Code mit IIFE aus einer Antwort zu wickeln. Möglicherweise möchten Sie alle von ihnen zu einigen "jquery.libs.js" für diese zusammenführen. Oder Sie können Ihre Abhängigkeiten vereinfachen: Benötigen Sie wirklich sowohl jQuery als auch Prototype.js? –

+0

'jQuery ist nicht definiert' - Fügen Sie onLoad stuff hinzu:' jQuery (function() {...}) ' –

+0

Prototyp wird von einem Magento Theme geladen. Nicht wirklich sicher, welche Funktionalität es benutzt. Ich habe die ganze Funktion mit dem IIFE verpackt, aber immer noch keine Funktionalität. Sie können die Javascript-Datei hier sehen: http://phoneparter.com/js/parter.js – Query

0

Diese Stelle ist jQuery nicht verwendet wird, ist es mit prototypejs

+1

Es verwendet tatsächlich beide, aber jQ wurde überschrieben. Es ist nur ein bisschen weniger Glück :) –