Получение ошибки: объект не поддерживает свойство или метод 'assign'

37

Я использую этот всплывающий плагин jquery по этой ссылке на моем сайте WordPress. Он отлично работает во всех браузерах, но в IE11 выдает следующую ошибку.

Изображение 195

Буду признателен за любую оказанную помощь.

  • 2
    @JohnDoe, можешь привести рабочий пример?
  • 2
    @pragya, пожалуйста, напишите свой код, чтобы мы могли судить о том, что является проблемой ... возможно, это проблема с элементом dom, не найденным или имеющим один и тот же идентификатор несколько раз на странице.
Теги:
modal-dialog
popup

9 ответов

75

Как отмечали другие, метод 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, чтобы получить ту же самую ошибку, которую вы получаете на своей странице).

  • 3
    Почему он использует один != Вместо безопасного !== ?
6

@Джон Доу

Из вашего комментария я понял, что вы хотите реализовать это в стеке узлов/реагирования. Это сильно отличается от оригинального вопроса, и вы должны были задать свой собственный;)
В любом случае, вот что тебе нужно сделать...

Вы можете использовать [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

6

Возможное решение этой проблемы:

Добавьте script legacy.min.js перед custombox.min.js

source: проект gigaub custombox

6

Согласно документации, Object.assign() - это новая технология, часть стандарта ECMAScript 2015 (ES6):

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

И это не поддерживается IE.

4

@Андрес-Ильич имеет правильный ответ на ваш вопрос, но вы задаете неправильный вопрос:

Почему бы просто не использовать плагин jQuery, поддерживающий IE, как Zurb excellent Reveal: https://github.com/zurb/reveal

Он сделает все, что захочет, и не выбросит эту ошибку.

3

В настоящее время работает над всплывающим окном 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();
2

Поскольку вы отметили вопрос с помощью 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}
2

Эта ошибка обычно возникает, когда некоторый идентификатор элемента html имеет тот же идентификатор, что и некоторая переменная в функции JavaScript. После изменения имени одного из них работал код.

Источник: SCRIPT438: объект не поддерживает свойство или метод IE

Другая ссылка: Проверка jquery IE Объект не поддерживает свойство

1

В принципе, Object.assign не поддерживается всеми браузерами, однако можно повторно назначить его в Object, если он не поддерживается текущим браузером.

Предпочитает сделать функцию polyfill, которая ведет себя так же, как Object.assign(target, ...) ES6.

Я думаю, что лучшим решением является итерация каждого аргумента после target, присваивание каждому свойству объектов arguments target, учитывая итерацию между объектами и массивами, чтобы избежать создания ссылок. Необязательно, чтобы не потерянные экземпляры, вы можете определить, равен ли последний экземпляр свойства только "Array" или "Object", и при этом вы не потеряете интерфейс Image (например), если вы планируете создавать новые ссылки, но объекты с этими экземплярами все равно будут ссылаться.

Изменить: исходный Object.assign не работает таким образом.

В соответствии с этим решением у меня есть свой polyfill, который можно найти здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню