将DOM元素移动到一个新窗口并在IE 11中保持事件监听器

4
我需要创建一个页面,允许用户将页面的某个部分“解锁”成一个新窗口,然后将其移动到第二个显示器上,并能够将该部分“重新锁定”到主页面。在解锁和锁定时,该部分需要保持其状态和事件监听器。解决方案可以使用Javascript或jQuery。
我已经成功地在Chrome和Firefox中通过将DOM对象附加到新窗口来实现这一点。但是,根据这篇广为流传的帖子,IE显然不允许您这样做:在IE和Edge中调用adoptNode和importNode会失败。在IE中,我遇到了这个错误:JS5022 以下是我的当前尝试,使用.html方法,在IE中似乎有效,但我意识到我失去了所有的事件监听器。

<head>
<script src="https://code.jquery.com/jquery-3.1.0.js" integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk=" crossorigin="anonymous"></script>
<script src="lab.js"></script>
</head>
    <body>
      <div id="A">
        <h3>Div A</h3>
        <input type="text" name="fname" placeholder="test">
        <br>
        <button id="popinout">Pop in/out</button>
      </div>

      <div id="B">
        <h3>Div B</h3>
      </div>
    </body>

var docked = true;
var floatWindow;

$("#popinout").click(function() {
  console.log(docked);
  if (docked == true) {
    undock();
  } else {
    dock();
  }
});

var dock = function() {
  docked = true;
  //Left over from approach where I was trying to copy DOM elements.
  $("body").prepend($("#A", floatWindow.document));
  floatWindow.close();
};

var undock = function() {
  docked = false;
  floatWindow = window.open("", "", "menubar=no, toolbar=no, titlebar=no, location=no, resizable=yes");
  var head = $("head").clone().html();
  var tmp = document.createElement("div");
  var divA = $(tmp).append($("#A")).html();
  //css does not load without this open / close (do not know why)
  floatWindow.document.open();
  floatWindow.document.close();
  $("head", floatWindow.document).append(head);
  $("body", floatWindow.document).append(divA);
  floatWindow.onbeforeunload = function() {
    dock();
  };
};

这里有一个代码片段: https://jsfiddle.net/esharri2/4tj1zv9m/
1个回答

0

我认为你应该这样做:

  • 通过ajax(小部件等)使该组件/部分可用
  • 在“主页面”上使用ajax加载它
  • 创建一个单独的HTML页面,仅包括该部分,并通过查询参数传递其状态。这是您在弹出窗口/新窗口中使用的页面。

这样,您可以单独使用相同的组件/部分或将其包含到其他页面中。

如果您的组件非常复杂(有很多数据),您可以将组件状态发送到服务器,创建一些唯一的哈希来存储数据,然后使用该哈希从服务器加载数据以在弹出窗口中显示。


谢谢,Hardy!我已经开始考虑类似的事情了。这最终似乎比我试图做的要更加“清晰”。 - ESH
是的,从DOM复制东西到另一个窗口更像是“泡泡糖解决方案”。 - Hardy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接