2014-11-03 2 views
0

Я пытаюсь написать простой пример, чтобы показать замену docshell с одного iframe на другой.Doc Shell Swapping Пример

Я написал это, может работать с блокнота с окружающим браузером:

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) 

Однако это бросает эту ошибку, когда он пытается поменять:

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

Любых идеи о том, как исправить? Thanks

ответ

0

Благодаря @mook и @mossop от irC#extdev за помощью.

Причина, по которой не работал потому, что:

  • уверен, что это должно быть
  • Похоже gBrowser.contentDocument может быть HTML страницы? Вы должны использовать элементы XUL.
  • Не знаю, работает ли он даже в контенте - я думаю, что это не
  • и вещи, которые нужно поменять местами, должны либо быть типом = содержимое, либо никоим образом не быть, или что-то в этом роде (перевод: атрибут как источника и цели 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) 

так что, даже если вы сделали iframe с пространством имен xul, он не будет заменен, если вы поместите его в 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

, поэтому рекомендуется использовать элемент