IE не поддерживает методы includes для массивов и строк
Я работаю над проектом и разрабатываю JavaScript-фреймворк. Исходный код содержит около 700 строк, поэтому я вставил лишь одну строку. Метод includes
не работает в Internet Explorer. Есть ли решение этой проблемы?
var row_cells = tbl_row.match(/<td[\s\S]*?<\/td>/g);
row.Cells = new Array();
if (onRowBindFuncText != null) { /* Функция объявлена, работает быстрее */
var cellCount = 0;
for (i = 0; i < row_cells.length; i++) {
var cell = new Cell();
$.each(this, function (k, v) {
if ((row_cells[i]+"").includes("#Eval(" + k + ")")) {
cell.Keys.push(new Key(k,v));
...Код продолжается.
5 ответ(ов)
@Infer-on дал отличный ответ, но у него есть проблема в специфической ситуации. Если вы используете цикл for-in
, он будет возвращать метод "includes", который вы добавили.
Вот другой полифилл:
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, "includes", {
enumerable: false,
value: function(obj) {
var newArr = this.filter(function(el) {
return el == obj;
});
return newArr.length > 0;
}
});
}
Этот полифилл добавляет метод includes
в прототип массива, но делает его не перечисляемым, что решает проблему с циклом for-in
. Теперь, если вам нужно проверить наличие элемента в массиве, метод includes
будет корректно работать, не попадая в итерацию при использовании for-in
.
Вы можете просто использовать .search() > -1
, что будет вести себя аналогично. Документацию можно посмотреть здесь.
Ваш код можно переписать так:
if ((row_cells[i] + "").search("#Eval(" + k + ")") > -1) {
Таким образом, проверка наличия подстроки будет работать корректно, возвращая индекс вхождения или -1, если подстрока не найдена.
Этот выбранный ответ относится к строкам. Если вы ищете метод 'includes' для массивов, то я решил свою проблему в проекте Angular, добавив следующее в файл polyfills.ts:
import 'core-js/es7/array';
Этот код является полифиллом для TypeScript-проектов. Он был заимствован с https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Array/includes и модифицирован для корректной работы с TypeScript:
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, 'includes', {
value: function(searchElement: any, fromIndex?: number): boolean {
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
const o = Object(this);
const len = o.length >>> 0;
if (len === 0) {
return false;
}
const n = fromIndex | 0;
let k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
while (k < len) {
if (o[k] === searchElement) {
return true;
}
k++;
}
return false;
}
});
}
Этот полифилл добавляет метод includes
в прототип массива, если он еще не поддерживается в текущей среде выполнения JavaScript. Метод проверяет, содержится ли определенный элемент в массиве, и возвращает true
или false
. Оператор >>>
используется для получения длины массива в виде беззнакового целого числа. Убедитесь, что вы используете его в проектах, где поддержка данного метода может отсутствовать.
Ваш код проверяет, содержит ли строка fullString
подстроку partString
. Используя метод indexOf
, вы можете определить, присутствует ли partString
в fullString
. Если indexOf
возвращает значение, большее или равное нулю, это означает, что подстрока найдена, и условие вернёт true
. В противном случае, если indexOf
возвращает -1
, подстрока отсутствует, и условие вернёт false
.
Вот ваш код на русском:
if (fullString.indexOf("partString") >= 0) {
// true - подстрока найдена
} else {
// false - подстрока отсутствует
}
Вместо indexOf
в современных браузерах также можно использовать метод includes
, который более читаем и возвращает логическое значение. Пример использования:
if (fullString.includes("partString")) {
// true - подстрока найдена
} else {
// false - подстрока отсутствует
}
Этот вариант является более предпочтительным, так как он проще для восприятия.
Почему не работают самозакрывающиеся элементы script?
Как клонировать объект JavaScript, исключив один ключ?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub