Ich überprüfe die URL, um zu sehen, ob sie ein oder enthält? um den Hash-Pop-Status im Fenster zu steuern. Alle anderen Browser haben kein Problem nur mit IE.
Der Debugger gibt diesen Fehler aus, wenn ich versuche, auf diese Art zu laden.
Ich erhalte keine Fehlermeldung, wenn ich die Seite in den Popstate lade
$(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')});
};
});
});
Gemäß der MDN-Referenzseite wird includes
von Internet Explorer nicht unterstützt. Die einfachste Alternative ist die Verwendung von indexOf
wie folgt:
if(window.location.hash.indexOf("?") >= 0) {
...
}
IE11 implementiert String.prototype.includes. Warum also 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-Quelle
Das Hinzufügen von import 'core-js/es7/array';
zu meinem polyfill.ts
hat das Problem für mich behoben.
Ich habe includes
von Lodash
verwendet, was dem nativen sehr ähnlich ist.
Wie in Internet Explorer wird die Javascript-Methode "include" nicht unterstützt, was zu dem folgenden Fehler führt
dijit.form.FilteringSelect TypeError: Objekt unterstützt keine Eigenschaften oder Methoden 'include'
Also habe ich die JavaScript-String-Methode von "Includes" zu "IndexOf" wie folgt geändert
//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");
}
Ich verwende ReactJs und verwende import 'core-js/es6/string';
am Anfang von index.js
, um mein Problem zu lösen.
Ich verwende auch import 'react-app-polyfill/ie11';
, um das Ausführen von React in IE11 zu unterstützen.
react-App-Polyfill
Dieses Paket enthält Polyfills für verschiedene Browser. Es enthält Mindestanforderungen und häufig verwendete Sprachfunktionen, die von Create React App-Projekten verwendet werden.
https://github.com/facebook/create-react-app/blob/master/packages/react-app-polyfill/README.md
Ich hatte ein ähnliches Problem mit einem Angular-Projekt. In meinen polyfills.ts musste ich beides hinzufügen:
import "core-js/es7/array";
import "core-js/es7/object";
Zusätzlich zur Aktivierung aller anderen IE 11 Standardeinstellungen. (Siehe Kommentare in polyfills.ts, wenn Sie winkels verwenden.)
Nach dem Hinzufügen dieser Importe ging der Fehler weg und meine Objektdaten wurden wie vorgesehen aufgefüllt.
Diese Frage und ihre Antworten führten mich zu meiner eigenen Lösung (mit Hilfe von SO), obwohl einige sagen, Sie sollten sich nicht an nativen Prototypen manipulieren:
// IE does not support .includes() so I'm making my own:
String.prototype.doesInclude=function(needle){
return this.substring(needle) != -1;
}
Dann habe ich einfach alles .includes()
durch .doesInclude()
ersetzt und mein Problem wurde gelöst.