2016-02-05 62 views
31

我在我的WordPress網站上使用這個jquery彈出式插件from this link。它在所有瀏覽器上工作正常,但在IE11上出現以下錯誤。獲取錯誤:對象不支持屬性或方法'assign'

enter image description here

任何幫助深表感謝。

+2

@JohnDoe,你能提供一個工作的例子嗎? – Dekel

+2

@pragya,請把你的一些代碼,所以我們可以判斷是什麼問題...我是它是與dom元素沒有找到問題或具有相同的ID多次在頁面上。 –

回答

60

正如其他人所提到的,Object.assign()方法不支持IE,但它有一個填充工具,只是它包含「之前」插件聲明:

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

爲什麼它使用單個'!='而不是更安全的'!=='? –

4

@安德烈 - 伊里奇有正確的回答你的問題,但你問錯了問題:

爲什麼不僅僅是使用支持IE的jQuery插件,如Zurb的優秀Reveal:https://github.com/zurb/reveal

它會做everythi你想要的,而不是拋出這個錯誤。

5

@約翰母鹿

我從要實現這點/反應堆您的評論想通了。這與原來的問題有很大不同,你應該問自己;)
反正,你需要做什麼...

你可以使用[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

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

基本上Object.assign不是所有瀏覽器都支持,但是,它是可能的在Object的情況下重新分配它當前瀏覽器不支持的情況。

這是做一個polyfill函數,其行爲方式與ESE的Object.assign(target, ...)相同。

我認爲最好的辦法是target後遍歷每個參數,arguments對象的每個屬性分配給target,考慮對象和數組之間的迭代,以避免造成引用。可選地,爲了不丟失實例,您可以檢測屬性的最後一個實例是否僅等於"Array""Object",並且如果您計劃創建新引用但不會丟失Image接口(例如)這些實例仍然是參考。

編輯:原始Object.assign不以這種方式工作。

根據這個解決方案,我有我自己的polyfill,可以找到here

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} 
相關問題