【问题标题】:How to select all divs that overlay with a draggable div in jquery?如何在 jquery 中选择所有覆盖有可拖动 div 的 div?
【发布时间】:2013-11-13 10:26:22
【问题描述】:

我正在构建一个图表,显示随时间发生的事件。我的每个事件都是一个使用<div> 创建的水平条,如下所示:

<div class="aaaa" style="margin-left: 0.00%; width:100.00%;">aaaa</div>
<div class="aaaa" style="margin-left: 5.00%; width: 20.00%;">bbbb</div>
<div class="aaaa" style="margin-left:25.00%; width: 50.00%;">cccc</div>
<div class="aaaa" style="margin-left:55.00%; width: 45.00%;">dddd</div>

在这张图的顶部,我有一个“尺子”,它是一个可拖动且可调整大小的&lt;div&gt;

<div id="draggable2" class="draggable ui-widget-content">
    <p>Ruler</p>
</div>

我的意图是水平拖动这个标尺并使用它来选择我的图表中位于标尺下方的所有条形图。选择条形后,背景颜色应改变。

到目前为止,我设法使用以下代码拖动并调整标尺大小:

$(function () {
    $("#draggable2").draggable({
        axis: "x"
    });
});

$(function () {
    $("#draggable2").resizable({
        helper: "ui-resizable-helper",
        handles: "se, sw, e, w"
    });
});

我还设法使用以下代码选择我想要的栏:

$(".fake").selectable({
    filter: "div"
});

您可以在下面引用的小提琴中看到,当您进行“套索选择”时,我的条变成粉红色。

但是,我想将我的标尺与这个“套索选择”结合起来,或者换句话说,我希望一旦我的标尺被拖动,下面的所有 &lt;div&gt; 都会被选中。

我创建了一个小提琴来说明我的问题:http://jsfiddle.net/Lge93/

由于我是 Javascript 和 Jquery 的新手,我非常感谢任何解决方案或建议。

感谢您的宝贵时间

编辑帖子答案: 我基于 Jtromans 提供的代码的最终解决方案可在此处获得:http://jsfiddle.net/Lge93/5/

【问题讨论】:

  • 这有点小问题 - 它在拖动时可以正常工作,但在调整标尺大小时就不行。您需要再次开始拖动它才能注意到已调整大小。

标签: javascript jquery jquery-ui jquery-ui-draggable jquery-ui-selectable


【解决方案1】:

这是我的解决方案:

$(function() {
  $( "#draggable2" ).draggable({ 
    axis: "x",
    drag: function(e) {
        var selectableElements = $(".fake").data().uiSelectable.selectees;
        var ruler = $(e.target);

        $.each(selectableElements, function(i, v) {
            if(ruler.offset().left >= $(v).offset().left) {
                $(v).addClass("ui-selected");
              }else {
                 $(v).hasClass("ui-selected") && $(v).removeClass("ui-selected");                    
            }
           });
        }

    });
});

$(function() {
  $( "#draggable2" ).resizable({
    helper: "ui-resizable-helper",
    handles: "se, sw, e, w"
  });
});

$(".fake").selectable({filter:"div"});

http://jsfiddle.net/Lge93/3/

【讨论】:

  • 感谢这段代码和小提琴。作为一个新手,我必须消化所有这些已知的东西并适应它,但我知道该去哪里!
【解决方案2】:

如果我正确理解您的问题,听起来您可以通过以下方式解决问题。

与标尺互动后,您将能够计算新的宽度、x 和 y 坐标。这非常简单,在与您的标尺进行任何形式的交互后,只需在回调中添加几行 jQuery 代码。

然后,您可以检查(甘特?)图表中的每个项目,看看它是否占据了与标尺相同的区域。这将是相对于父容器的。

问题在于您希望如何处理标尺是否“在”甘特图 div 项中。下面是一些代码,可帮助您开始确定标尺是否与其他 div 占据相同的位置:

function checkOverlays (x, width, y, height) {
    $(".aaaa").each (function (i,e) {
        var thisWidth = $(this).width();
        var thisHeight = $(this).height();
        var offsetTop = $(this).offset().top - $(this).parent().offset().top;
        var offsetLeft = $(this).offset().left - $(this).parent().offset().left;
        console.log('x coverage: ' + offsetLeft + " to " + parseFloat(thisWidth + offsetLeft));
        console.log('y coverage: ' + offsetTop + " to " + parseFloat(thisHeight + offsetTop));

        if (offsetLeft > x && offsetLeft < parseFloat(x + width) ) {
            console.log("I'm in the same x space");
            $(this).css('background-color', 'red');
        }

        if (offsetTop > y && offsetTop < parseFloat(y + height) ) {
            console.log("I'm in the same y space");
            $(this).css('background-color', 'red');
        }
    })
}



$("#draggable2").on("resize drag", function () {
    var thisWidth = $(this).width();
    var thisHeight = $(this).height();
    var offsetTop = $(this).offset().top - $(this).parent().offset().top;
    var offsetLeft = $(this).offset().left - $(this).parent().offset().left;
    console.log('x coverage: ' + offsetLeft + " to " + parseFloat(thisWidth + offsetLeft));
    console.log('y coverage: ' + offsetTop + " to " + parseFloat(thisHeight + offsetTop));

    checkOverlays (offsetLeft, thisWidth, offsetTop, thisHeight)
});

【讨论】:

  • 感谢您的回答。我理解逻辑,除非我得到一个更简单的解决方案,否则我会朝这个方向前进:-)。回答你的两个 cmets:1)是的,我的图表是一种甘特图。 2) 在我的示例中,调整大小适用于 div,但我不能说它是否适用于任何元素。
  • 我刚刚看到你的代码更新,这真的很有用,尤其是console.log信息,它可以让你准确地看到发生了什么。我想我现在有足够的材料来玩和实现所有可能的情况(标尺内的条,条内标尺的左侧或右侧等)。再次感谢您的帮助。
  • 没问题,有Q就回帖。
  • 我现在可以正常工作了。 console.log 真的很有帮助。
  • 太棒了 - 很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多