代码在 IE11中没有运行,在 Chrome 中运行良好

下面的代码在 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>

114452 次浏览

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。下面是 填料:

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

text.indexOf("newString")是代替 startsWith的最佳方法。

例如:

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

如果这是发生在角2 + 应用程序,你可以只是 无可奉告字符串填充在 填充物:

import 'core-js/es6/string';

正如其他人所说,startsWith 和 endsWith 是 ES6的一部分,在 IE11中不可用。我们公司一直使用 lodash 库作为 IE11的填充解决方案。https://lodash.com/docs/4.17.4

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

虽然 Oka 的职位是工作良好,它可能有点过时。我发现 浪荡只需要一个功能就能解决这个问题。如果您已经安装了 loash,它可能会为您节省几行代码。

试试看:

import { startsWith } from lodash;

. . .

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

我最近也遇到了这个问题,我用 ^ 解决了这个问题,它类似于 start with in 说,

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

我们可以利用

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

这里,str 是元素的 id。

将函数的 start 替换为:

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

这将支持包括 IE 在内的所有浏览器

对于字符串匹配,可以从表示第0个位置的起始位置设置为0。

如果在处理 angular2 + 项目时出现问题,请遵循此方法

我正在寻找解决方案,然后我得到了这个错误,它把我带到了这里。但这个问题似乎是具体的,但错误不是,它是一个通用的错误。这是角度开发者在处理 Internet Explorer 时常犯的错误。

我在处理角度2 + 的时候也遇到过同样的问题,只用几个简单的步骤就解决了。

在 Angular 的最新版本中,在 填充物中有一些注释代码,显示了在 Internet Explorer 版本 IE09、 IE10和 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';

取消注释的代码,它会完美的工作在 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 浏览器的性能下降: