2

我正在使用 HighStocks 的股票图表和 gridster。gridster 中的每个单独的块都可以自由拖动。但是,股票时间滑块小工具也可以拖动和调整大小。由于它位于 gridster 小部件的顶部,因此每当我拖动滑块时,整个小部件也会移动。我包含了一个 JSFiddle 来证明我的观点。 http://jsfiddle.net/faPrd/

它在这个 Fiddle 中没有那么明显,因为没有那么多元素,但是您已经可以看到,当您拖动滑块时,整个小工具会发生一些变化。我怎样才能防止这种情况?

我的 HTML:

<script src="http://code.highcharts.com/stock/highstock.js"></script>
<script src="http://code.highcharts.com/stock/modules/exporting.js"></script>

<div class="gridster ready">
    <ul id = "gridlist" style="height: 550px; width: 550px; position: relative">
        <li id = "gridlist1" class="gs-w" data-row="1" data-col="1" data-sizex="3" data-sizey="3">
            <div id="container" style="height: 400px; min-width: 310px"></div>
        </li>
        <li id = "gridlist2" class="gs-w" data-row="1" data-col="4" data-sizex="3" data-sizey="3">
        </li>
    </ul>
</div>

我的gridster Javascript:

var gridster;
$(function(){
  gridster = $(".gridster ul").gridster({
    widget_base_dimensions: [150, 150],
    widget_margins: [5, 5],

    serialize_params: function($w, wgd) {
      return {
        x: wgd.col,
        y: wgd.row,
        width: wgd.size_x,
        height: wgd.size_y,
        id: $($w).attr('id')
      };
    },
    draggable: {
      stop: function(event, ui) {
        var positions = "[";
        for (var i = 0; i < this.serialize().length; i++) {
          positions += JSON.stringify(this.serialize()[i]);
          if (i !== this.serialize().length - 1) { 
            positions += ",";
          }
        }
        positions += "]";
        localStorage.setItem('positions', positions);
      }
    },
    helper: 'clone',
    resize: {
      enabled: true,
      stop: function(e, ui, $widget) {
        var positions = "[";
        for (var i = 0; i < this.serialize().length; i++) {
          positions += JSON.stringify(this.serialize()[i]);
          if (i !== this.serialize().length - 1) { 
            positions += ",";
          }
        }
        positions += "]";
        localStorage.setItem('positions', positions);
      }
    }
  }).data('gridster');
});
4

1 回答 1

1

一种通用的 jQuery 解决方案可能是mousedown在图表容器上检测以禁用网格拖动,并mouseup在一般情况下检测以启用网格拖动。

例如使用以下代码(JSFiddle 示例):

$('#container').mousedown(function() {
    gridster.disable();
});

$(document).mouseup(function(){
    gridster.enable();
}); 

这将要求您有一些区域不是图表容器的一部分,而是在网格中(否则您将无处可取 gridster-grid)。或者,您可以更具体地说明单击时应禁用网格拖动的元素。

看到.highcharts-navigator作为选择器的效果如何(并且该区域中的任何数量的选择器也没有),我发现这可能是只为导航器禁用 gridster 的更简单方法之一(JSFiddle 示例):

$('#container').mousedown(function(event) {
    var chart = $('#container').highcharts();
    var navTop = $('.highcharts-navigator').offset().top;
    var navHeight = chart.options.navigator.height + chart.options.scrollbar.height;

    if(event.pageY > navTop &&
            event.pageY < navTop + navHeight) {
        gridster.disable();
    }
});

$(document).mouseup(function(){
    gridster.enable();
}); 
于 2014-07-25T19:10:44.470 回答