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

Posted

技术标签:

【中文标题】JavaScript/jQuery 在两个 iframe 之间拖放元素【英文标题】:JavaScript/jQuery drag and drop element between two iframes 【发布时间】:2015-05-06 22:28:26 【问题描述】:

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

哦,如果这还不够难,我也想让它在 IE8 上运行 :) 但就目前而言,假设我会为 IE8 找到一个不涉及拖放的后备解决方案。

【问题讨论】:

分两步解决问题。首先,弄清楚如何将一个项目从 iframe 中拖到父文档中。一旦你在那里,从父文档到 iframe 已经解决了。 ***.com/questions/3075696/… 可拖动元素可以是粘性的(单击拾取,再次单击放下),还是必须与按住鼠标/触摸的用户一起使用? 它必须像通常的拖放一样工作,即按住鼠标进行拖动。否则我已经知道如何模拟行为了。 @KevinB 如果您知道答案,请赐教并索取赏金。类似尤达的答案不是很有帮助:) @AsGoodAsItGets 请显示您的 html 框架和父页面。 【参考方案1】:

您可以通过从 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,但我很确定您可以在其他浏览器中使用它。

【讨论】:

很有趣,所以您没有使用原生 HTML 5 DnD 支持,而且根本没有拖动事件?我将不得不更仔细地研究代码,但你的答案似乎是迄今为止最好的。告诉你什么,如果没有其他人想出更好的东西,你可以得到赏金,至少付出所有的努力! (顺便说一句,这里有些人会收取 2000 美元!:)) 您提到您希望它在 IE8 中工作。我认为通过一些小的更改(鼠标的 setCapure 和消息的 attachEvent),您应该也可以在 IE8 中使用它。我试着看看我是否能想出一个解决你问题的方法,就因为这两个 cmets :)【参考方案2】:

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

不幸的是,我在制作中唯一能看到的地方是你必须登录才能查看的网站。我的操场服务器对外界是不可见的。否则,我会向您展示一个可行的示例,让您从我这里窃取代码,或者至少了解它的工作原理。

看看你是否将下面列出的 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>

我希望这足以让您弄清楚您想要做什么的细节。

【讨论】:

对不起,不,这还不够,我什至看不出与我的问题的相关性。我们谈论的是典型的拖放用户交互,而不是 iframe 之间的通信。在您的示例中,您甚至没有使用 mousedown/move/up 事件。也许我必须更准确地回答我的问题? 是的,但这是使用的代码,您必须更改代码才能使用鼠标拖动。这个例子展示了如何在框架中从不同的网页发送数据。就像我说的那样,这会给你这个想法。如果你真的想让我为你编程,你必须拿出一些现金。

以上是关于JavaScript/jQuery 在两个 iframe 之间拖放元素的主要内容,如果未能解决你的问题,请参考以下文章

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

Javascript / Jquery 将变量拆分为两个以进行条带集成

如何在 JavaScript/jQuery 中实现重载?

使用 javascript/jquery 动态创建 div

在光标使用 Javascript/jquery 的位置插入文本

在光标使用 Javascript/jquery 的位置插入文本