79

Ich überprüfe die URL um zu sehen, ob sie eine enthält oder enthält? in ihm den Hash-Pop-Status im Fenster zu steuern. Alle anderen Browser haben kein Problem nur IE.IE11 - Objekt unterstützt keine Eigenschaft oder Methode 'includes' - javascript window.location.hash

Der Debugger gibt mir diese Fehlermeldung, wenn ich versuche, auf diese Weise Objekt zu laden, nicht-Eigenschaft oder Methode ‚enthält‘

ich keinen Fehler, wenn ich die Seite in tghrough der popstate laden

$(document).ready(function(e) { 
     if(window.location.hash) { 
      var hash; 
      if(window.location.hash.includes("?")) { 
       alert('I have a ?'); 
       hash = window.location.hash.substring(window.location.hash.indexOf('#') + 0,window.location.hash.indexOf('?')); 
      }else { 
       hash = window.location.hash; 
      }; 
      if (hash=="#DRS" || hash=="#DRP" || hash=="#DFFI" || hash=="#DCI" || hash=="#DCP" || hash=="#DRP" || hash=="#DRMA" || hash=="#EICS" || hash=="#ORG"){ 
       $(hash+'Content').addClass('pageOn').removeClass('pageOff'); 
      }else { 
       $('#homeContent').addClass('pageOn').removeClass('pageOff'); 
      }; 
     } else { 
      $('#homeContent').addClass('pageOn').removeClass('pageOff'); 
     } 
     $(window).on('popstate', function() { 
      var hash; 
      if(window.location.hash.includes("?")) { 
       hash = window.location.hash.substring(window.location.hash.indexOf('#') + 0,window.location.hash.indexOf('?')); 
      }else { 
       hash = window.location.hash; 
      }; 
      if (hash=="#DRS" || hash=="#DRP" || hash=="#DFFI" || hash=="#DCI" || hash=="#DCP" || hash=="#DRP" || hash=="#DRMA" || hash=="#EICS" || hash=="#ORG"){ 
       $(this).navigate({target: $(hash+'Content')}); 
       if(window.location.hash.includes("?")) { 
       }else{ 
        location.href = location.href+'?'; 
       } 
      }else { 
       $(this).navigate({target: $('#homeContent')}); 
      }; 
     }); 
}); 
+0

Was ist der Wert von 'window.location.hash' im Internet Explorer 11? – nils

+3

TL; DR Antwort: benutze .indexOf ('')> = 0 anstelle von .includes ('') – Andrew

Antwort

116

Gemäß MDN reference page wird includes nicht im Internet Explorer unterstützt. Die einfachste Alternative ist indexOf zu verwenden, wie folgt aus:

if(window.location.hash.indexOf("?") >= 0) { 
    ... 
} 
+1

OK gut jetzt kann ich das nicht zum laufen bringen, wenn (window.location.hash.indexOf ("?")> = 0) { \t \t \t \t // nichts tun \t \t \t} else { \t \t \t \t location.href = location.href + '?'; \t \t \t} –

+0

Ich muss ein hinzufügen? bis zum Ende der URL, wenn die URL nicht bereits –

+0

Vielen Dank. Das hat mein Problem gelöst. –

2

Wie in Internet Explorer, die JavaScript-Methode „enthält“ nicht unterstützt, die wie unten

dijit.form.FilteringSelect zu dem Fehler führen Typeerror: Objekt nicht-Eigenschaft oder Methode ‚enthält‘

so habe ich die JavaScript-String-Methode geändert von „enthält“ auf „indexOf“, wie unten

//str1 doesn't match str2 w.r.t index, so it will try to add object 
var str1="acd", str2="b"; 
if(str1.indexOf(str2) == -1) 
{ 
    alert("add object"); 
} 
else 
{ 
alert("object not added"); 
} 
21

IE11 implementiert String.prototype.includes also warum nicht den offiziellen Polyfill verwenden?

if (!String.prototype.includes) { 
    String.prototype.includes = function(search, start) { 
     if (typeof start !== 'number') { 
     start = 0; 
     } 

     if (start + search.length > this.length) { 
     return false; 
     } else { 
     return this.indexOf(search, start) !== -1; 
     } 
    }; 
    } 

Quelle: polyfill source

+0

Sie könnten auch die Polyfill von Core-Js hier gefunden: https: // github.com/zloirock/core-js # stage-4-proposals –

2

I includes von Lodash verwendet habe, die wirklich ähnlich den nativen ist.

0

Diese Frage und die Antworten führte mich in meine eigene Lösung (mit Hilfe von SO), obwohl einige sagen, dass Sie nicht mit nativer Prototypen manipulieren sollte:

// IE does not support .includes() so I'm making my own: 
    String.prototype.doesInclude=function(needle){ 
    return this.substring(needle) != -1; 
    } 

Dann ersetzte ich nur alle .includes() mit .doesInclude() und Mein Problem wurde gelöst.

+1

'.includes()' funktioniert sowohl in Strings als auch in Arrays. Ihre 'substring()' Lösung funktioniert nur mit Strings und schlägt mit Arrays fehl. Wie von anderen Leuten beantwortet, ist die Verwendung von 'indexOf()' anstelle von 'substring()' besser, da dies in beiden Fällen funktioniert. –

0

Ich war mit einem ähnlichen Problem konfrontiert, während Keyboard-Ereignis in IE generiert und es in Eingabefeld zu senden.

So auf jQuery geschaltet und es funktioniert gut, jQuery kümmert sich um alle inneren Details.