在子窗口的上下文中执行父窗口的功能

时间:2016-07-13 18:44:10

标签: javascript parent-child clipboard window.open

我正在尝试设计一个使用window.open生成子窗口的网页,然后在该窗口中注册一个可点击按钮,将文本有效负载复制到用户的剪贴板。具体来说,我正在使用clipboard.js来注册按钮,但是我很难让它在子窗口中工作。到目前为止,我的代码大致如下:

var payloadWindow = window.open("", "_blank", "width=800, height=600, scrollbars=yes");
var button = payloadWindow.document.createElement("input");
button.type = "button";
button.value = "Copy to Clipboard";
button.id = "copyToClipboard";
payloadWindow.document.body.appendChild(button);
payloadWindow.document.body.appendChild(payloadTextNode); // payloadTextNode already declared
var clipboard = new Clipboard("#" + button.id, {
  text: function() {
    return payloadText; // payloadText already declared
  }
});

只要窗口出现并且包含按钮和有效负载文本,它就可以工作,但按钮没有在任何处理程序中注册,也不会对鼠标点击做出反应。

据我所知,问题是在父窗口加载的脚本中调用了Clipboard构造函数。因此,当它搜索标识为copyToClipboard的按钮时,它实际上是在我需要它来搜索子窗口时在父窗口中搜索元素。我通过使用调试器逐步执行clipboard.js(v1.5.12)并在第208行达到此语句来验证这一点:

return delegate(document.body, selector, type, callback);
检查时

document.body是指父窗口的主体,因此Clipboard确实在“错误”的位置搜索button

所以我的问题,更简洁的形式是:

有没有办法强制从窗口A调用的函数在窗口B的上下文中执行?我基本上希望能够做到这一点:

(function(payloadText) {
  var clipboard = new Clipboard("#" + button.id, {
    text: function() {
      return payloadText; // payloadText already declared
    }
}).callFrom(payloadWindow, payloadText);

callFrom表示一些函数,可以让我以payloadWindow作为全局上下文执行lambda函数。如果这是不可能的,是否有一种惯用的方式来模拟这个功能?我希望能够将有效负载文本直接从父窗口传递到子窗口(如果可能),而无需通过控制器进行路由。

0 个答案:

没有答案