jQuery ui 可拖动元素在滚动 div 之外不可“拖动" [英] jQuery ui draggable elements not 'draggable' outside of scrolling div

查看:37
本文介绍了jQuery ui 可拖动元素在滚动 div 之外不可“拖动"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在一个 div 中有许多元素(浮动 href 标签),它们具有设置的高度/宽度,在 CSS 中滚动设置为 overflow: auto.

这是div的结构:

<div id="tf_div_tagsReturn"><!-- 所有可拖动元素都放在这里,父 div scolls -->

<div id="tf_div_tagsDrop"><div id="tf_dropBox"></div></div></div>

父 div 的 'tf_div_tagsReturn' 和 'tf_div_tagsDrop' 最终将彼此相邻浮动.

这是在使用类名tag_cell"创建所有可拖动"元素后运行的 jQuery:

$(function() {$(".tag_cell").draggable({回复: '无效',滚动:假,遏制:'#tagFun_div_main'});$("#tf_dropBox").droppable({接受:'.tag_cell',悬停类:'tf_dropBox_hover',activeClass: 'tf_dropBox_active',下降:功能(事件,用户界面){GLOBAL_ary_tf_tags.push(ui.draggable.html());tagFun_reload();}});});

正如我上面所说的,可拖动元素在 div 'tf_div_tagsReturn' 内是可拖动的,但它们不会在视觉上拖动到该父 div 之外.值得注意的是,如果我拖动可拖动元素之一,并将鼠标移到可放置的 div 上,id 为 'tf_dropBox',然后悬停类被触发,我就再也看不到可拖动元素了.

