У меня есть скрипт, который перебирает значения, передаваемые в массиве, и проверяет, поддерживается ли эти элементы в браузере.Это прекрасно работает в Chrome, Edge, FireFox и Safari, но IE11 и более ранние версии (браузеры, которым действительно нужно это для работы) выдают ошибку.Значения массива являются строками (как видно ниже), но по какой-то причине IE11 рассматривает их как объекты, что означает, когда я пытаюсь проверить наличие.в строке IE выдает ошибку.
Я попытался преобразовать элемент массива toString
, но это просто приводит к object object
или object undefined
.
Я настроил CodePenкоторый содержит полный набор кода: https://codepen.io/willstocks_tech/pen/YBEzLW?editors=1012
Версия, которая может использоваться в IE: https://s.codepen.io/willstocks_tech/debug/YBEzLW/mWAoNxdogGvr (хотя это может истечь!)
//https://github.com/willstocks-tech/dynamically-polyfill-features-for-a-script/releases/
dynamicPolyfill(
['IntersectionObserver', 'IntersectionObserverEntry', 'Object.assign', 'Array.copyWithin']
,'https://cdn.jsdelivr.net/npm/quicklink@1.0.0/dist/quicklink.umd.js'
,'quicklink()'
)
function dynamicPolyfill(tocheck, scriptToPolyfill, functionToRunonLoad) {
if(typeof Promise !== "undefined"){
var checkPromises = [];
if(Array.isArray(tocheck)) {
tocheck.forEach(
function(tocheck){
checkPromises.push(checking(tocheck))
}
)
} else {
checkPromises.push(checking(tocheck))
}
checkPromises = checkPromises.filter(function(p){return p !== undefined}).join(' ');
loadPolyfill(checkPromises, scriptToPolyfill, functionToRunonLoad)
} else {
promiFill(tocheck, scriptToPolyfill, functionToRunonLoad);
}
}
function promiFill(tocheck, scriptToPolyfill, functionToRunonLoad){
var promPolyfill = document.createElement('script');
promPolyfill.src = ('https://polyfill.io/v3/polyfill.min.js?features=Promise');
document.body.appendChild(promPolyfill);
promPolyfill.onerror = function(response) {
console.error("Polyfilling promise failed", response);
}
promPolyfill.onload = function(tocheck, scriptToPolyfill, functionToRunonLoad) {
dynamicPolyfill(tocheck, scriptToPolyfill, functionToRunonLoad);
}
}
function checking(check){
var splitChars = '.';
if ((check in window) != true || (check in this) != true) {
if (check.indexOf(splitChars) >= 1) {
var split = check.split('.');
var firstWord = window[split[0]];
var lastWord = new Object(split[split.length - 1]);
if (lastWord in firstWord != true && lastWord in firstWord.prototype != true) {
return check;
}
} else {
return check;
}
}
}
function loadPolyfill(url, scriptToPolyfill, functionToRunonLoad) {
if(url !== "") {
var polyfill = document.createElement('script');
polyfill.src = ('https://polyfill.io/v3/polyfill.min.js?features='+encodeURIComponent(url));
document.body.appendChild(polyfill);
polyfill.onerror = function(response) {
console.error("Loading the polyfill(s) failed!", response);
}
polyfill.onload = function() {
loadMyScript(scriptToPolyfill, functionToRunonLoad)
}
} else {
loadMyScript(scriptToPolyfill, functionToRunonLoad)
}
}
function loadMyScript(url, functionToRunonLoad) {
if(Array.isArray(url)) {
var promises = [];
url.forEach(
function(url){
promises.push(nonblankURL(url));
}
);
Promise.all(promises)
.then(
function() {
initialiseMyScript(functionToRunonLoad)
}
).catch(function(error){return error})
} else if (!Array.isArray(url) && url !== null && url !== '') {
nonblankURL(url)
.then(
function() {
initialiseMyScript(functionToRunonLoad)
}
).catch(function(error){return error})
} else {
initialiseMyScript(functionToRunonLoad)
}
}
function nonblankURL(uri){
return new Promise(
function(resolve, reject) {
var thescript = document.createElement('script');
thescript.src = encodeURI(uri);
document.body.appendChild(thescript);
thescript.onerror = function(response) {
return reject("Loading the script failed!", response);
}
thescript.onload = function() {
return resolve(uri);
}
}
)
}
function initialiseMyScript(functionToRunonLoad) {
if(Array.isArray(functionToRunonLoad)) {
functionToRunonLoad.forEach(
function(functionToRunonLoad){
initScript(functionToRunonLoad)
}
)
} else {
initScript(functionToRunonLoad)
}
function initScript(fn) {
try {
window[fn];
} catch(err) {
console.error('There was an error: ', err, err.name, err.stack);
}
}
}
Все другие браузеры, кажется, справляются с этим нормально, но IE11 и старше выдают следующую ошибку: SCRIPT438: Object doesn't support property or method 'indexOf'
Я не могу работать дляжизнь, как заставить это работать в IE, но также и во всех других браузерах одновременно!