2014-11-03 33 views
0

我正試圖編寫一個簡單的示例來顯示docshell從一個iframe交換到另一個iframe。Doc Shell交換示例

我寫這一點,可以從暫存器與環境的瀏覽器中運行:

/* 
TypeError: Argument 1 of HTMLIFrameElement.swapFrameLoaders does not implement interface XULElement. Scratchpad/1:17 
*/ 

關於如何解決任何想法:

var doc = gBrowser.contentDocument; 
var iframeA = doc.createElement('iframe'); 
iframeA.setAttribute('id', 'a'); 
iframeA.setAttribute('src', 'http://www.bing.com'); 
doc.documentElement.appendChild(iframeA); 

var iframeB = doc.createElement('iframe'); 
iframeB.setAttribute('id', 'b'); 
iframeB.setAttribute('src', 'data:text/html,swap to here'); 
doc.documentElement.appendChild(iframeB); 

doc.defaultView.setTimeout(function() { 
    var srcFrame = iframeA; 
    var targetFrame = iframeB; 
    doc.defaultView.alert('will swap now'); 
    srcFrame.QueryInterface(Ci.nsIFrameLoaderOwner).swapFrameLoaders(targetFrame) 
    doc.defaultView.alert('swap done'); 
}, 5000) 

但是當它試圖交換,這將引發這個錯誤? 謝謝

回答

0

感謝來自irC#extdev的@mook和@mossop的幫助。

它沒有工作的原因是因爲:

  • 敢肯定它需要一個
  • 看起來gBrowser.contentDocument可能是一個HTML頁面?您必須使用XUL元素
  • 不知道它是否可以在內容中工作 - 我認爲它不是
  • 並且要交換的內容必須是type = content或者都不是,或者類似的東西(譯註:源和目標的type屬性必須是相同的,所以,如果一個是content-primary另外必須content-primary爲好。)

這工作:

var doc = document; //gBrowser.contentDocument; 
var iframeA = doc.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'browser'); 
iframeA.setAttribute('id', 'a'); 
iframeA.setAttribute('src', 'http://www.bing.com'); 
iframeA.setAttribute('style', 'height:100px;'); 
doc.documentElement.appendChild(iframeA); 

var iframeB = doc.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'browser'); 
iframeB.setAttribute('id', 'b'); 
iframeB.setAttribute('src', 'data:text/html,swap to here'); 
iframeB.setAttribute('style', 'height:100px;'); 
doc.documentElement.appendChild(iframeB); 

doc.defaultView.setTimeout(function() { 
    var srcFrame = iframeA; 
    var targetFrame = iframeB; 
    doc.defaultView.alert('will swap now'); 
    srcFrame.QueryInterface(Ci.nsIFrameLoaderOwner).swapFrameLoaders(targetFrame) 
    doc.defaultView.alert('swap done'); 
}, 5000) 

換句話說,即使您使用xul命名空間創建了iframe,如果將它放入html文檔中,它也不會交換。像這樣的例子在這裏:

var xulDoc = document; 
var doc = gBrowser.contentDocument; 
var iframeA = xulDoc.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'iframe'); 
iframeA.setAttribute('id', 'a'); 
iframeA.setAttribute('src', 'http://www.bing.com'); 
iframeA.setAttribute('type', 'content'); 
iframeA.setAttribute('style', 'height:100px;width:100px;'); 
doc.documentElement.appendChild(iframeA); 

var iframeB = xulDoc.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'iframe'); 
iframeB.setAttribute('id', 'b'); 
iframeB.setAttribute('src', 'data:text/html,swap to here'); 
iframeB.setAttribute('type', 'content'); 
iframeB.setAttribute('style', 'height:100px;width:100px;'); 
doc.documentElement.appendChild(iframeB); 

doc.defaultView.setTimeout(function() { 
    var srcFrame = iframeA; 
    var targetFrame = iframeB; 
    doc.defaultView.alert('will swap now'); 
    srcFrame.QueryInterface(Ci.nsIFrameLoaderOwner).swapFrameLoaders(targetFrame) 
    doc.defaultView.alert('swap done'); 
}, 5000) 

它拋出:

NS_ERROR_NOT_IMPLEMENTED: Scratchpad/2:21 

此行是swapFrameLoaders


所以其建議,如果你做你不使用iframe使用XUL命名空間不會得到DOMContentLoaded和其他一些事件http://forums.mozillazine.org/viewtopic.php?f=19&t=2809781&hilit=iframe+html+namespace

所以推薦使用元件