拖动后元素变得随机不可调整大小

Posted

技术标签:

【中文标题】拖动后元素变得随机不可调整大小【英文标题】:Elements became randomly non-resizable after dragging 【发布时间】:2016-04-14 09:06:45 【问题描述】:

选择并拖动多个元素后,其中一些元素不再可调整大小:调整大小图标从右上角消失。

可调整大小的图标保留在旧位置,并且不会移动已移动的元素。

要重现,请运行下面的代码,使用套索选择所有元素并拖动所选元素。之后,调整大小的图标从随机元素中消失,这些元素不再可拖动。

如何解决这个问题?

我试图通过添加来解决这个问题

$(".designer-verticalline, .designer-rectangle, .designer-field, .designer-image").resizable();

到 drag() 方法结束,但问题仍然存在

也报道于

https://bugs.jqueryui.com/ticket/14898#ticket

小提琴:https://jsfiddle.net/txbcj9qy/

<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
  <style>
    .designer-panel-body 
      min-height: 1px;
      overflow: hidden;
      margin: 0;
      padding: 0;
    
    .panel-footer 
      background-color: inherit;
    
    .designer-panel,
    .designer-resetmargins 
      margin: 0;
      padding: 0;
    
    .designer-verticalline,
    .designer-horizontalline,
    .designer-rectangle 
      font-size: 1pt;
      border: 1px solid #000000;
    
    .designer-field 
      border: 1px solid lightgray;
      white-space: pre;
      overflow: hidden;
    
    .ui-selecting 
      background-color: lightskyblue;
      color: white;
    
    .ui-selected 
      background-color: lightskyblue;
      border-color: darkblue;
      color: white;
    
    .designer-label 
      white-space: pre;
      /*overflow: hidden;*/
    
    .designer-field,
    .designer-label 
      font-family: "Times New Roman";
      font-size: 10pt;
      z-index: 2;
    
    .designer-verticalline,
    .designer-horizontalline,
    .designer-rectangle,
    .designer-field,
    .designer-image,
    .designer-label 
      position: absolute;
    
  </style>
  <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
  <script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

  <script>
    function getpos(e) 
      return 
        X: e.pageX,
        Y: e.pageY
      ;
    

    function Rect(start, stop) 
      this.left = Math.min(start.X, stop.X);
      this.top = Math.min(start.Y, stop.Y);
      this.width = Math.abs(stop.X - start.X);
      this.height = Math.abs(stop.Y - start.Y);
    

    $(function() 
      var startpos;
      var selected = $([]),
        offset = 
          top: 0,
          left: 0
        ;
      $(".designer-verticalline, .designer-rectangle, .designer-field, .designer-image").resizable();

      // http://***.com/questions/705250/is-there-a-jquery-plugin-which-combines-draggable-and-selectable#8643716
      // teha: seal on ka mousedown mis andis viga, kaseda kasutada
      var $liigutatavad = $(".designer-verticalline, .designer-horizontalline, .designer-rectangle, .designer-field, .designer-image, .designer-label");
      $liigutatavad.draggable(
        start: function(event, ui) 
          var $this = $(this);

          if ($this.hasClass("ui-selected")) 
            // if this is selected, attach current offset
            // of each selected element to that element
            selected = $(".ui-selected").each(function() 
              var el = $(this);
              el.data("offset", el.offset());
            );
           else 
            // if this is not selected, clear current selection
            selected = $([]);
            $liigutatavad.removeClass("ui-selected");
          
          offset = $this.offset();
        ,

        drag: function(event, ui) 
          // drag all selected elements simultaneously
          var dt = ui.position.top - offset.top,
            dl = ui.position.left - offset.left;
          selected.not(this).each(function() 
            var $this = $(this);
            var elOffset = $this.data("offset");
            $this.css(
              top: elOffset.top + dt,
              left: elOffset.left + dl
            );
          );

          // this does not fix the issue:
          //$(".designer-verticalline, .designer-rectangle, .designer-field, .designer-image").resizable();
        
      );

      // ...but manually implement selection to prevent interference from draggable()
      $(".designer-panel-body").on("click", "div", function(e) 
        if ( /*!e.metaKey &&*/ !e.shiftKey && !e.ctrlKey) 
          // deselect other elements if meta/shift not held down
          $(".designer-panel-body").removeClass("ui-selected");
          $(this).addClass("ui-selected");
         else 
          if ($(this).hasClass("ui-selected")) 
            $(this).removeClass("ui-selected");
           else 
            $(this).addClass("ui-selected");
          
        

        //var selectable = $("#container").data("selectable");
        //selectable.refresh();
        //$( ".designer-panel-body" ).data("selectable")._mouseStop(null);
      );

      $(".designer-panel-body").selectable();
    );
  </script>

