Jquery перетащите изменить размер выбрать

4

Я использую Jqueryui drag изменить размер select все вместе перетаскивание и изменение размера отлично работают но выбор не работает нормально. JSFiddle

Мой код: -

CSS -

 .dr {
    background: none repeat scroll 0 0 #63F;
    color: #7B7B7B;
    height: 50px;

    text-shadow: 1px 1px 2px #FFFFFF;
    width: 50px;
    position:absolute;
    }
.bg_section {
    border: 1px solid #E4E3E3;
    height: 290px;
    margin: 48px auto 0;
    position: relative;
    width: 400px;
}

JS -

$(document).ready(function(){
         var selected = $([]), offset = {top:0, left:0}; 
         $( "#dialog-form" ).dialog({
          autoOpen: false,
         height: 300,
         width: 350,
         modal: true,
         buttons: {
         "Add": function() {
            section = $( "#section" ).val();
            divid = $( "#divdata" ).val();
            divstring="<div class='dr' id='"+divid+"'>"+divid+"</div>";
           // $( ".add" ).appendTo( $( "#"+section) );
            $( divstring ).appendTo( $( "."+section) );
            $( "."+section).selectable();
            $("#divdata option[value="+ divid+"]").remove();
            $("#"+divid).draggable({
                 containment: "."+section,
                 grid: [ 10, 10 ],
                  start: function(ev, ui) {
                    if ($(this).hasClass("ui-selected")){
                        selected = $(".ui-selected").each(function() {
                           var el = $(this);
                           el.data("offset", el.offset());
                        });
                    }
                    else {
                        selected = $([]);
                        $(".dr").removeClass("ui-selected");
                    }
                    offset = $(this).offset();
                },
                drag: function(ev, ui) {
                    var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left;
                    // take all the elements that are selected expect $("this"), which is the element being dragged and loop through each.
                    selected.not(this).each(function() {
                         // create the variable for we don't need to keep calling $("this")
                         // el = current element we are on
                         // off = what position was this element at when it was selected, before drag
                         var el = $(this), off = el.data("offset");
                        el.css({top: off.top + dt, left: off.left + dl});
                    });
                },
                stop: function(e, ui) {  
                     var Stoppos = $(this).position();
                     var leftPos=Stoppos.left;
                     var topPos= Stoppos.top;
                     var dragId=ui.helper[0].id;
                    // alert(leftPos/10);
                    // alert(topPos/10);
                     // alert(dragId);
                    sectionWidth= $('#'+dragId).parent().width();
                    sectionHeight = $('#'+dragId).parent().height();
                 },
          }).resizable({
             containment: "."+section,
             grid: [10,10],
             start: function(e, ui) {
                 // alert($(".paper-area").width());
                //containment: ".paper-area",
                $(this).css({
                //  position: "absolute",
                 });
            },
            stop: function(e, ui) {
                 // containment: ".paper-area",
                $(this).css({
                //   position: "absolute",
                });
            }
        });


      },
        Cancel: function() {
          $( this ).dialog( "close" );
        }
      },
      close: function() {

      }
    });

$( "body" ).on( "click", ".dr", function(e) {   


    if (e.metaKey == false) {

        // if command key is pressed don't deselect existing elements
        $( ".dr" ).removeClass("ui-selected");
        $(this).addClass("ui-selecting");
    }
    else {


        if ($(this).hasClass("ui-selected")) {
            // remove selected class from element if already selected
            $(this).removeClass("ui-selected");
        }
        else {
            // add selecting class if not
            $(this).addClass("ui-selecting");
        }
    }

    $( ".bg_section" ).data(".bg_section")._mouseStop(null);
});


$(".add").click(function() {
     $( "#dialog-form" ).dialog( "open" );
     $("#new_field").hide();
     $("#save_new").hide();
});


$(".add_new").click(function() {
    $(".add_new").hide();
    $("#new_field").show();
    $("#save_new").show();

});

$("#save_new").click(function() {

    $( "#divdata" ).append($('<option>', {
    value: $("#new_field").val(),
    text:  $("#new_field").val(),
    class:'add',
    }));

    $("#new_field").hide();
    $("#save_new").hide();
    $(".add_new").show();

});
}) 

HTML -

 <div id="dialog-form" title="Add fields in Section">
  <p class="validateTips">All form fields are required.</p>
   <div class="add_new">Add</div>
   <input type="text" id="new_field"/>
   <div id="save_new">save</div> 
  <form>
  <fieldset>
  <label for="divdata">Divs</label>
  <select name="divdata" id="divdata">

    <option value="dr1">Div1</option>
    <option value="dr2">Div2</option>
    <option value="dr3">Div3</option>
    <option value="dr4">Div4</option>
    <option value="dr5">Div5</option>

  </select>

      </br>

  <label for="section">Section</label>
