Menggunakan `window.location.hash.includes` melempar" Objek tidak mendukung properti atau metode 'termasuk' "di IE11

173

Saya memeriksa URL untuk melihat apakah URL itu berisi atau termasuk ?di dalamnya untuk mengontrol status pop hash di jendela. Semua browser lain tidak mengalami masalah, hanya IE.

Debugger memberi saya kesalahan ini ketika saya mencoba memuat dengan cara ini:

Objek tidak mendukung properti atau metode ' includes'

Saya tidak mendapatkan kesalahan ketika saya memuat halaman melalui 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')});
            };
        });
});
Erik Grosskurth
sumber
Berapa nilai window.location.hashdi internet explorer 11?
nils

Jawaban:

242

Menurut halaman referensi MDN , includestidak didukung di Internet Explorer. Alternatif paling sederhana adalah menggunakan indexOf, seperti ini:

if(window.location.hash.indexOf("?") >= 0) {
    ...
}
GOTO 0
sumber
1
OK baik sekarang saya tidak bisa mendapatkan ini berfungsi jika (window.location.hash.indexOf ("?")> = 0) {// do nothing} else {location.href = location.href + '?'; }
Erik Grosskurth
Saya perlu menambahkan? ke akhir url jika url belum memilikinya
Erik Grosskurth
1
Saya tahu ini adalah pertanyaan dan jawaban lama, tetapi String.prototype.includes tampaknya bekerja untuk saya di Windows 10 IE 11.
troxwalt
2
@troxwalt Bagus untuk didengar, tetapi masih tidak berfungsi pada Windows 7 IE11!
nevada_scout
Jika Anda Bereaksi , Anda dapat menggunakan paket polyfill dan menghindari menambahkan polyfill secara manual ...
CPHPython
58

IE11 tidak mengimplementasikan String.prototype.includes jadi mengapa tidak menggunakan Polyfill resmi?

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

Sumber: sumber polyfill

thiagoh
sumber
1
Anda juga bisa menggunakan polyfill dari core-js yang ditemukan di sini: github.com/zloirock/core-js#stage-4-proposals
David Barreto
@DavidBarreto memang! Dan untuk Bereaksi, jawaban yang lebih baru ditambahkan di sini .
CPHPython
36

Menambahkan import 'core-js/es7/array';untuk saya polyfill.tstetap masalah bagi saya.

JCisar
sumber
Ini telah diposting sejak lama, tetapi mungkin ini dapat membantu seseorang pada kerangka kerja yang lebih baru namun saya pikir jawaban yang dipilih harus cukup untuk apa pun di luar kasus penggunaan khusus.
Erik Grosskurth
1
impor 'core-js / es / array'; pada 2020
timhc22
14

Saya memiliki masalah serupa dengan proyek Angular. Di polyfills.ts saya, saya harus menambahkan keduanya:

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

Selain mengaktifkan semua default IE 11 lainnya. (Lihat komentar di polyfills.ts jika menggunakan sudut)

Setelah menambahkan impor ini kesalahan hilang dan data Object saya terisi sebagaimana dimaksud.

bsheps
sumber
Ini bekerja untuk saya. Apa yang dilakukan kedua impor itu? Dan impor apa yang diperbaiki termasuk kesalahan ?. Atau keduanya untuk error include?
iamjoshua
Karena IE11 tidak lagi menerima pembaruan fitur oleh Microsoft, implementasi javascript adalah tanggal dan hanya memiliki dukungan untuk metode melalui ES5. Dengan mengimpor 2 file ini, Anda menambahkan skrip polyfill untuk Array dan Object melalui ES7 yang mencakup metode 'include'.
bsheps
5

Seperti di Internet Explorer, metode javascript "termasuk" tidak mendukung yang mengarah ke kesalahan seperti di bawah ini

dijit.form.FilteringSelect TypeError: Objek tidak mendukung properti atau metode 'termasuk'

Jadi saya telah mengubah metode string JavaScript dari "include" menjadi "indexOf" seperti di bawah ini

//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");
}
satish hiremath
sumber
3

Saya telah menggunakan includesdari Lodashyang benar-benar mirip dengan asli.

Moacir Rosa
sumber
1

Saya menggunakan ReactJs dan digunakan import 'core-js/es6/string';pada awal index.jsuntuk menyelesaikan masalah saya.

Saya juga menggunakan import 'react-app-polyfill/ie11';untuk mendukung menjalankan Bereaksi di IE11.

reaksi-aplikasi-polyfill

Paket ini termasuk polyfill untuk berbagai browser. Ini mencakup persyaratan minimum dan fitur bahasa yang umum digunakan yang digunakan oleh proyek Create React App.

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

Bhushan Babar
sumber
1
Saya mulai secara manual mengisi semua fungsi yang gagal di konsol IE11 ... Sangat menghargai jawaban penghemat waktu Anda. Untuk menambahkan 2 paket tersebut sekaligus ke package.json Anda :npm i --save core-js react-app-polyfill
CPHPython
Btw, core-js/es6sepertinya tidak ada lagi di v3, jadi import 'core-js';seperti yang disarankan di Github .
CPHPython
0

Pertanyaan ini dan jawabannya membawa saya ke solusi saya sendiri (dengan bantuan dari SO), meskipun beberapa orang mengatakan Anda tidak boleh mengutak-atik prototipe asli:

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

Kemudian saya mengganti semua .includes()dengan .doesInclude()dan masalah saya terpecahkan.

TecBrat
sumber
2
.includes ()bekerja pada string dan array. substring()Solusi Anda hanya berfungsi dengan string dan gagal dengan array. Seperti yang dijawab oleh orang lain, menggunakan indexOf()bukan substring()lebih baik karena ini berfungsi dalam kedua kasus.
Memet Olsen