</head>

<body>
  <div class='panel designer-panel'>
    <div class='panel-body designer-panel-body panel-warning' style='height:9.37cm'>

      <div class='designer-field' contenteditable='true' style='top:2.30cm;left:5.84cm;width:10.24cm;height:0.63cm;font-family:Arial;font-size:14pt;font-weight:bold;'>vnimi+&#39; &#39;+dok.tasudok</div>
      <div class='designer-field' contenteditable='true' style='top:2.30cm;left:16.37cm;width:2.68cm;height:0.61cm;font-size:14pt;'>DOK.kuupaev</div>
      <div class='rectangle' style='border-width: 1px;background-color:#FFFFFF;top:2.99cm;left:1.34cm;width:18.05cm;height:5.29cm'></div>
      <div class='designer-field' contenteditable='true' style='top:3.01cm;left:1.53cm;width:9.71cm;height:0.55cm;font-size:12pt;'>m.FIRMA</div>
      <div class='designer-field' contenteditable='true' style='top:3.01cm;left:12.13cm;width:3.13cm;height:0.53cm;font-size:12pt;'>ise.telefon</div>
      <div class='designer-field' contenteditable='true' style='top:3.01cm;left:17.11cm;width:1.89cm;height:0.55cm;font-size:12pt;text-align:right;'>ise.regnr</div>
      <div class='designer-label' contenteditable='true' style='top:3.04cm;left:11.39cm;text-align:right;font-size:12pt;'>Tel.</div>
      <div class='designer-label' contenteditable='true' style='top:3.04cm;left:15.71cm;font-size:12pt;'>Reg.Nr</div>
      <div class='designer-field' contenteditable='true' style='top:3.62cm;left:1.55cm;width:9.45cm;height:0.55cm;font-size:12pt;'>ise.tanav</div>
      <div class='designer-field' contenteditable='true' style='top:3.70cm;left:15.16cm;width:3.37cm;height:0.55cm;font-size:12pt;'>ise.vatpayno</div>
      <div class='designer-label' contenteditable='true' style='top:3.72cm;left:12.89cm;text-align:right;font-size:12pt;'>KMKR nr</div>
      <div class='designer-field' contenteditable='true' style='top:4.30cm;left:1.58cm;width:9.08cm;height:0.55cm;font-size:12pt;'>rtri(ise.postiindek)+&#39; &#39;+rtri(ise.piirkond)</div>
      <div class='designer-field' contenteditable='true' style='top:4.30cm;left:14.66cm;width:4.34cm;height:0.55cm;font-size:12pt;text-align:right;'>aarve(dok.arvekonto, &#39;konto.arveldusar&#39;)</div>
      <div class='designer-label' contenteditable='true' style='top:4.33cm;left:13.89cm;font-size:12pt;'>A/A</div>
      <div class='designer-horizontalline' style='border-width: 1px;top:4.96cm;left:1.34cm;width:18.03cm;height:0.00cm'></div>
      <div class='designer-field' contenteditable='true' style='top:5.04cm;left:17.13cm;width:1.89cm;height:0.55cm;font-size:12pt;text-align:right;'>klient.regnr</div>
      <div class='designer-field' contenteditable='true' style='top:5.06cm;left:4.18cm;width:12.71cm;height:0.55cm;font-size:12pt;'>klient.nimi</div>
      <div class='designer-label' contenteditable='true' style='top:5.06cm;left:15.74cm;font-size:12pt;'>Reg.Nr</div>
      <div class='designer-label' contenteditable='true' style='top:5.09cm;left:1.63cm;font-size:12pt;'>Maksja</div>
      <div class='designer-field' contenteditable='true' style='top:5.72cm;left:1.53cm;width:11.68cm;height:0.55cm;font-size:12pt;'>klient.tanav</div>
      <div class='designer-field' contenteditable='true' style='top:5.72cm;left:15.18cm;width:3.37cm;height:0.55cm;font-size:12pt;'>klient.vatpayno</div>
      <div class='designer-label' contenteditable='true' style='top:5.75cm;left:12.92cm;text-align:right;font-size:12pt;'>KMKR nr</div>
      <div class='designer-field' contenteditable='true' style='top:6.38cm;left:1.53cm;width:11.84cm;height:0.55cm;font-size:12pt;'>rtri(klient.postiindek)+&#39; &#39; +rtri(klient.piirkond)</div>
      <div class='designer-field' contenteditable='true' style='top:6.38cm;left:13.47cm;width:3.37cm;height:0.55cm;font-size:12pt;'>sql(&quot;sele transfld(&#39;nimetus&#39;, &#39;riik&#39;, rapopref()) from riik where kood=klient.riik2&quot;, &#39;&#39; )</div>
      <div class='designer-field' contenteditable='true' style='top:6.99cm;left:3.71cm;width:12.16cm;height:1.16cm;font-size:12pt;'>klient.aadress</div>
      <div class='designer-label' contenteditable='true' style='top:7.01cm;left:1.45cm;text-align:right;font-size:12pt;'>Postiaadress</div>
      <div class='designer-field' contenteditable='true' style='top:8.33cm;left:3.95cm;width:2.11cm;height:0.55cm;font-size:12pt;'>dok.tasukuup</div>
      <div class='designer-field' contenteditable='true' style='top:8.33cm;left:6.08cm;width:8.05cm;height:0.55cm;font-size:12pt;'>eval( &#39;maksetin.&#39; +left(rapopref()+&#39;tingimus&#39;,10))</div>
      <div class='designer-label' contenteditable='true' style='top:8.35cm;left:1.45cm;font-size:12pt;'>Makset&#228;htaeg</div>
      <div class='designer-field' contenteditable='true' style='top:8.91cm;left:1.45cm;width:13.66cm;height:0.45cm;'>iif(!empty(dok.saaja), IR(&quot;Saaja: &quot;)+sql(&#39;sele rtri(nimi)+&quot; &quot;+rtri(tanav)+&quot; &quot;+rtri(piirkond)+&quot; &quot;+rtri(postiindek) from klient where kood=dok.saaja&#39;,&#39;&#39;),&#39;&#39;)</div>
    </div>
    <div class='bg-warning'>
      <div class='panel-footer'><i class='glyphicon glyphicon-chevron-up'></i> GroupHeader 1: str(dokumnr)+str(koopia,2)</div>
    </div>
  </div>
</body>

</html>

【问题讨论】:

【参考方案1】:

问题在于可调整大小的图标也是可选择的,因此当您将它们包含在套索中时,它们会被选中,并且它们的 topleft 在您拖动时会发生变化。

Selectable 有一个filter option,允许指定哪些元素应该是可选的。通过将其设置为'.designer-field' 应该可以解决问题。

$(".designer-panel-body").selectable(
    filter: '.designer-field'
);

见:https://jsfiddle.net/kec4jgvf/1/

【讨论】:

以上是关于拖动后元素变得随机不可调整大小的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Grid UI - 可拖动和调整大小

如何调整克隆的 jQuery UI 元素的大小(图片)

Three.js 调整画布大小

调整从右侧固定位置的元素大小时出现问题

使用 CSS 变换缩放的 jQuery 拖动/调整大小

当显示窗格的实时调整大小时,它在拖动时很困难,并且窗格顶部在释放后被隐藏