<select name="section" id="section">
    <option value="paper-area">Header</option>
    <option value="paper-area-detail">Detail</option>
    <option value="paper-area-qty">Items</option>
    <option value="paper-area-sub">Total</option>
    <option value="paper-area-footer">Footer</option>
</select>

  </fieldset>
  </form>
</div>

<div class="main_bg">



<div class="textarea-top">

<div class="textarea-field">
<div class="field-icon add"><a href="#"><img src="<?php echo Yii::app()->baseUrl;?>/images/bill_add-field-icon.png" alt="add" border="0" width="29" height="25" /></a></div>

</div>


<div class="paper-area bg_section" id="paper_area">


</div>


<div class="paper-area-detail bg_section">



</div>

<div class="paper-area-qty bg_section">

</div>

<div class="paper-area-sub bg_section">

</div>

<div class="paper-area-footer bg_section"></div>

</div>

Я использую drag-select для изменения размера перетаскивания. Любая помощь должна быть оценена.

  • 1
    Что именно пытаться делать?
  • 0
    @apaul34208 apaul34208 Я пытаюсь выбрать div с помощью jquery select, чтобы я мог удалить их или изменить там css.
Показать ещё 5 комментариев

4 ответа

0
Лучший ответ

Я нашел решение Теперь мы можем использовать * Drag-Resize-Select - * together

Пример - Код: -

CSS: -

