HighStocks可拖动元素干扰栅格拖动



我使用HighStocks和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>

My Javascript for gridster:

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

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

例如使用以下代码(JSFiddle示例):
$('#container').mousedown(function() {
    gridster.disable();
});
$(document).mouseup(function(){
    gridster.enable();
}); 

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

看到.highcharts-navigator如何不能很好地工作作为一个选择器(也没有任何数量的选择器在该地区),我发现这可能是一个更简单的方法,只禁用导航器的网格(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();
});