Kode tidak berjalan di IE 11, berfungsi dengan baik di Chrome

156

Kode berikut dapat dijalankan tanpa masalah di Chrome, tetapi melempar kesalahan berikut di Internet Explorer 11.

Objek tidak mendukung properti atau metode 'dimulai dengan'

Saya menyimpan ID elemen dalam sebuah variabel. Apa masalahnya?

function changeClass(elId) {
  var array = document.getElementsByTagName('td');
  
  for (var a = 0; a < array.length; a++) {
    var str = array[a].id;
    
    if (str.startsWith('REP')) {
      if (str == elId) {
        array[a].style.backgroundColor = "Blue";
        array[a].style.color = "white";
      } else {
        array[a].style.backgroundColor = "";
        array[a].style.color = "";
      }
    } else if (str.startsWith('D')) {
      if (str == elId) {
        array[a].style.backgroundColor = "Blue";
        array[a].style.color = "white";
      } else {
        array[a].style.backgroundColor = "";
        array[a].style.color = "";
      }
    }
  }
}
<table>
  <tr>
    <td id="REP1" onclick="changeClass('REP1');">REPS</td>
    <td id="td1">&nbsp;</td>
  </tr>
  <tr>
    <td id="td1">&nbsp;</td>
    <td id="D1" onclick="changeClass('D1');">Doors</td>
  </tr>
  <tr>
    <td id="td1">&nbsp;</td>
    <td id="D12" onclick="changeClass('D12');">Doors</td>
  </tr>
</table>

Bhushan Dhamdhere
sumber
9
Anda mungkin harus menggunakan str.indexOf("REP") == 0IE.
Hibah Thomas
1
ES6 belum menjadi standar kangax.github.io/compat-table/es6 Ada perpustakaan shim ES6 untuk membantu transisi github.com/paulmillr/es6-shim Sama seperti untuk ES5 (termasuk tidak semua barang dapat di shimmable)
Xotic750

Jawaban:

320

String.prototype.startsWith adalah metode standar dalam versi terbaru JavaScript, ES6.

Melihat tabel kompatibilitas di bawah ini, kita dapat melihat bahwa itu didukung pada semua platform utama saat ini, kecuali versi Internet Explorer.

╔═══════════════╦════════╦═════════╦═══════╦═══════════════════╦═══════╦════════╗
    Feature     Chrome  Firefox  Edge   Internet Explorer  Opera  Safari 
╠═══════════════╬════════╬═════════╬═══════╬═══════════════════╬═══════╬════════╣
 Basic Support     41+      17+  (Yes)  No Support            28       9 
╚═══════════════╩════════╩═════════╩═══════╩═══════════════════╩═══════╩════════╝

Anda harus menerapkan .startsWithsendiri. Ini adalah polyfill :

if (!String.prototype.startsWith) {
  String.prototype.startsWith = function(searchString, position) {
    position = position || 0;
    return this.indexOf(searchString, position) === position;
  };
}
Oka
sumber
3
ada implementasi lain di MDN web docs String.prototype.startsWith = function(search, pos) { return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; };
oCcSking
1
Saya cenderung implementasi pertama seperti yang diberikan oleh @Oka. Sama seperti penyempurnaan tambahan, orang mungkin menguji "posisi" benar-benar numerik: posisi =! IsNaN (parseInt (posisi))? posisi: 0;
ErnestV
36

text.indexOf("newString")adalah metode terbaik, bukan startsWith.

Contoh:

var text = "Format";
if(text.indexOf("Format") == 0) {
    alert(text + " = Format");
} else {
    alert(text + " != Format");
}
Jona
sumber
Mengapa ini metode terbaik?
TylerH
1
Metode indexOf bukan pengganti untuk beginWith, indexOf akan mengembalikan nilai jika cocok dengan string mana pun yang diberikan, saya tidak menyarankan untuk menggunakan indexOf.
RajKumar Samala
12
indexOftidak mengembalikan nilai, tetapi @Jona telah memeriksa bahwa nilai kembali adalah nol (yaitu string di awal), yang berarti itu adalah pengganti yang baik untuk startsWith!
SharpC
Ini adalah fungsi yang sama dengan polyfill tanpa harus menambahkan polyfill atau membawa perpustakaan tambahan. Ini adalah solusi yang sangat baik - satu-satunya downside yang bisa saya lihat adalah mungkin keterbacaan kode - maksudnya lebih jelas ketika fungsi tersebut dinamai beginWith.
John T
13

