Doc Shell交换示例

时间:2014-11-03 19:38:33

标签: firefox-addon

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

我写了这个,可以从带有环境浏览器的暂存器运行:

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
*/

有关如何修复的任何想法? 感谢

1 个答案:

答案 0 :(得分:0)

感谢来自irc #extdev的@mook和@mossop寻求帮助。

它失败的原因是:

  • 非常确定它需要是
  • 看起来gBrowser.contentDocument可能是一个html页面?您必须使用XUL元素
  • 不知道它是否也适用于内容 - 我认为它不是
  • 并且要交换的东西要么必须是type = content,要么都不是,或类似的东西(翻译:源和目标的type属性必须相同。所以如果是{ {1}}另一个必须content-primary

这有效:

content-primary

所以换句话说,即使你使用xul命名空间创建了iframe,如果你将它放在一个html文档中也不会交换。像这个例子:

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)

它抛出:

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


因此建议不要将iframe与xul名称空间一起使用,就好像你不会得到DOMContentLoaded和其他一些事件http://forums.mozillazine.org/viewtopic.php?f=19&t=2809781&hilit=iframe+html+namespace

因此建议使用元素