2013-03-12 24 views
0

我今天在GitHub上獲得了pull requestsmall jquery plugin在它的主分支中提出了一點小問題,因爲插件的Flash元素不適用於require.js關閉。歸結到Flash需要一個全局變量,所以在通過require.js加載之後,範圍發生了變化,變量不再顯示。如何解決我的jquery + flash插件和require.js之間的範圍問題

在拉請求所提出的解決方法是忽略聲明,所以基本上:

foo = { "bar": 1 }; 

代替:

var foo = { "bar": 1 }; 

,但禁止的JSLint永遠傳遞,所以我真的不希望要做到這一點。

var foo = { "bar": 1 }; 
if (typeof(window) === 'object') { window['foo'] = foo; } 

,或者我應該鼓勵這種被固定在執行,而不是在我的腳本:

如果我喜歡的東西解決這個問題,我的主要腳本?

回答

1

是否第三方需要通過變量直接控制?最後可以添加行window.foo = foo

但是,如果有一個getFoo()方法返回值,這樣可以保持對變量的控制,這會更安全。

+0

這是一個非常有效的觀點,除非有其他人有更好的主意,否則我會繼續這樣做。謝謝。 – plodder 2013-03-12 23:15:07

1

如果您需要Flash的全局變量,那麼我建議爲您的應用程序創建適當的名稱空間,以便Flash可以通過單個輸入點訪問它。

// create your objects for your app 
var foo = { 
    bar: 1 
}; 

// add your object to the global namespace eg. 'myApp' 
window.myApp = foo; 

這篇文章可以幫助:http://www.2ality.com/2011/04/modules-and-namespaces-in-javascript.html

+0

整個腳本已經命名空間了,所以我想這是覆蓋,只要人們不打算運行我的腳本的多個版本。謝謝您的回答。 – plodder 2013-03-12 23:13:26

1

您可以提供一個初始化參數,允許庫的使用者選擇將其粘貼到哪裏。

require(['theflashlibrary'], function(theFlashLibrary){ 

    theFlashLibrary.init({ globalProperty: 'foo' }); //Otherwise this could default to something else... 
}); 

我沒有這樣做的一個很好的方式,但是,我覺得這將是很好的,至少爲用戶提供選擇在哪裏將你的圖書館被引用的方式。

+0

雖然這是理想的,但問題在於編譯後的Flash對象需要全局範圍內的預定義訪問點,並且由於它已編譯爲swf,因此需要對其進行設置。 – plodder 2013-03-12 23:11:34