javascript - 将 DOM 元素移动到新窗口并在 IE 11 中维护事件监听器

标签 javascript jquery internet-explorer window.open

我需要创建一个页面,允许用户将页面的一部分“取消停靠”到新窗口中,他们可以将其移动到第二个显示器,然后能够将该部分“重新停靠”到主页。取消停靠的部分在停靠和取消停靠时需要维护其状态和事件监听器。解决方案可以是 Javascript 或 jQuery。

只需将 DOM 对象附加到新窗口,我就可以在 Chrome 和 Firefox 中完美地工作。但 IE 显然不允许你这样做,根据这个记录充分的帖子:Calling adoptNode and importNode on a child window fails in IE and Edge 。我在 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();
  };
};

这是一个 fiddle : https://jsfiddle.net/esharri2/4tj1zv9m/

最佳答案

我认为你应该做的是:

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

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

如果您的组件非常复杂(大量数据),您可以例如将组件状态发送到服务器,为该数据创建一些唯一的散列,然后使用该散列在弹出窗口中从服务器加载数据。

关于javascript - 将 DOM 元素移动到新窗口并在 IE 11 中维护事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38804772/

相关文章:

javascript - 添加单选按钮

Javascript 无法将日期格式设置为工作日后跟日期

javascript - 检查变量是否是javascript中的整数

javascript - setRequestHeader 不起作用,我想设置 header ,然后在 Amazon EC2 中以 ajax 发出 GET 请求

javascript - 使用 jquery 查找与可点击元素同一行的文本框的值

javascript - 可调整大小导致其下方的其他元素移动

javascript - Tinymce IE6+ 如何获得工作范围?

css - 如何解决这个 IE6 z-index 错误?

javascript - 如何将 Chart.js 插件指向不同的圆环图?

javascript - Date.parse() 在 IE 和 FireFox 中不起作用