2017-03-07 4 views
1

Ich habe einen jQuery-Skript, das diese Konsole Fehler in Safari gibt 10:Legendes Konsole Fehler „Typeerror: undefined ist kein Objekt“ und „Nicht abgefangene Typeerror: kann Eigenschaft‚0‘von undefined“

TypeError: undefined is not an object (evaluating 'iOSversion()') 

und dies in Chrome:

Uncaught TypeError: Cannot read property '0' of undefined 

Dies ist das Skript in Frage (vereinfacht):

$(document).ready(function() { 

    //detect iOS version 
    function iOSversion() { 
     if (/iP(hone|od|ad)/.test(navigator.platform)) { 
      // supports iOS 2.0 and later 
      var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); 
      return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; 
     } 
    } 

    // this causes a console error 
    var ver = iOSversion(); 
    if (ver[0] < 10) { 
     alert('this is version 9 or below'); 
    } 

    if (ver[0] >= 10) { 
     alert('this is version 10 or above'); 
    } 

}); 

Frage: Ich bin ein relativ Anfänger mit JavaScript und kämpfen, um zu verstehen, was die Ursache des Problems ist (wie die Variable scheint korrekt definiert zu sein?) Und ich habe keine Ahnung über die [0] Fehler!). Kann mir jemand helfen zu verstehen, was schief läuft und wie man es reparieren kann?

(Die Seite dieses auf geschieht, ist here)

+0

Frage: Was gibt Ihre "iOSversion" -Funktion zurück, wenn die if-Bedingung nicht wahr ist ...? – CBroe

Antwort

1

Ihre Funktion wird etwas zurückgeben nur auf einem iOS-Plattformen, so dass, wenn Sie testen, auf Chrome oder Safari (macOS) erhalten Sie eine Fehlermeldung erhalten. ver ist undefined und hat somit keinen [0] Schlüssel.

Eine schnelle Lösung wäre, dass die Funktion auf allen Plattformen etwas Gültiges zurückgibt. Etwas wie:

function iOSversion() { 
    if (/iP(hone|od|ad)/.test(navigator.platform)) { 
     // supports iOS 2.0 and later 
     var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); 
     return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; 
    } 
    return [0]; // Return '0' by default 
} 

Vielleicht eine bessere Lösung (je nach dem genauen Problem) wäre nicht OS Erkennung zu tun, sondern feature detection.

+0

Hi @ this.lau_ danke für den Vorschlag und hilfreiche Erklärung was passiert - ich habe es versucht, aber wie die andere Lösung unten vorgeschlagen, mit dieser bewirkt die erste IF-Anweisung auf MacOS (dh. Nicht iOS - aber Ich würde erwarten, dass die "das ist nicht iOS" -Alarm zu feuern?), Steckte ich es in einem Stift hier: http://codepen.io/voodoo6/pen/MpJyyg (BTW, ich muss iOS erkennen, anstatt zu verwenden Feature-Erkennung, um mit einigen Macken mit Attributen zum Autoplaying von Inline-Videos auf iOS9 zu tun) –

+0

@ matt_50, Ihre erste 'if'-Bedingung sollte sein' if (ver [0]> 0 && ver [0] <10) {' –

+0

das funktioniert dank! Während des Tests habe ich versucht, 'return false 'hinzuzufügen, wodurch die Konsolenfehler nicht auftreten konnten - ist da etwas falsch mit diesem Ansatz? –

1

Ihre iOSVersion() -Funktion hat keinen Standardfall. Es benötigt einen Rückgabewert für den Fall, dass die Bedingung nicht als wahr ausgewertet wird.

//detect iOS version 
    function iOSversion() { 
     if (/iP(hone|od|ad)/.test(navigator.platform)) { 
      // supports iOS 2.0 and later 
      var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); 
      return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; 
     } 
     else{ 
      return [-1]; 
     } 
    } 

    var ver = iOSversion(); 
    if (ver[0] < 10 && ver[0] != -1) { 
     alert('this is version 9 or below'); 
    } 
    else if (ver[0] >= 10) { 
     alert('this is version 10 or above'); 
    } 
    else{ 
     alert('this is not iOS'); 
    } 

Was passiert, wenn Sie das oben genannte versuchen?

+0

Hallo, vielen Dank für den Vorschlag - Ich habe das versucht, aber es verursacht die erste IF-Anweisung auf MacOS zu feuern? (Dh nicht iOS.? - bin ich etwas fehlt) http://codepen.io/voodoo6/pen/qrRZdq –

+0

ich einen Fehler gemacht, bitte versuchen Sie es erneut. ver [0] bewertete bis -1, was die Prüfung von <10 besteht. Ich habe hinzugefügt, dass es auch nicht -1 ist, also sollte es jetzt funktionieren. –

+0

Das funktioniert jetzt danke! (Ich aktualisierte den ursprünglichen Codepen) Es sieht aus wie ein ähnlicher Fix, den @ this.lau_ im obigen Beitrag vorgeschlagen hat. Ich schätze Ihre Erklärung, warum die erste IF-Anweisung nicht funktionierte. Wie ich im obigen Kommentar gesagt habe, habe ich beim Testen versucht, 'return false' (anstelle von' [0] 'oder' [-1] ') hinzuzufügen und die Konsolenfehler aufgehört zu haben - ich habe einen neuen Stift hier gezeigt: http: //codepen.io/voodoo6/pen/PpWpgE).Wenn es Ihnen nichts ausmacht, mir zu helfen, zu verstehen - ist irgendetwas mit diesem Ansatz nicht in Ordnung? –

Verwandte Themen