2016-02-05 111 views
31

Używam tej wtyczki jquery popup from this link w mojej witrynie WordPress. Działa dobrze we wszystkich przeglądarkach, ale podaje następujący błąd w IE11.Błąd pobierania: Obiekt nie obsługuje właściwości lub metody 'przypisz'

enter image description here

Każda pomoc jest mile widziane.

+2

@JohnDoe, można podać przykład działa? – Dekel

+2

@pragya, podaj swój kod, abyśmy mogli ocenić, co to jest problem ... mój jest to problem z domem nie znaleziono elementu lub ten sam identyfikator wiele razy na stronie. –

Odpowiedz

60

Jak wspominają inni, metoda Object.assign() nie jest obsługiwana w IE, ale jest polyfill dostępny, tylko to, że „przed” swoim oświadczeniu wtyczkę:

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

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

strona testowa : http://jsbin.com/pimixel/edit?html,js,output (po prostu usuń polyfill, aby uzyskać ten sam błąd, który pojawia się na twojej stronie).

+2

Dlaczego używa pojedynczego '! =' Zamiast bezpieczniejszego '! =='? –

4

@ Andres-Ilich ma właściwej odpowiedzi na swoje pytanie, ale pytasz niewłaściwe pytanie:

Dlaczego nie wystarczy użyć wtyczki jQuery obsługującej IE, jak w przypadku Zurb'a: Reveal: https://github.com/zurb/reveal

Wszystko to zrobi ng chcesz, a nie wyrzuć tego błędu.

5

@John Doe

zorientowali się z Twojego komentarza, który chcesz zaimplementować to w węźle/reagują stos. To bardzo różni się od pierwotnego pytania i powinieneś był zadać własne;)
W każdym razie, Herez, co musisz zrobić ...

Możesz użyć [es6-object-assign] [1]. Jest to obiekt poligonalny ES6 Object.assign() "polyfill".

Po pierwsze, w package.json w folderze głównym, dodać es6-object-assign jako zależność:

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

następnie, jeśli chcesz używać go w węźle wykorzystania środowiska:

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

Jeśli mającego problem z przodu (przeglądarka) koniec ...
Dodaj go do pliku 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 zależy boilerplate użyjesz, przeważnie właśnie node_modules, ale czasami gdy index.html znajduje się w podkatalogu trzeba użyć, ../node_modules

3

Obecnie pracuję nad jQuery popup sobie: https://github.com/seahorsepip/jPopup

Ma wszystko można oczekiwać od wyskakującego okienka i więcej: D

Wracając do tematu, obecnie piszę wersję 2, która jest dużym przeróbkiem i dodaje obsługę IE6 (wersja 1 to IE7 +) i wpadł na podobny błąd. ..

oryginalny kod, który dał błąd w 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>"); 

Hack musiałem wymyślić:

//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

Zasadniczo Object.assign nie jest obsługiwany przez wszystkie przeglądarki, jednak jest to możliwe aby ponownie przypisać go pod numer Object, który nie jest obsługiwany przez bieżącą przeglądarkę.

Przydaje się funkcja polyfill, która zachowuje się tak samo jakES6.

Myślę, że najlepszym rozwiązaniem jest iteracyjne każdy argument po target przypisać Każda właściwość arguments obiektów target, rozważa iteracji między obiektami i tablicami, aby uniknąć tworzenia referencji. Opcjonalnie, aby nie utracić instancji, można wykryć, czy ostatnie wystąpienie właściwości jest tylko równe "Array" lub "Object", i dzięki temu nie utracisz interfejsu Image (np.), Jeśli zamierzasz tworzyć nowe odniesienia, ale obiekty z te instancje nadal będą punktem odniesienia.

Edytuj: oryginalny Object.assign nie działa w ten sposób.

Zgodnie z tym rozwiązaniem mam własną polyfill, którą można znaleźć pod numerem here.

2

Od czasu oznaczenia pytania jQuery można użyć funkcji jQuery extend. Nie ma potrzeby polyfillowania, a także głębokie scalanie.

Dla przykładu:

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

Wynik:

{"apple":0,"banana":{"price":200},"cherry":97,"durian":100} 
Powiązane problemy