IE 11에서 실행되지 않는 코드, Chrome에서 제대로 작동


156

다음 코드는 Chrome에서 문제없이 실행될 수 있지만 Internet Explorer 11에서는 다음 오류가 발생합니다.

객체가 속성 또는 메소드 'startsWith'를 지원하지 않습니다

요소의 ID를 변수에 저장하고 있습니다. 이슈가 뭐야?

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>


9
str.indexOf("REP") == 0대신 IE 를 사용해야 할 수도 있습니다 .
그랜트 토마스

1
ES6는 표준 아직없는 kangax.github.io/compat-table/es6는 이 전이 도움을주는 ES6 심 라이브러리입니다 github.com/paulmillr/es6-shim 그냥 ES5에 대한 등으로 (모든 것이 포함 shimmable입니다)
Xotic750

답변:


320

String.prototype.startsWith 가장 최신 버전의 JavaScript 인 ES6의 표준 방법입니다.

아래 호환성 표를 보면 Internet Explorer 버전을 제외한 모든 현재 주요 플랫폼에서 지원되는 것을 알 수 있습니다 .

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

.startsWith자신 을 구현해야합니다 . 다음은 polyfill입니다 .

if (!String.prototype.startsWith) {
  String.prototype.startsWith = function(searchString, position) {
    position = position || 0;
    return this.indexOf(searchString, position) === position;
  };
}

3
또 다른 구현이 있습니다 MDN 웹 문서 String.prototype.startsWith = function(search, pos) { return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; };
oCcSking

1
@Oka가 제공 한 첫 번째 구현 경향이 있습니다. 추가 개선과 마찬가지로 "위치"가 실제로 숫자인지 테스트 할 수 있습니다. position =! isNaN (parseInt (position))? 위치 : 0;
ErnestV

36

text.indexOf("newString")대신 가장 좋은 방법입니다 startsWith.

예:

var text = "Format";
if(text.indexOf("Format") == 0) {
    alert(text + " = Format");
} else {
    alert(text + " != Format");
}

왜 가장 좋은 방법입니까?
TylerH

1
startsWith를 대체하지 않는 indexOf 메소드, indexOf는 주어진 문자열에서 임의의 위치와 일치하면 값을 반환합니다 .indexOf를 사용하지 않는 것이 좋습니다.
RajKumar Samala

12
indexOf반환 값을 않지만, @Jona은 반환 값이 0임을 확인했다 (즉, 문자열 시작 부분), 그것은 의미 입니다 에 대한 좋은 교체 startsWith!
SharpC

이것은 폴리 필을 추가하거나 추가 라이브러리를 가져올 필요없이 폴리 필과 동일한 기능입니다. 그것은 훌륭한 솔루션입니다-내가 볼 수있는 유일한 단점은 아마도 코드 가독성 일 것입니다-함수의 이름이 startsWith 일 때 의도가 더 명확합니다.
John T

13

이 경우 각도 2+ 응용 프로그램에서 어떤 일이 일어나고을 수행 할 수 있습니다 단지 주석 의 문자열 polyfills polyfills.ts :

import 'core-js/es6/string';

Oka의 polyfill 수정 프로그램을 추가했지만 Angular 5 응용 프로그램에서 작동하지 않지만 import 'core-js/es6/string';수정했습니다. 많은 감사합니다!
decebal

5

startsWith 기능을 다음과 같이 바꾸십시오.

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

이것은 IE를 포함한 모든 브라우저를 지원합니다

시작 위치 0부터 문자열 일치를 위해 위치를 0으로 설정할 수 있습니다.


프로토 타입을 다시 작성하거나 폴리 필을 사용하지 않고도 유용한 솔루션입니다. 또한 브라우저간에 광범위하게 호환됩니다. +1
Sergio A.

2

다른 사람들이 말했듯이 startsWith와 endsWith는 ES6의 일부이며 IE11에서는 사용할 수 없습니다. 우리 회사는 항상 lodash 라이브러리를 IE11의 폴리 필 솔루션으로 사용합니다. https://lodash.com/docs/4.17.4

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

0

오카의 게시물은 훌륭하게 작동하지만 약간 구식 일 수 있습니다. lodash 가 하나의 단일 기능으로 해결할 수 있다는 것을 알았 습니다. lodash를 설치 한 경우 몇 줄을 절약 할 수 있습니다.

단지 시도:

import { startsWith } from lodash;

. . .

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

0

나는 또한 최근 조사에 직면했다. 에서 시작하는 것과 비슷한 ^를 사용하여 해결했습니다 jquery. 말하다,

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

우리는 사용할 수 있습니다

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

여기서 str은 요소의 id입니다.


0

angular2 + 프로젝트로 작업 할 때 문제가 발생하면이 방법을 따르십시오

이 오류가 발생했을 때 해결책을 찾고 있었고 여기에 도착했습니다. 그러나이 질문은 구체적 인 것처럼 보이지만 오류는 일반적인 오류가 아닙니다. Internet Explorer를 다루는 각도 개발자에게는 일반적인 오류입니다.

각도 2 이상으로 작업하는 동안 동일한 문제가 발생했으며 몇 가지 간단한 단계만으로 해결되었습니다.

Angular 최신 버전에는 polyfills.ts에 주석이 달린 코드가 있습니다. Internet Explorer 버전 IE09, IE10 및 IE11에서 원활하게 실행하는 데 필요한 모든 polyfill이 표시됩니다

/** 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';

코드의 주석 처리를 제거하면 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';

그러나 다른 브라우저에 비해 IE 브라우저의 성능이 저하 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.