两个iframe之间的JavaScript / jQuery拖放元素

时间:2015-03-05 14:10:04

标签: javascript jquery iframe drag-and-drop draggable

我有一个包含2个iframe的页面,它们来自同一个域。我想拖动一个元素从一个iframe的特定拖动区域(例如一个表格)拖放到另一个iframe的特定拖放区域(例如列表)。我检查了stackoverflow和其他地方的所有相关问题,但我找不到合适的解决方案。我尝试使用jQuery UI draggable,但问题是返回的draggable元素包含在iframe中。我无法将其拖出iframe边界。所以,我的下一个想法是在顶部(父)窗口上创建可拖动元素,但是我想我必须以某种方式从iframe上的dragstart事件触发父窗口上的拖动事件。但是,当我将鼠标悬停在丢帧上的相应元素上时,如何检测掉落事件?

哦,如果这已经不够了,我也想让它在IE8上运行:) 但就目前而言,我们只是说我会找到一个IE8的后备解决方案,它不会涉及拖拽。

2 个答案:

答案 0 :(得分:6)

您可以通过将iframe中的鼠标消息发送到父级并在父级中执行拖动来模拟拖动。这是一个代码库,显示从一帧到另一帧的拖动列表项:http://codepen.io/brenzy/details/zxMZmO/

由于SO需要一些代码,因此这是与父母交谈的dragHandler:

$("li").mousedown(function (event) {
  dragElement = $(this);
  if(event.stopPropagation) event.stopPropagation();
  if(event.preventDefault) event.preventDefault();
  event.cancelBubble=true;
  event.returnValue=false;
  return false;
});

$(document).mousemove(function (event) {
  if (dragElement) {
    if (!dragStarted) {
      // tell the parent to start dragging the item
      parent.postMessage({
        action: "dragStart", frame: myId,
        itemText: dragElement.text(), itemId: dragElement.attr('id'),
        offset: {left: event.pageX, top: event.pageY}
      }, '*');
      dragStarted = true;
    } else {
      parent.postMessage({action: "dragMove", frame: myId,
        offset: {left: event.pageX, top: event.pageY}}, '*');
    }
  }
});

$(document).mouseup(function (event) {
  if (dragStarted) {
    parent.postMessage({
      action: "cancelDrag", frame: myId,
      itemText: dragElement.text(), itemId: dragElement.attr('id'),
      offset: {left: event.pageX, top: event.pageY}
    }, '*');
  }
  dragStarted = false;
  dragElement = null;
});

注意:这仅适用于Chrome,但我确信您可以在其他浏览器中使用它。

答案 1 :(得分:0)

我没有为你写出完整的代码,因为其中涉及很多代码。但我会给你基础知识。它被称为消息元素。您可以使用表将消息元素传递到框架中的父窗口。然后,您将从父窗口传递另一个消息元素到具有列表的子窗口。

不幸的是,我在制作过程中遇到的唯一问题是在您必须登录才能查看的网站上。而我的游乐场服务器对外界来说是不可见的。否则我会告诉你一个有效的例子,让你偷我的代码,或者至少知道它是如何工作的。

如果你可以让它一起工作,看看你是否将下面列出的2套代码放在2个文件中,

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            window.onload = function () {
                var iframeWin = document.getElementById("da-iframe").contentWindow,
                form = document.getElementById("the-form"),
                myMessage = document.getElementById("my-message");
                myMessage.select();
                form.onsubmit = function () {
                    iframeWin.postMessage(myMessage.value, "http://localhost/payground/");
                    return false;
                };
            };
</script>
    </head>
    <body>
        <form id="the-form" action="/">
                    <input type="text" id="my-message" value="Your message">
                    <input type="submit" value="postMessage">
                </form>

                <iframe id="da-iframe" src="frame.php"></iframe>
    </body>
</html>

下一位应该在名为frame.php

的同一目录中
<html><head>
    <script>
        function displayMessage (evt) {
            var message;
            if (evt.origin !== "http://localhost") {
                message = "You are not worthy "+evt.origin;
            }
            else {
                message = "I got " + evt.data + " from " + evt.origin;
            }   
            document.getElementById("received-message").innerHTML = message;
        }

        if (window.addEventListener) {
            // For standards-compliant web browsers
            window.addEventListener("message", displayMessage, false);
        }
        else {
            window.attachEvent("onmessage", displayMessage);
        }
    </script>
    </head>
    <body>
        <div id="received-message">I heard nothing yet</div>
    </body>
</html>

我希望你能够弄清楚你想做什么的细节。