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