Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

добавление функционала в Javascript (поиск в массиве), не поддерживаемого IE

#javascript #функции #internet_explorer #prototype #совместимость


Приветствую

Использую для поиска в массиве метод Array.prototype.find()

var dialogNode = xml.find(function(element){
    var objectParams = myGetTagParams(element.nodeName);

    return (objectParams.type == 'my:dialog');
});


но в IE этот функционал не поддерживается :( (а IE используют некоторые пользователи
сайта)

поэтому для них пришлось переписать код

var dialogNode = '';

for (var index in xml)
{
    var element = xml[index];

    var objectParams = myGetTagParams(element.nodeName);

    if (objectParams.type == 'my:dialog')
    {
        dialogNode = element;
        break;
    }
}


Это не очень удобно, когда в разных частях сайта используются конструкции типа "если
у пользователя один браузер - выполняй это, а если другой - выполняй это"

Подскажите, можно ли где-то при загрузке страницы, определив какой у пользователя
браузер (или лучше - определив, доступен ли нужный функционал) добавить свой, если
функционал недоступен, т.е. сделать примерно так

if (Array.prototype.find == undefined)
    Array.prototype.find = function(){}


?

И тогда смело в любом месте сайта можно вызывать функционал одним и тем же способом,
хотя код для разных браузеров будет различным
    


Ответы

Ответ 1



Кажется разобрался! Главное - если прототипа не существовало, приходится внедрять его несколько иным путём, чем показано в приведённых в вопросе примерах, а именно использовать Object.defineProperty: if (!Array.prototype.find) { Object.defineProperty(Array.prototype, "find", { value: function(predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; }, }); }

Комментариев нет:

Отправить комментарий