Я использую этот всплывающий плагин jquery по этой ссылке на моем сайте WordPress. Он отлично работает во всех браузерах, но в IE11 выдает следующую ошибку.
Получение ошибки: объект не поддерживает свойство или метод 'assign'
Ответ 1
Как отмечали другие, метод 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, чтобы получить ту же самую ошибку, которую вы получаете на своей странице).
Ответ 2
Согласно документации, Object.assign() - это новая технология, часть стандарта ECMAScript 2015 (ES6):
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
И это не поддерживается IE.
Ответ 3
@Джон Доу
Из вашего комментария я понял, что вы хотите реализовать это в стеке узлов/реагирования. Это сильно отличается от оригинального вопроса, и вы должны были задать свой собственный;)
В любом случае, вот что тебе нужно сделать...
Вы можете использовать [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="location_of_node_modules/es6-object-assign/dist/object-assign.min.js"></script>
<script>
window.ObjectAssign.polyfill();
</script>
location_of_node_modules
зависит от используемого вами шаблона, в основном это только node_modules
, но иногда, когда index.html находится в подкаталоге, который вам нужно использовать, ../node_modules
Ответ 4
Возможное решение этой проблемы:
Добавьте script legacy.min.js перед custombox.min.js
source: проект gigaub custombox
Ответ 5
@Андрес-Ильич имеет правильный ответ на ваш вопрос, но вы задаете неправильный вопрос:
Почему бы просто не использовать плагин jQuery, поддерживающий IE, как Zurb excellent Reveal: https://github.com/zurb/reveal
Он сделает все, что захочет, и не выбросит эту ошибку.
Ответ 6
В настоящее время работает над всплывающим окном 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();
Ответ 7
Поскольку вы отметили вопрос с помощью 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}
Ответ 8
Эта ошибка обычно возникает, когда некоторый идентификатор элемента html имеет тот же идентификатор, что и некоторая переменная в функции JavaScript. После изменения имени одного из них работал код.
Источник: SCRIPT438: объект не поддерживает свойство или метод IE
Другая ссылка: Проверка jquery IE Объект не поддерживает свойство
Ответ 9
В принципе, Object.assign
не поддерживается всеми браузерами, однако можно повторно назначить его в Object
, если он не поддерживается текущим браузером.
Предпочитает сделать функцию polyfill, которая ведет себя так же, как Object.assign(target, ...)
ES6.
Я думаю, что лучшим решением является итерация каждого аргумента после target
, присваивание каждому свойству объектов arguments
target
, учитывая итерацию между объектами и массивами, чтобы избежать создания ссылок. Необязательно, чтобы не потерянные экземпляры, вы можете определить, равен ли последний экземпляр свойства только "Array"
или "Object"
, и при этом вы не потеряете интерфейс Image
(например), если вы планируете создавать новые ссылки, но объекты с этими экземплярами все равно будут ссылаться.
Изменить: исходный Object.assign
не работает таким образом.
В соответствии с этим решением у меня есть свой polyfill, который можно найти здесь.
Ответ 10
Реагировать решение для IE11
Относительно ответа шрами, в котором говорится что-то вроде этого:
@JohnDoe из вашего комментария, вы хотите реализовать это в стеке узлов/реагирования. Это сильно отличается от исходного вопроса, но вы можете использовать es6-object-assign, ES6
Object.assign()
"polyfill":
Этот polyfill был обновлен, и теперь все можно сделать немного иначе:
-
в
package.json
в корневой папке добавьтеes6-object-assign
в качестве зависимости (после выполненияnpm i
в командной строке):"dependencies": { "es6-object-assign": "^1.0.2", "react": "^16.8.6", ... },
Или просто запустите:
npm я --save es6-object-assign
-
Чтобы использовать его в среде узла:
require('es6-object-assign').polyfill(); // Same version with automatic polyfilling require('es6-object-assign/auto');
-
Чтобы использовать его в вашем index.html, просто добавьте в него ссылку на JS файл автоматического полифилла (если у вас есть
<body>
сценарии, которые вызываютObject.assign()
вы можете добавить его в конце элемента<head>
),-
Вызов напрямую из
node_modules
:<script src="location_of_node_modules/es6-object-assign/dist/object-assign-auto.min.js"></script>
location_of_node_modules
зависит от структуры вашего проекта (когда index.html находится в подкаталоге, который вам может понадобиться:../node_modules
). -
Однако, это может не
node_modules
для вас (из-за доступа к папкамnode_modules
, например, вы используете create-реагировать-приложение). Если это так, просто скопируйте файл JS из папкиdist/
node_modules в папкуpublic/
и затем:<script src="%PUBLIC_URL%/object-assign-auto.js"></script>
Возможно, вы захотите использовать неминифицированный файл и добавить другие настраиваемые полифилы (например,
startsWith
).
-
Ответ 11
пожалуйста добавьте скрипт
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/object-assign-auto.min.js"></script>
в HTML файл, чтобы решить эту проблему.