Obtenir L'erreur: L'objet ne supporte pas la propriété ou la méthode 'assign'

j'utilise ce plugin popup jquery à partir de ce lien sur mon site WordPress. Il fonctionne très bien sur tous les navigateurs, mais donnant l'erreur suivante sur IE11.

enter image description here

Toute aide est très appréciée.

35
demandé sur nihiser 2016-02-05 05:34:10

9 réponses

comme d'autres l'ont mentionné, L'objet .assignez () la méthode N'est pas supportée dans IE, mais il y a un polyfill disponible, il suffit de l'inclure "avant" votre déclaration de plugin:

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;
  };
}

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

page Test: http://jsbin.com/pimixel/edit?html,js, sortie (il suffit de supprimer le polyfill pour obtenir le même message d'erreur que vous obtenez sur votre page).

72
répondu Andres Ilich 2016-08-18 14:51:40

selon la documentation, objet.assign() est une nouvelle technologie, faisant partie de la norme ECMAScript 2015 (ES6)

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Object/assign

et, il n'est pas soutenu par IE.

6
répondu Vimalan Jaya Ganesh 2016-08-15 17:44:45

une solution possible à ce problème:

ajouter le script legacy.min.js avant la custombox.min.js

source: custombox projet github

6
répondu aprovent 2016-08-19 17:11:28

@John Doe

j'ai compris à partir de votre commentaire que vous voulez implémenter ceci dans la pile node/react. C'est très différent de la question originale et vous auriez dû poser la vôtre ;)

De toute façon, Voici ce que vous devez faire...

Vous pouvez utiliser [es6-objet-assigner][1]. C'est un objet ES6.assign ()"polyfill".

D'abord, dans package.json dans votre dossier racine, ajouter es6-object-assign comme dépendance:

"dependencies": {
    "es6-object-assign": "^1.0.2",
    "react": "^0.12.0",
    ...
  },

puis si vous voulez l'utiliser dans l'environnement node utiliser:

require('es6-object-assign').polyfill();

si vous avez le problème à l'avant (navigateur) fin...

Ajoutez-le dans votre index.fichier 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 dépend de boilerplate que vous utilisez, la plupart du temps juste node_modules , mais parfois quand index.html est dans un sous-répertoire que vous devez utiliser, ../node_modules

5
répondu shramee 2018-02-05 08:07:06

@Andres-Ilich a la bonne réponse à votre question mais vous posez la mauvaise question:

pourquoi ne pas simplement utiliser un plugin jQuery qui supporte IE comme L'excellent Reveal de Zurb: https://github.com/zurb/reveal

il fera tout ce que vous voulez et ne pas jeter cette erreur.

4
répondu staypuftman 2016-08-19 20:14:52

travaille actuellement sur un jQuery popup moi-même: https://github.com/seahorsepip/jPopup

a tout ce que vous attendez d'un popup et plus :d

de toute façon de retour sur le sujet, je suis en train d'écrire la version 2 qui est une grande réécriture et ajoute le support pour IE6 (la version 1 était IE7+) et a couru dans une erreur similaire...

code Original qui a donné l'erreur dans 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>");

le

//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();
3
répondu seahorsepip 2016-08-20 14:23:53

ces erreurs se produisent généralement lorsqu'un élément html id a le même id qu'une variable de la fonction JavaScript. Après avoir changé le nom de l'un d'eux le code a fonctionné.

Source : SCRIPT438: Objet ne prend pas en charge la propriété ou de la méthode c'est à dire

Autre lien : jquery validation IE Objet ne prend pas en charge la propriété

2
répondu Milap 2017-05-23 12:34:39

puisque vous avez étiqueté la question avec jQuery, vous pouvez utiliser la fonction extend de jQuery. Pas besoin de polyfill et ça fusionne profondément aussi.

Par Exemple:

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 );

résultat:

{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
2
répondu Kalimah Apps 2017-01-04 03:24:47

essentiellement, Object.assign n'est pas pris en charge par tous les navigateurs, cependant, il est possible de le réaffecter à Object cas, il n'est pas pris en charge par le navigateur actuel.

il est pratique de faire une fonction de polyfill, qui se comporte de la même manière que Object.assign(target, ...) de ES6.

je pense que la meilleure solution est d'itérer chaque argument après target , attribuer chaque propriété de arguments objets à target , en considérant une itération entre les objets et les tableaux, pour éviter de créer des références. Optionnellement, pour ne pas perdre les instances , vous pouvez détecter si la dernière instance de la propriété est seulement égale à "Array" ou "Object" , et en faisant cela vous ne perdrez pas une interface Image (E. g) Si vous prévoyez de créer de nouvelles références, mais les objets avec ces instances seront toujours des références.

Modifier : l'original Object.assign ne fonctionne pas de cette façon.

Selon cette solution, j'ai mon propre polyfill qui peut être trouvé ici .

1
répondu hydroper 2017-05-23 11:47:24