IFrame 中的 jQuery 可拖动处理程序

Posted

技术标签:

【中文标题】IFrame 中的 jQuery 可拖动处理程序【英文标题】:jQuery Draggable Handler inside IFrame 【发布时间】:2011-03-26 02:54:36 【问题描述】:

真是一口。

基本上,我有一个父 <div>,里面有一个 <iframe>。我需要 iframe 内的一个元素作为拖动父 div 的句柄。这甚至可能吗?

我试过了:

$(node).draggable("option","handle",$('iframe',node).contents().find('#handle'));
$(node).draggable("option","handle",$('iframe',node).contents().find('#handle')[0]);

它的目标是正确的 DOM 元素,但它不会拖动。可能可以在 iframe 顶部覆盖隐藏的 div,但我发现当位置是绝对的时,iframe 将事件置于 div 之上。奇怪。

【问题讨论】:

使用 iFrameFix 进行拖动对我来说仍然滞后。如果对话框是可接受的解决方案,则对话框效果更好。它仍然可以拖动,但也可以关闭。 【参考方案1】:

试试这个

$('#Div').draggable( iframeFix: true );

这应该可以工作

【讨论】:

【参考方案2】:

我决定尝试一下,男孩,使用内部 iframe 节点作为句柄的工作量很大,但进展甚微。无论如何,这里有两个解决方案,第一个不太好用,但如果你能让它工作,它可能更可取。

main.html(抄袭自演示)

<div id="draggable" class="ui-widget-content" style="position:relative;">
    <p class="ui-widget-header">I can be dragged only by this handle</p>
    <iframe name="iframe1" src="inner-handle.html" height=50 width=80></iframe>
</div>

inner-handle.html

<html>
    <head>
        <script type="text/javascript" src="../../jquery-1.4.2.js"></script>
    </head>
    <body>
        <div id="innerHandle">handle</div>
    </body>
</html>

JavaScript

$(function () 
    var moveEvent;
    $(document).mousemove(function (e) 
        moveEvent = e;
    );

    $("#draggable").draggable();
    $('iframe', '#draggable').load(function () 
        $('iframe', '#draggable')[0].contentWindow.$('#innerHandle').mousedown(function (e) 
            $('#draggable').draggable().data('draggable')._mouseDown(moveEvent);
            return false;
        );
    );
);

我花了一段时间才找到“有效”的东西。这里的问题是,因为 mousedown 事件发生在 iframe 内的元素上,所以鼠标事件是相对于 iframe,而不是主文档。解决方法是在文档上设置一个移动事件并从那里获取鼠标位置。再一次,问题是如果鼠标在 iframe 内,它“不”根据父文档移动。这意味着只有当鼠标到达 iframe 的边缘进入父文档时才会发生拖动事件。

解决方法可能是手动生成事件,其中 iframe 相对于鼠标移动的计算位置。因此,当您的鼠标在 iframe 内移动时,请使用 iframe 到父文档的坐标来计算其移动。这意味着您需要使用来自 mousedown 而不是 mousemove 的事件,

$('iframe', '#draggable')[0].contentWindow.$('#innerHandle').mousedown(function (e) 
    // do something with e
    $('#draggable').draggable().data('draggable')._mouseDown(e);
    return false;
);

第二种解决方案是您提到的方式,在 iframe 本身上有一个绝对定位的 div。我可以毫不费力地将 div 放在 iframe 之上,也就是说,

<div id="draggable" class="ui-widget-content" style="position:relative;">
    <p class="ui-widget-header">I can be dragged only by this handle</p>
    <iframe name="iframe1" src="inner-handle.html" height=50 width=80></iframe>
    <div style="position: absolute; height: 30px; width: 30px; background-color: black; z-index: 1000;"></div>
</div>

您的 div 位于 iframe 后面的问题可能是因为 z-index 已关闭。如果你在 iframe 之前声明你的 div 并且你没有指定 z-index,那么 iframe 将在顶部。

无论你选择哪种方式,祝你好运!

【讨论】:

哇,感谢您的辛勤工作。我想我会尝试第二种解决方案。我认为第一个太麻烦了。非常感谢!【参考方案3】:

当你这样做时会发生什么(激活firebug):

var frameContent = $('iframe',node).contents()
var handle = frameContent.find('#handle');
console.debug(frameContent, handle)

handle 是否包含元素列表?如果是这样,请仔细查看Document 对象,即frameContent - URL 是"about:blank" 吗?这只是一种预感,但如果你得到这些输出,它可能正在执行 jQuery 选择器帧内容加载之前(即,在 #handle 元素存在之前)。

在这种情况下,您可以将事件添加到 IFRAME 文档,并通过 window.parent 与父框架通信。

【讨论】:

现在无法测试,因此将尽快尝试,但我正在更改 iframe 中 window.onload 上的选项,因此我认为它已准备就绪。当我记录找到的内容时,它是正确的 DOM 元素。也许这是不可能的。

以上是关于IFrame 中的 jQuery 可拖动处理程序的主要内容,如果未能解决你的问题,请参考以下文章

JQuery 可拖动到 iframe 之外。可放置在 iframe 内

在 iframe 内启用可拖动的 Jquery 滚动

jquery ui可拖动可排序元素到iframe中

无法为 iframe 使用可拖动的 jQuery UI

如何使用 jquery 从中心拖动 iframe?

jQuery-UI 可拖动克隆 - 启动处理程序是不是收到对被克隆元素的任何引用?