javascriptjqueryevent-handlingjquery-eventsflot

Flot event for range updates in response to panning/zooming


For Flot, is there an event that fires after the user has completed panning or zooming using the mouse scroll wheel (after the range.xaxis.to/from and range.yaxis.to/from have settled)? I am trying to use the line below to update the selection on an overview plot after the user has panned or zoomed in the main plot, but am finding that either the update to the overview plot happens after panning or zooming(not both).

$("#plot").bind("mouseup scroll",updateOverviewSelection);

Edit: http://jsfiddle.net/apandit/nu2rr58h/9/

In the jsfiddle, I am unable to pan in the main plot and the cursor does not seem to change back to normal. The user can click and drag in the overview plot to make a selection, which leads to zooming in the main plot. I would also like to be able to allow the user to pan and zoom in the main plot and have the selection box in the overview plot updated; I am attempting to do this by binding the updateOverviewSelection method to the plot div for the scroll and mouseup events. Is there an event in Flot that fires every time the x- and y-axis limits are updated?


Solution

  • The solution to this issue is below. The issue was that setting the overview plot's selection(overview.setSelection(ranges);) was triggering the zoom method because it was bound to the plotselected event in the overview plot. At the end of the zoom method, the main plot was plotted, which was again calling the overview.setSelection(ranges); line in the updateOverviewSelection method. To prevent this ping-pong between the two methods/events, I added an updatingOverviewSelection flag.

    http://jsfiddle.net/apandit/nu2rr58h/12/

    var datasets = [[
                        [0,0],[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9]
                    ],
                    [
                        [0,0],[-1,-1],[-2,-2],[-3,-3],[-4,-4],[-5,-5],[-6,-6],[-7,-7],[-8,-8],[-9,-9]
                    ]];
    
    var plot = $.plot("#plot",datasets,{
            pan: {
              interactive: true
            },
            zoom: {
              interactive: true,
              mode: "x"
            }
        });
    
    var overview = $.plot("#overview",datasets,{
        selection: {
            mode: "xy"
        }
    });
    
    var updatingOverviewSelection = false;
    
    $("#plot").bind("plotpan plotzoom",updateOverviewSelection);
    $("#overview").bind("plotselected", zoom);
    
    function zoom(event,ranges) {
        if(updatingOverviewSelection) {
            updatingOverviewSelection = false;
        }
        else {
            var options = plot.getOptions();
    
            options.xaxes[0].min = ranges.xaxis.from;
            options.xaxes[0].max = ranges.xaxis.to;
            options.yaxes[0].min = ranges.yaxis.from;
            options.yaxes[0].max = ranges.yaxis.to;         
    
            plot = $.plot("#plot",datasets,options);
        }
    };
    
    // get the window x-axis and y-axis ranges for the main plot
    // and set the selection in the overview plot to those ranges
    function updateOverviewSelection(event) {
            var options = plot.getOptions();
    
            var ranges = {
                xaxis: {
                    from: options.xaxes[0].min,
                    to: options.xaxes[0].max
                },
                yaxis: {
                    from: options.yaxes[0].min,
                    to: options.yaxes[0].max
                }
            };
    
            updatingOverviewSelection = true;
            overview.setSelection(ranges);
    };