Благодаря @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
, поэтому рекомендуется использовать элемент