#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; }, }); }
Комментариев нет:
Отправить комментарий