2016-02-05 145 views
31

Sto usando questo plugin popup jquery from this link sul mio sito WordPress. Funziona bene su tutti i browser, ma dà il seguente errore su IE11.Errore: l'oggetto non supporta la proprietà o il metodo 'assign'

enter image description here

Qualsiasi aiuto è molto apprezzato.

+2

@JohnDoe, si può fornire un esempio di lavoro? – Dekel

+2

@pragya, per favore metti un po 'di codice in modo che possiamo giudicare quale sia il problema ... il mio sia è un problema con l'elemento dom non trovato o lo stesso id più tempo sulla pagina. –

risposta

60

Come altri hanno detto, il metodo Object.assign() non è supportato in IE, ma c'è un polyfill a disposizione, basta includerlo "prima" la vostra dichiarazione 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; 
    }; 
} 

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

pagina di prova : http://jsbin.com/pimixel/edit?html,js,output (basta rimuovere il polyfill per ottenere lo stesso errore che si ottiene sulla pagina).

+2

Perché usa il singolo '! =' Invece di più sicuro '! =='? –

4

@ Andres-Ilich ha la risposta giusta alla tua domanda, ma che stai chiedendo la domanda sbagliata:

Perché non solo usare un plugin jQuery che supporti IE come l'eccellente Reveal di Zurb: https://github.com/zurb/reveal

Farà ogni cosa vuoi e non lanciare questo errore

5

@ John Doe

ho capito dal tuo commento che si desidera implementare questo nodo/reagire stack. Questo è molto diverso da domanda originale e si dovrebbe avere chiesto il proprio;)
In ogni modo, Heres che cosa dovete fare ...

È possibile utilizzare [ES6-oggetto-assegnazione] [1]. È un ES6 Object.assign() "polyfill".

In primo luogo, in package.json nella cartella principale, aggiungi es6-object-assign come dipendenza:

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

Poi, se si desidera utilizzarlo in nodo uso ambiente:

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

Se si stanno avendo la problema sul fronte (browser) fine ...
Aggiungilo nel tuo file 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 dipende boilerplate si utilizza, per lo più solo node_modules, ma a volte quando index.html è in una sottodirectory è necessario utilizzare, ../node_modules

3

attualmente lavorando su un jQuery popup me stesso: https://github.com/seahorsepip/jPopup

ha tutto ti aspetteresti da un popup e altro: D

Comunque, tornando all'argomento, sto attualmente scrivendo la versione 2 che è una grande riscrittura e aggiunge il supporto per IE6 (versione 1 era IE7 +) e ha avuto un errore simile. ..

Codice originale che ha dato l'errore in 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>"); 

L'hack ho dovuto venire con:

//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(); 
1

In sostanza, Object.assign non è supportato da tutti i browser, tuttavia, è possibile per riassegnarlo al Object caso non è supportato dal browser corrente.

È pratica per eseguire una funzione di riempimento di poligoni, che si comporta allo stesso modo di Object.assign(target, ...) di ES6.

ritengo la soluzione migliore è quella di iterare ogni argomento dopo target, assegnare a ciascuna proprietà di arguments oggetti target, considerando un'iterazione tra oggetti e array, per evitare di creare riferimenti. Facoltativamente, per non perdere le istanze, è possibile rilevare se l'ultima istanza della proprietà è uguale a "Array" o "Object", e così facendo non si perderà un'interfaccia Image (ad esempio) se si intende creare nuovi riferimenti, ma oggetti con queste istanze saranno comunque riferimento.

Modifica: l'originale Object.assign non funziona in questo modo.

Secondo questa soluzione, ho il mio polyfill che può essere trovato here.

2

Poiché la domanda è stata contrassegnata con jQuery, è possibile utilizzare la funzione jQuery extend. Non c'è bisogno di un polyfill e si fonde in profondità.

Per esempio:

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

Risultato:

{"apple":0,"banana":{"price":200},"cherry":97,"durian":100} 
Problemi correlati