Firefox addon 文档外壳交换示例

Firefox addon 文档外壳交换示例,firefox-addon,Firefox Addon,我试图写一个简单的例子来展示docshell从一个iframe到另一个iframe的交换 我写了这个,可以在scratchpad环境浏览器中运行: var doc = gBrowser.contentDocument; var iframeA = doc.createElement('iframe'); iframeA.setAttribute('id', 'a'); iframeA.setAttribute('src', 'http://www.bing.com'); doc.document

我试图写一个简单的例子来展示docshell从一个iframe到另一个iframe的交换

我写了这个,可以在scratchpad环境浏览器中运行:

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
*/
有没有关于如何修复的想法?
感谢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和其他一些事件

因此建议使用元素