0

時間の経過とともに発生するイベントを表示するグラフを作成しています。<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>

このグラフの上部には、ドラッグおよびサイズ変更可能な「定規」があります。<div>

<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"
});

以下で参照されているフィドルで、「なげなわ選択」を行うと、バーがピンクになることがわかります。

ただし、定規をこの「なげなわ選択」と組み合わせたい、つまり、定規をドラッグすると、<div>下にあるすべてが選択されるようにしたいと考えています。

私の問題を説明するためにフィドルを作成しました: http://jsfiddle.net/Lge93/

私はJavascriptとJqueryを初めて使用するので、解決策や提案をいただければ幸いです。

御時間ありがとうございます

投稿の回答を編集: Jtromans によって提供されたコードに基づく私の最終的なソリューションは、ここで入手できます: http://jsfiddle.net/Lge93/5/

4

2 に答える 2

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/

于 2013-11-13T11:00:54.553 に答える
0

あなたの質問を正しく理解できれば、次の方法で問題を解決できるようです。

ルーラーを操作すると、新しい幅、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)
});
于 2013-11-13T10:36:32.827 に答える