JavaScript window.open,将脚本传递给子窗口只工作一次

JavaScript window.open,将脚本传递给子窗口只工作一次,javascript,html,window.open,Javascript,Html,Window.open,我在成功传递脚本时遇到了一个问题,该脚本将在第二次在子窗口中自动激活 let win = undefined; let win2 = undefined; let testInterval = setInterval(function(){ if(win === undefined){ win = window.open("?"); win.document.body.appendChild(testScript);

我在成功传递脚本时遇到了一个问题,该脚本将在第二次在子窗口中自动激活


let win = undefined;
let win2 = undefined;
let testInterval = setInterval(function(){
    if(win === undefined){
        win = window.open("?");
        win.document.body.appendChild(testScript);
        listenToMessages();
    }else{
        if(win.closed === true){
            win = window.open("?");
            win.document.body.appendChild(testScript);
            listenToMessages();
        }
    }
    if(win2 === undefined){
        win2 = window.open("?");
        win2.document.body.appendChild(testScript);
        listenToMessages();
    }else{
        if(win2.closed === true){
            win2 = window.open("?");
            win2.document.body.appendChild(testScript);
            listenToMessages();
        }
    }
}, 2000);

let testScript = document.createElement('script');
testScript.textContent = 'console.log("here!")';

通过测试这个,您会注意到console.log在DOM中的两个窗口中都存在,但是消息只是第一次写入控制台。 有人知道为什么会发生这种行为吗

提前感谢,,
Alex

DOM元素一次只能位于一个位置。当您将
testScript
附加到
win2.document
时,它会将其从
win.document
中删除

如果需要
脚本
元素的多个副本,则需要对其进行克隆

let win=未定义;
设win2=未定义;
让testInterval=setInterval(函数(){
如果(!win | | win.closed){
win=窗口。打开(“?”);
如果(赢){
win.document.body.appendChild(testScript);
listenToMessages();
}否则{
console.log(“无法打开win”);
}
}
如果(!win2 | | win2.closed){
win2=窗口。打开(“?”);
如果(win2){
设testScript2=testScript.cloneNode();
win2.document.body.appendChild(testScript2);
listenToMessages();
}否则{
console.log(“无法打开win2”);
}
}
}, 2000);
让testScript=document.createElement('script');

testScript.textContent='console.log(“此处!”)你是个救生员!我不知道是这样的。我真的以为每次打开一个新窗口时,只会追加一个节点的副本。非常感谢。