这是我第一次使用 jQuery,所以希望我只是遗漏了一些非常明显的东西.到目前为止,我一直在阅读文档和搜索论坛,但没有成功:(

更新:

非常感谢 Jabes88 提供的解决方案,使我能够实现我正在寻找的功能.这是我的 jQuery 最终的样子:

$(function() {$(".tag_cell").draggable({回复: '无效',滚动:假,遏制:'#tagFun_div_main',帮手:'克隆',开始:函数(){this.style.display="无";},停止:函数(){this.style.display="";}});$(".tf_dropBox").droppable({接受:'.tag_cell',悬停类:'tf_dropBox_hover',activeClass: 'tf_dropBox_active',下降:功能(事件,用户界面){GLOBAL_ary_tf_tags.push(ui.draggable.html());tagFun_reload();}});});

解决方案

您是否打算允许多个可拖动对象的实例?然后使用 helper 和 append 选项:

$(".tag_cell").draggable({帮手:'克隆',appendTo: 'div#myHelperHolder'});

然后在你的 css 中你可以将 div#myHelperHolder 的 zindex 设置为 999.如果没有,请尝试仅使用 zindex 选项:

$(".tag_cell").draggable({z索引:999});

我还会考虑设置 addClasses 来阻止插件添加所有那些浪费处理器速度的烦人的类.

更新:我有一个新的解决方案

好吧,在玩了一会儿之后我想出了这个:滚动选项不会阻止孩子被溢出隐藏.我已经阅读了其他一些帖子,但找不到单一的解决方案.但我想出了一些解决方案来完成工作.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><头><script type="text/javascript" src="http://www.google.com/jsapi"></script><script type="text/javascript">google.load("jquery", "1.4.0");google.load("jqueryui", "1.7.2");google.setOnLoadCallback(OnLoad);函数 OnLoad(){变量下降 = 假;$(".tag_cell").draggable({添加类:假,回复: '无效',遏制:'#tagFun_div_main',帮手:'克隆',appendTo: '#tagFun_div_helper',开始:功能(事件,用户界面){下降 = 假;$(this).addClass("隐藏");},停止:功能(事件,用户界面){如果(下降==真){$(this).remove();} 别的 {$(this).removeClass("隐藏");}}});$("#tf_dropBox").droppable({接受:'.tag_cell',悬停类:'tf_dropBox_hover',activeClass: 'tf_dropBox_active',下降:功能(事件,用户界面){下降 = 真;$.ui.ddmanager.current.cancelHelperRemoval = true;ui.helper.appendTo(this);}});}<风格>div#tagFun_div_main { 显示:块;宽度:800px;高度:400px;保证金:自动;填充:10px;背景:#F00;}div#tf_div_tagsReturn { 显示:块;宽度:200px;高度:100%;向左飘浮;溢出:自动;背景:#000;}div#tf_div_tagsDrop { 显示:块;宽度:200px;高度:100%;浮动:右;背景:#0F0;}div#tf_dropBox { 显示:块;宽度:100%;高度:250px;背景:#F0F;}span.tag_cell { 显示:块;宽度:25px;高度:25px;边距:1px;向左飘浮;游标:指针;背景:#0FF;z-索引:99;}span.tag_cell.hide { 显示:无;}div#tf_dropBox.tf_dropBox_hover { 背景:#FFF !重要;}div#tf_dropBox.tf_dropBox_active { 背景:#333;}</风格><身体><div id="tagFun_div_main"><div id="tf_div_tagsReturn"><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span><span class="tag_cell"></span>

<div id="tf_div_tagsDrop"><div id="tf_dropBox"></div>

<div id="tagFun_div_helper"><!-- 这是临时使用辅助函数的地方 -->

我粘贴了我的整个代码,以便您可以试用.以下是简要说明:当您开始拖动项目时,它会隐藏原始项目,克隆它,然后将克隆附加到溢出区域外的容器中.删除后,它会删除原始副本并将克隆移动到放置区.太好了,现在我们已经修复了溢出问题,但遇到了其他一些问题.当您将克隆物品放入放置区时,它会消失.为了阻止这种情况发生,我使用了这种方法:

$.ui.ddmanager.current.cancelHelperRemoval = true;

现在我们已经阻止了助手被移除,但它仍然在div#tagFun_div_helper"中,而原始的可拖动项目又重新出现了.

ui.helper.appendTo(this);

这会将助手从div#tagFun_div_helper"转移到我们的放置区.

dropped = true;

这将告诉我们的停止函数从组中删除原始项目,而不是删除.hide"类.希望有帮助!

I have many elements (floating href tags) in a div with a set height/width, with scroll set to overflow: auto in the CSS.

This is the structure of the divs:

<div id="tagFun_div_main">
<div id="tf_div_tagsReturn">
    <!-- all the draggable elements go in here, the parent div scolls -->
</div>
<div id=" tf_div_tagsDrop">
    <div id="tf_dropBox"></div>
</div></div>

the parent div's, 'tf_div_tagsReturn' and 'tf_div_tagsDrop' will ultimately float next to each other.

Here is the jQuery which is run after all of the 'draggable' elements have been created with class name 'tag_cell', :

$(function() {
    $(".tag_cell").draggable({ 
        revert: 'invalid', 
        scroll: false,
        containment: '#tagFun_div_main'
    });
    $("#tf_dropBox").droppable({
        accept: '.tag_cell',
        hoverClass: 'tf_dropBox_hover',
        activeClass: 'tf_dropBox_active',
        drop: function(event, ui) {
            GLOBAL_ary_tf_tags.push(ui.draggable.html());
            tagFun_reload();
        }
    });
}); 

as I stated above, the draggable elements are draggable within div 'tf_div_tagsReturn', but they do not visually drag outside of that parent div. worthy to note, if I am dragging one of the draggable elements, and move the mouse over the droppable div, with id 'tf_dropBox', then the hoverclass is fired, I just can't see the draggable element any more.

This is my first run at using jQuery, so hopefully I am just missing something super obvious. I've been reading the documentation and searching forums thus far to no prevail :(

UPDATE:

many thanks to Jabes88 for providing the solution which allowed me to achieve the functionality I was looking for. Here is what my jQuery ended up looking like:

$(function() {
    $(".tag_cell").draggable({ 
        revert: 'invalid', 
        scroll: false,
        containment: '#tagFun_div_main',
        helper: 'clone',
        start : function() {
        this.style.display="none";
        },
        stop: function() {
        this.style.display="";
        }
    });
    $(".tf_dropBox").droppable({
        accept: '.tag_cell',
        hoverClass: 'tf_dropBox_hover',
        activeClass: 'tf_dropBox_active',
        drop: function(event, ui) {
            GLOBAL_ary_tf_tags.push(ui.draggable.html());
            tagFun_reload();
        }
    });
}); 

解决方案

Are you going to allow more than one instance with your draggable objects? then use the helper and append option:

$(".tag_cell").draggable({ 
  helper: 'clone',
  appendTo: 'div#myHelperHolder'
});

Then in your css you can set the zindex of div#myHelperHolder to be 999. If not, then try just using the zindex option:

$(".tag_cell").draggable({ 
  zIndex: 999
});

I would also consider setting addClasses to stop the plugin from adding all those annoying classes that waste processor speed.

UPDATE: I HAVE A NEW SOLUTION

Okay after playing with it for a bit I came up with this: the scroll option doesn't stop the child from being hidden with overflow. I've read some other posts and I cant find a single solution. But I came up with a bit of a work-a-round that gets the job done.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
    google.load("jquery", "1.4.0");
    google.load("jqueryui", "1.7.2");   
    google.setOnLoadCallback(OnLoad);
    function OnLoad(){
        var dropped = false;
        $(".tag_cell").draggable({ 
            addClasses: false,
            revert: 'invalid',
            containment: '#tagFun_div_main',
            helper: 'clone',
            appendTo: '#tagFun_div_helper',
            start: function(event, ui) {
                dropped = false;
                $(this).addClass("hide");
            },
            stop: function(event, ui) {
                if (dropped==true) {
                    $(this).remove();
                } else {
                    $(this).removeClass("hide");
                }
            }
        });
        $("#tf_dropBox").droppable({
            accept: '.tag_cell',
            hoverClass: 'tf_dropBox_hover',
            activeClass: 'tf_dropBox_active',
            drop: function(event, ui) {
                dropped = true;
                $.ui.ddmanager.current.cancelHelperRemoval = true;
                ui.helper.appendTo(this);
            }
        });
    }
    </script>
    <style>
        div#tagFun_div_main { display:block; width:800px; height:400px; margin:auto; padding:10px; background:#F00; }
        div#tf_div_tagsReturn { display:block; width:200px; height:100%; float:left; overflow:auto; background:#000; }
        div#tf_div_tagsDrop { display:block; width:200px; height:100%; float:right; background:#0F0; }
        div#tf_dropBox { display:block; width:100%; height:250px; background:#F0F; }
        span.tag_cell { display:block; width:25px; height:25px; margin:1px; float:left; cursor:pointer; background:#0FF; z-index:99; }
        span.tag_cell.hide { display:none; }
        div#tf_dropBox.tf_dropBox_hover { background:#FFF !important; }
        div#tf_dropBox.tf_dropBox_active { background:#333; }
    </style>
</head>
<body>
    <div id="tagFun_div_main">
        <div id="tf_div_tagsReturn">
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
            <span class="tag_cell"></span>
        </div>
        <div id="tf_div_tagsDrop">
            <div id="tf_dropBox"></div>
        </div>
    </div>
    <div id="tagFun_div_helper">
    <!-- this is where the helper gets appended for temporary use -->
    </div>
</body>
</html>

I pasted my entire code so you can try it out. Here is a brief description: When you start to drag an item it hides the original, clones it, then appends the clone to a container outside the overflow area. Once dropped it removes the original and moves the clone into the drop zone. Great so now we have fixed that overflow issue but run into some others. When you drop the clone item into the drop zone it disappears. To stop that from happening I used this method:

$.ui.ddmanager.current.cancelHelperRemoval = true;

Now we have stopped the helper from being removed but it remains in "div#tagFun_div_helper" while the original draggable item has reappeared.

ui.helper.appendTo(this);

This will transfer the helper from "div#tagFun_div_helper" into our drop zone.

dropped = true;

This will tell our stop function to delete the original item from the group instead of removing the ".hide" class. Hope that helps!

这篇关于jQuery ui 可拖动元素在滚动 div 之外不可“拖动"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