Я использую этот всплывающий плагин jquery по этой ссылке на моем сайте WordPress. Он отлично работает во всех браузерах, но в IE11 выдает следующую ошибку.
Буду признателен за любую оказанную помощь.
Как отмечали другие, метод Object.assign() не поддерживается в IE, но имеется polyfill, просто включите его перед тем, ваше объявление плагина:
if (typeof Object.assign != 'function') {
Object.assign = function(target) {
'use strict';
if (target == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
target = Object(target);
for (var index = 1; index < arguments.length; index++) {
var source = arguments[index];
if (source != null) {
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
}
return target;
};
}
Из https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Страница тестирования http://jsbin.com/pimixel/edit?html,js,output (просто удалите polyfill, чтобы получить ту же самую ошибку, которую вы получаете на своей странице).
!=
Вместо безопасного !==
?
@Джон Доу
Из вашего комментария я понял, что вы хотите реализовать это в стеке узлов/реагирования. Это сильно отличается от оригинального вопроса, и вы должны были задать свой собственный;)
В любом случае, вот что тебе нужно сделать...
Вы можете использовать [es6-object-assign] [1]. Это ES6 Object.assign() "polyfill".
Сначала в package.json
в корневой папке добавьте es6-object-assign
в качестве зависимости:
"dependencies": {
"es6-object-assign": "^1.0.2",
"react": "^0.12.0",
...
},
Тогда, если вы хотите использовать его в среде узла, используйте:
require('es6-object-assign').polyfill();
Если у вас возникла проблема с интерфейсом (браузером)...
Добавьте его в свой файл index.html...
<script src="/object-assign.min.js"></script>
<script>
window.ObjectAssign.polyfill();
</script>
location_of_node_modules
зависит от используемого вами шаблона, в основном это только node_modules
, но иногда, когда index.html находится в подкаталоге, который вам нужно использовать, ../node_modules
Возможное решение этой проблемы:
Добавьте script legacy.min.js перед custombox.min.js
source: проект gigaub custombox
Согласно документации, Object.assign() - это новая технология, часть стандарта ECMAScript 2015 (ES6):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
И это не поддерживается IE.
@Андрес-Ильич имеет правильный ответ на ваш вопрос, но вы задаете неправильный вопрос:
Почему бы просто не использовать плагин jQuery, поддерживающий IE, как Zurb excellent Reveal: https://github.com/zurb/reveal
Он сделает все, что захочет, и не выбросит эту ошибку.
В настоящее время работает над всплывающим окном jQuery: https://github.com/seahorsepip/jPopup
Есть все, что вы ожидаете от всплывающего окна и больше: D
В любом случае, по теме, я в настоящее время пишу версию 2, которая является большой перепиской и добавляет поддержку IE6 (версия 1 была IE7 +) и столкнулась с аналогичной ошибкой...
Исходный код, который дал ошибку в IE6:
//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div style=\"position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;\"></div>");
Сбой, который я должен был придумать:
//Insane code for an insane browser
this._vars.fakeScrollbar = $("<div>");
this._vars.fakeScrollbar.html("<div style=\"position:absolute;top:expression(document.documentElement.scrollTop);right:0;bottom:0;margin-left:-200px;width:0;overflow-y:scroll;height:expression(document.documentElement.clientHeight);z-index:9999999;\"></div>");
this._vars.fakeScrollbar = this._vars.fakeScrollbar.children();
Поскольку вы отметили вопрос с помощью jQuery, вы можете использовать функцию jQuery extend. Нет необходимости в polyfill, и он также глубоко объединяется.
Пример:
var object1 = {
apple: 0,
banana: { weight: 52, price: 100 },
cherry: 97
};
var object2 = {
banana: { price: 200 },
durian: 100
};
// Merge object2 into object1
$.extend( object1, object2 );
Результат:
{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
Эта ошибка обычно возникает, когда некоторый идентификатор элемента html имеет тот же идентификатор, что и некоторая переменная в функции JavaScript. После изменения имени одного из них работал код.
Источник: SCRIPT438: объект не поддерживает свойство или метод IE
Другая ссылка: Проверка jquery IE Объект не поддерживает свойство
В принципе, Object.assign
не поддерживается всеми браузерами, однако можно повторно назначить его в Object
, если он не поддерживается текущим браузером.
Предпочитает сделать функцию polyfill, которая ведет себя так же, как Object.assign(target, ...)
ES6.
Я думаю, что лучшим решением является итерация каждого аргумента после target
, присваивание каждому свойству объектов arguments
target
, учитывая итерацию между объектами и массивами, чтобы избежать создания ссылок. Необязательно, чтобы не потерянные экземпляры, вы можете определить, равен ли последний экземпляр свойства только "Array"
или "Object"
, и при этом вы не потеряете интерфейс Image
(например), если вы планируете создавать новые ссылки, но объекты с этими экземплярами все равно будут ссылаться.
Изменить: исходный Object.assign
не работает таким образом.
В соответствии с этим решением у меня есть свой polyfill, который можно найти здесь.