Javascript 在子窗口的上下文中执行父窗口的函数

Javascript 在子窗口的上下文中执行父窗口的函数,javascript,parent-child,clipboard,window.open,Javascript,Parent Child,Clipboard,Window.open,我正在尝试设计一个使用窗口的网页。打开生成子窗口,然后在该窗口中注册一个可单击的按钮,将文本负载复制到用户的剪贴板。具体地说,我正在使用注册按钮,但是我很难让它在子窗口中工作。到目前为止,我的代码大致如下: var payloadWindow = window.open("", "_blank", "width=800, height=600, scrollbars=yes"); var button = payloadWindow.document.createElement("input")

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

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
  }
});
这在窗口出现时起作用,并且包含按钮和有效负载文本,但是按钮未向任何处理程序注册,并且不会对鼠标单击作出反应

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

return delegate(document.body, selector, type, callback);
document.body
检查时,指的是父窗口的主体,因此似乎
剪贴板
确实在“错误”位置搜索
按钮

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

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

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

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

尝试将
“#”+button.id
替换为
payloadWindow.document.getElementById(button.id)
@imtheman谢谢,我尝试了您的建议,但
Clipboard
引发了以下异常:
uncaughttypeerror:第一个参数必须是String、HTMLElement、HTMLCollection或NodeList
Bummer。我会继续思考。这使它变得更加困难…是的,这是一个棘手的问题。我感谢你愿意帮忙。从我的经历来看,我倾向于尝试让子窗口直接执行脚本,然后可以从
window.opener
读取有效负载文本。但是,让Chrome调试器挂接到从子窗口运行的脚本时遇到了问题,可能是因为它是通过
窗口创建的。打开
?我认为最好的选择是将剪贴板脚本放在弹出窗口中。尝试用
payloadWindow.document.getElementById替换
“#”+button.id
(按钮id)
@imtheman谢谢你,我尝试了你的建议,但
剪贴板
抛出了以下异常:
未捕获类型错误:第一个参数必须是字符串、HTMLElement、HTMLCollection或节点列表
糟糕。我会继续思考。这会让事情变得更难……是的,这是一个棘手的问题。我感谢你的帮助。F从我的经历来看,我倾向于尝试让子窗口直接执行脚本,然后可能从
窗口.opener
读取有效负载文本。然而,我遇到了麻烦,让Chrome调试器钩住从子窗口运行的脚本,可能是因为它是cr通过
窗口创建。打开
?我认为最好的选择是将剪贴板脚本放在弹出窗口中。