L'uso di `window.location.hash.includes` genera“ L'oggetto non supporta la proprietà o il metodo 'include' ”in IE11


173

Sto controllando l'URL per vedere se contiene o include un ?in esso per controllare lo stato pop hash nella finestra. Tutti gli altri browser non hanno problemi, solo IE.

Il debugger mi dà questo errore quando provo a caricare in questo modo:

L'oggetto non supporta proprietà o metodi ' includes'

Non ottengo alcun errore quando carico la pagina attraverso il popstate.

    $(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')});
            };
        });
});

Qual è il valore di window.location.hashin Internet Explorer 11?
nils

Risposte:


242

Secondo la pagina di riferimento MDN , includesnon è supportato su Internet Explorer. L'alternativa più semplice è usare indexOf, in questo modo:

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

1
OK, ora non riesco a farlo funzionare se (window.location.hash.indexOf ("?")> = 0) {// do nothing} else {location.href = location.href + '?'; }
Erik Grosskurth,

Devo aggiungere un? fino alla fine dell'URL se l'URL non ne ha già uno
Erik Grosskurth,

1
So che questa è una vecchia domanda e risposta, ma String.prototype.includes sembra funzionare per me su Windows 10 IE 11.
troxwalt

2
@troxwalt È bello sentirlo, ma non funziona ancora su Windows 7 IE11!
nevada_scout

Se stai reagendo , puoi usare pacchetti polyfill ed evitare di aggiungere manualmente polyfill ...
CPHPython

58

Internet Explorer 11 implementa String.prototype.includes, quindi perché non utilizzare Polyfill ufficiale?

  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;
      }
    };
  }

Fonte: fonte polyfill


1
potresti anche usare il polyfill di core-js trovato qui: github.com/zloirock/core-js#stage-4-proposals
David Barreto,


36

Aggiungendo import 'core-js/es7/array';al mio polyfill.tsrisolto il problema per me.


Questo è stato pubblicato molto tempo fa, ma forse questo potrebbe aiutare qualcuno sui framework più recenti in qualche modo, tuttavia penso che la risposta selezionata dovrebbe essere sufficiente per qualsiasi cosa al di fuori di casi d'uso speciali.
Erik Grosskurth,

1
import 'core-js / es / array'; dal 2020
timhc22

14

Ho avuto un problema simile con un progetto angolare. Nel mio polyfills.ts ho dovuto aggiungere entrambi:

    import "core-js/es7/array";
    import "core-js/es7/object";

Oltre ad abilitare tutte le altre impostazioni predefinite di IE 11. (Vedi commenti in polyfills.ts se si utilizza angolare)

Dopo aver aggiunto queste importazioni, l'errore è scomparso e i miei dati Oggetto sono stati compilati come previsto.


Questo funziona per me. Cosa fanno comunque queste due importazioni? E quale importazione ha corretto l'errore include ?. O entrambi sono per l'errore include?
iamjoshua,

Poiché IE11 non riceve più aggiornamenti delle funzionalità da parte di Microsoft, l'implementazione di JavaScript è datata e supporta solo i metodi tramite ES5. Importando questi 2 file, si stanno aggiungendo gli script polyfill per Array e Object tramite ES7 che include il metodo 'include'.
bsheps,

5

Come in Internet Explorer, il metodo javascript "include" non supporta ciò che porta all'errore come di seguito

dijit.form.FilteringSelect TypeError: l'oggetto non supporta la proprietà o il metodo 'Includes'

Quindi ho modificato il metodo della stringa JavaScript da "include" a "indexOf" come di seguito

//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");
}


1

Sto usando ReactJs e usato import 'core-js/es6/string';all'inizio index.jsper risolvere il mio problema.

Sto anche usando import 'react-app-polyfill/ie11';per supportare l'esecuzione di React in IE11.

reagiscono-app-polyfill

Questo pacchetto include polyfill per vari browser. Include i requisiti minimi e le funzionalità linguistiche di uso comune utilizzate dai progetti Crea app React.

https://github.com/facebook/create-react-app/blob/master/packages/react-app-polyfill/README.md


1
Ho iniziato a compilare manualmente tutte le funzioni che non funzionano nella console IE11 ... Apprezzo molto la tua risposta in termini di risparmio di tempo. Per aggiungere quei 2 pacchetti contemporaneamente al tuo package.json :npm i --save core-js react-app-polyfill
CPHPython

A proposito, core-js/es6sembra non esistere più nella v3, così import 'core-js';come suggerito in Github .
CPHPython

0

Questa domanda e le sue risposte mi hanno portato alla mia soluzione (con l'aiuto di SO), anche se alcuni dicono che non dovresti manomettere i prototipi nativi:

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

Quindi ho sostituito tutto .includes()con .doesInclude()e il mio problema è stato risolto.


2
.includes ()funziona sia su stringhe che su array. La tua substring()soluzione funziona solo con stringhe e non funziona con array. Come hanno risposto gli altri, usare indexOf()invece di substring()è meglio perché funziona in entrambi i casi.
Memet Olsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.