我有一個爲Firefox 3.6編寫的插件,現在我正在升級它的Firefox 4.0,同時試圖保持它與3.6兼容。有沒有人有任何嘗試這樣做的經驗,或者如何在沒有代碼獲得太意大利麪條的情況下做到這一點?升級插件以與Firefox 4.0兼容,但嘗試與3.x兼容。建議嗎?
有幾個地方,保持其與兩個版本兼容意味着做這樣的事情:
.myAddonClass {
-moz-background-size: 100% 100%; /* Fx 3.x */
background-size: 100% 100%; /* Fx 4.x */
}
產生在兩個版本中的CSS警告。我可以忍受這一點。還有其他的地方,我在做這樣的事情:
/** get the current version of this addon */
function getVersion() {
var version;
if (Application.extensions) { // Fx 3.x
version = Application.extensions.get('[email protected]').version;
}
else { // Fx 4.x
Components.utils.import('resource://gre/modules/AddonManager.jsm');
AddonManager.getAddonByID('[email protected]', function(addon) {
version = addon.version;
});
sleepUntil(function() {
return version;
}
}
return version;
}
(其中sleepUntil是使用Thread.processNextEvent
technique效用函數)
檢查Application.extensions
是否定義似乎不僅僅是直接檢查Application.version
串清潔,但也許這種方法存在一些我不知道的缺陷?
我也運行到試圖內容插入網頁的問題。在一個案例中,doc.body.appendChild
在3.X而不是在4.x的是工作,所以我試着這樣做:
try { // Fx 3.x
doc.body.appendChild(myElement);
}
catch (e) { // Fx 4.x
let span = doc.createElement('span');
doc.body.appendChild(span);
span.innerHTML = outerHTML(myElement);
}
上面的代碼不工作,但如果我插入一個throw new Error('')
只是doc.body.appendChild(myElement)
然後才確實有效,這表明在Firefox 4中,appendChild
調用顯然會在引發錯誤之前以某種方式修改myElement
。我確信我可以弄清楚如何讓這個特定的代碼片段起作用,但是我擔心我會碰到更多像這樣的問題,所以我想看看是否有其他人已經通過了一個類似的過程,並有我應該知道的任何提示。
對不起長十歲上下的問題。 這裏就是我真的問:
- 你對試圖保持在同一時間與Firefox 3和Firefox 4同時兼容的插件有什麼建議?
- 你覺得分支的代碼,使我們擁有一個版本3.x的另一個用於4.x版的想法是什麼?然後,我們將不得不申請任何新功能兩個版本,並在兩個版本進行測試,等
- 一般情況下,是能夠更好地爲你想要的特定特徵的存在測試(像我
if (Application.extensions) ...
或嘗試做/ catch)還是隻檢查Application.version
是以'3'還是'4'開始?
當然,一種選擇是在Firefox 4發佈後立即放棄對Firefox 3.x的支持,但可能會等待並觀察Firefox 3.x用戶是否猶豫升級...... – MatrixFrog 2010-12-17 21:54:48
在任何人想知道的情況下,try/catch的解決方案就是執行'doc.body.appendChild(doc.importNode(myElement))',這兩個版本都能很好地工作。 – MatrixFrog 2010-12-18 00:16:59
而不是編寫'doc.body.appendChild(doc.importNode(myElement))',你不能使用'doc.createElement'創建'myElement'而不是使用其他文檔創建'myElement'? – Neil 2011-01-16 00:28:30