HighStocks可拖动元素干扰gridster拖动

时间:2014-07-25 17:10:25

标签: javascript jquery highcharts highstock gridster

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

在这个小提琴中并不那么明显,因为没有那么多元素,但你已经可以看到,当你拖动滑块时,整个小工具会有所改变。我该如何防止这种情况?

我的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>

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

1 个答案:

答案 0 :(得分:1)

一个通用的jQuery解决方案可能是检测图表容器上的mousedown以禁用gridster-dragging,并检测mouseup一般来启用gridster-dragging。

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

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

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

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

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

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