.ui-selecting {background: #FECA40;}
.ui-selected {background: #F39814; color: white;}
.bg_section {margin: 0; padding: 0; height: 300px; position: relative; padding:0; border:solid 1px #DDD;}
.bg_section > div {position: absolute; margin: 0; padding:10px; border:solid 1px #CCC; width: 100px;}
.ui-selectable-helper {position: absolute; z-index: 100; border:1px dotted black;}

JS: -

var selected = $([]);   // list of selected objects
var lastselected = '';  // for the shift-click event


$(document).ready(function(){

         $( "#dialog-form" ).dialog({
          autoOpen: false,
         height: 300,
         width: 350,
         modal: true,
         buttons: {
         "Add": function() {
            section = $( "#section" ).val();
            divid = $( "#divdata" ).val();
            divstring="<div class='dr' id='"+divid+"'>"+divid+"</div>";
           // $( ".add" ).appendTo( $( "#"+section) );
            $( divstring ).appendTo( $( "."+section) );
            $("#divdata option[value="+ divid+"]").remove();
            $("#"+divid).draggable({
                 containment: "."+section,
                 grid: [ 10, 10 ],
                 start: function(ev, ui) {
                $(this).is(".ui-selected") || $(".ui-selected").removeClass("ui-selected");
                selected = $(".ui-selected").each(function() {
                    $(this).addClass("dragging");
                });
            },
            drag: function(ev, ui) {

            },
                stop: function(e, ui) {  
                    selected.each(function() {
                    $(this).removeClass("dragging");
                    });



                     var Stoppos = $(this).position();
                     var leftPos=Stoppos.left;
                     var topPos= Stoppos.top;
                     var dragId=ui.helper[0].id;
                    // alert(leftPos/10);
                    // alert(topPos/10);
                     // alert(dragId);
                    sectionWidth= $('#'+dragId).parent().width();
                    sectionHeight = $('#'+dragId).parent().height();
                 },
          }).resizable({
             containment: "."+section,
             grid: [10,10],
             start: function(e, ui) {
                 // alert($(".paper-area").width());
                //containment: ".paper-area",
                $(this).css({
                //  position: "absolute",
                 });
            },
            stop: function(e, ui) {
                 // containment: ".paper-area",
                $(this).css({
                //   position: "absolute",
                });
            }
        });
        $("#paper_area").selectable();

      },
        Cancel: function() {
          $( this ).dialog( "close" );
        }
      },
      close: function() {

      }
    });

$( "body" ).on( "click", ".dr", function(evt) { 


            id = $(this).attr("id");

            // check keys
            if ((evt.shiftKey) && (lastselected != '')) {
                // loop all tasks, select area from this to lastselected or vice versa
                bSelect = false;
                $(".task").each(function() {
                    if ($(this).is(':visible')) {
                        if ($(this).attr("id") == id || $(this).attr("id") == lastselected)
                            bSelect = !bSelect; 

                        if (bSelect || $(this).attr("id") == lastselected || $(this).attr("id") == lastselected) {
                            if (!$(this).hasClass("ui-selected"))
                                $(this).addClass("ui-selected");
                        }
                        else
                            $(this).removeClass("ui-selected");
                    }
                });
                return;
            }
            else if (!evt.ctrlKey)
                $(".ui-selected").removeClass("ui-selected"); // clear other selections

            if (!$(this).hasClass("ui-selected")) {
                $(this).addClass("ui-selected");
                lastselected = id;
            }
            else {
                $(this).removeClass("ui-selected");
                lastselected = '';
            }
});


$(".add").click(function() {
     $( "#dialog-form" ).dialog( "open" );
     $("#new_field").hide();
     $("#save_new").hide();
});


$(".add_new").click(function() {
    $(".add_new").hide();
    $("#new_field").show();
    $("#save_new").show();

});

$("#save_new").click(function() {

    $( "#divdata" ).append($('<option>', {
    value: $("#new_field").val(),
    text:  $("#new_field").val(),
    class:'add',
    }));

    $("#new_field").hide();
    $("#save_new").hide();
    $(".add_new").show();

});
}) 
2

Самый простой способ изменить размер - с помощью resize:both;, max-height:__px;, max-width:__px; в CSS

  • 0
    Изменение размера это здорово, но он все еще не поддерживается в IE или Edge
2

Похоже на странную ошибку/конфликт с jquery ui dragable и/или resizeable. Только некоторые части selectable работают в сочетании с этими двумя другими функциями. Если вы проверите элементы, которые имеют все три функции, и вы попытаетесь выбрать один из них, он получит только класс "ui-selection", который является классом тайм-аута и возможностью выбора, но останавливается там. Обычно классы заменяются следующим образом:

  • щ-призывник
  • Ui-выбор
  • щ выбраны.

Если вы удаляете функции перетаскивания и изменения размера, выбираемый материал работает нормально (но в вашем коде все еще есть другие ошибки)

Я предполагаю, что можно объединить все эти функции, но вам придется поиграть с опциями и callbacks, чтобы заставить его работать так, как вы хотите. Возможно, не все, что вы хотите, возможно из-за этих конфликтов.

1

Действительно, кажется, что jquery ui draggable и selectable не работают так хорошо вместе. Однако другие люди опубликовали решения. Посмотрите следующее:

http://words.transmote.com/wp/20130714/jqueryui-draggable-selectable/ http://jsfiddle.net/6f9zW/light/ (это из статьи выше)

Так как это выглядит как хорошее рабочее решение, которое проверяет состояние при перетаскивании и выборе, я также опубликую его ниже, если сайт опустится.

JS

// this creates the selected variable
// we are going to store the selected objects in here
var selected = $([]), offset = {top:0, left:0}; 

$( "#selectable > div" ).draggable({
    start: function(ev, ui) {
        if ($(this).hasClass("ui-selected")){
            selected = $(".ui-selected").each(function() {
               var el = $(this);
               el.data("offset", el.offset());
            });
        }
        else {
            selected = $([]);
            $("#selectable > div").removeClass("ui-selected");
        }
        offset = $(this).offset();
    },
    drag: function(ev, ui) {
        var dt = ui.position.top - offset.top, dl = ui.position.left - offset.left;
        // take all the elements that are selected expect $("this"), which is the element being dragged and loop through each.
        selected.not(this).each(function() {
             // create the variable for we don't need to keep calling $("this")
             // el = current element we are on
             // off = what position was this element at when it was selected, before drag
             var el = $(this), off = el.data("offset");
            el.css({top: off.top + dt, left: off.left + dl});
        });
    }
});

$( "#selectable" ).selectable();

// manually trigger the "select" of clicked elements
$( "#selectable > div" ).click( function(e){
    if (e.metaKey == false) {
        // if command key is pressed don't deselect existing elements
        $( "#selectable > div" ).removeClass("ui-selected");
        $(this).addClass("ui-selecting");
    }
    else {
        if ($(this).hasClass("ui-selected")) {
            // remove selected class from element if already selected
            $(this).removeClass("ui-selected");
        }
        else {
            // add selecting class if not
            $(this).addClass("ui-selecting");
        }
    }

    $( "#selectable" ).data("selectable")._mouseStop(null);
});

// starting position of the divs
var i = 0;
$("#selectable > div").each( function() {
    $(this).css({
        top: i * 42 
    });
    i++;
});

CSS

#selectable .ui-selecting {background: #FECA40;}
#selectable .ui-selected {background: #F39814; color: white;}
#selectable {margin: 0; padding: 0; height: 300px; position: relative; padding:0; border:solid 1px #DDD;}
#selectable > div {position: absolute; margin: 0; padding:10px; border:solid 1px #CCC; width: 100px;}
.ui-selectable-helper {position: absolute; z-index: 100; border:1px dotted black;}

HTML

<div id="selectable">
  <div class="ui-widget-content">Item 1</div>
  <div class="ui-widget-content">Item 2</div>
  <div class="ui-widget-content">Item 3</div>
  <div class="ui-widget-content">Item 4</div>
  <div class="ui-widget-content">Item 5</div>
</div>

Другие темы, описывающие похожие проблемы и решения,

Есть ли плагин JQuery, который объединяет Draggable и Selectable

jQuery UI: объединение выбираемых с помощью Draggable

Ещё вопросы

Сообщество Overcoder
Наверх
Меню