Jika ini terjadi di aplikasi Angular 2+, Anda bisa saja menghapus komentar string polyfills di polyfills.ts :

import 'core-js/es6/string';
Vitaliy Ulantikov
sumber
Saya menambahkan perbaikan polyfill Oka, tetapi tidak berhasil bagi saya pada aplikasi 5 Angular saya, tetapi import 'core-js/es6/string';memperbaikinya. Terimakasih banyak!
Decebal
5

Ganti fungsi beginWith dengan:

yourString.indexOf(searchString, position) // where position can be set to 0

Ini akan mendukung semua browser termasuk IE

Posisi dapat diatur ke 0 untuk pencocokan string dari posisi awal yang berarti posisi ke-0.

Celana Harshit
sumber
Solusi yang berguna tanpa harus menulis ulang prototipe atau menggunakan polyfill. Plus itu sangat kompatibel di antara browser. +1
Sergio A.
2

Seperti yang orang lain katakan beginWith dan endsWith adalah bagian dari ES6 dan tidak tersedia di IE11. Perusahaan kami selalu menggunakan perpustakaan lodash sebagai solusi polyfill untuk IE11. https://lodash.com/docs/4.17.4

_.startsWith([string=''], [target], [position=0])
mbokil
sumber
0

Meskipun pos Oka berfungsi dengan baik, posisinya mungkin agak ketinggalan jaman. Saya menemukan pondok itu dapat mengatasinya dengan satu fungsi tunggal. Jika Anda telah menginstal lodash, ini mungkin menghemat beberapa baris.

Coba saja:

import { startsWith } from lodash;

. . .

    if (startsWith(yourVariable, 'REP')) {
         return yourVariable;        
    return yourVariable;
       }      
     }
TheGabornator
sumber
0

Saya juga baru-baru ini menghadapi masalah. Saya diselesaikan menggunakan ^ yang mirip dengan startwith di jquery. Mengatakan,

var str = array[a].id;
if (str.startsWith('REP')) {..........}

kita bisa menggunakan

if($("[id^=str]").length){..........}

Di sini, str adalah id elemen.

Pembelajaran Pengguna
sumber
0

Ikuti metode ini jika ada masalah saat bekerja dengan proyek angular2 +

Saya sedang mencari solusi ketika saya mendapatkan kesalahan ini, dan itu membuat saya di sini. Tetapi pertanyaan ini tampaknya spesifik tetapi kesalahannya tidak, itu adalah kesalahan umum. Ini adalah kesalahan umum untuk pengembang sudut yang berurusan dengan Internet Explorer.

Saya memiliki masalah yang sama ketika bekerja dengan angular 2+, dan itu diselesaikan hanya dengan beberapa langkah sederhana.

Di versi terbaru Angular, ada kode komentar di polyfills.ts menunjukkan semua polyfill yang diperlukan untuk kelancaran dalam versi Internet Explorer IE09, IE10 dan IE11

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
//import 'core-js/es6/symbol';
//import 'core-js/es6/object';
//import 'core-js/es6/function';
//import 'core-js/es6/parse-int';
//import 'core-js/es6/parse-float';
//import 'core-js/es6/number';
//import 'core-js/es6/math';
//import 'core-js/es6/string';
//import 'core-js/es6/date';
//import 'core-js/es6/array';
//import 'core-js/es6/regexp';
//import 'core-js/es6/map';
//import 'core-js/es6/weak-map';
//import 'core-js/es6/set';

Batalkan komentar kode dan itu akan bekerja dengan sempurna di browser IE

/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/weak-map';
import 'core-js/es6/set';

Tapi Anda mungkin melihat penurunan kinerja di browser IE dibandingkan dengan yang lain :(

jithin john
sumber