2017-10-04 27 views
1

我有一个包含Highcharter图的Shiny应用程序。该图是分散的,并且具有可拖动和可点击的点。与拖动相关的操作在理论上应与与点击相关的操作相互排斥。相互独特的拖放图事件

但是,在实践中,点击动作有时会在点拖动时触发。单击(没有拖动)和拖动(这应该排除鼠标按钮的释放和拖动操作完成之前的点击能力)需要在此应用程序中相互排斥。我的完整代码根据事件的类型将不同的JavaScript操作传递回Shiny服务器。两起事件共同造成麻烦。

我怀疑该解决方案涉及到添加与每个事件相关的其他JavaScript操作。虽然我的JavaScript技术还不够强大,无法知道这些调整可能会是什么。谷歌搜索这个问题的几个不同的变种没有变成任何可能的解决方案。我发现最接近的讨论是在Highcharts上下文中,here,但解决方案与主Highchart/draggable-events JS文件有关。

对此提出建议?

对于玩具的例子,你可以看到这种行为在行动:

rm(list=ls()) 
library(highcharter) 
library(shiny) 


ui <- fluidPage(
    highchartOutput("hcontainer") 
) 


# MUTUAL EXCLUSIVITY: 
# if you drag in the plot, you should either drag (and get no alert) OR 
# get an alert (and the point shouldn't/won't move), but never both. 

server <- function(input, output, session) { 
    output$hcontainer <- renderHighchart({ 
     hc <- highchart() %>% 
      hc_chart(animation = FALSE) %>% 
      hc_title(text = "draggable points demo") %>% 
      hc_plotOptions(
       series = list(
        point = list(
         events = list(
          drop = JS("function(){ /* # do nothing, for demo */ 
             }" 
          ), 
          click = JS("function(){ 
           alert('You clicked') /* # give alert, for demo */ 
           }" 
          ) 
         ) 
        ), 
        stickyTracking = FALSE 
       ), 
       column = list(
        stacking = "normal" 
       ), 
       line = list(
        cursor = "ns-resize" 
       ) 
      ) %>% 
      hc_tooltip(yDecimals = 2) %>% 
      hc_add_series(
       type = "scatter", 
       data = stars, 
       draggableY = TRUE, 
       draggableX = TRUE, 
       hcaes(x = absmag, y=radiussun) 
      ) 
     hc 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

我无法重现纯JS这个问题:在拖动事件之后http://jsfiddle.net/kkulig/z5y4b67e/你能提供一些这方面的工作现场演示 问题? –

+0

得到它复制:[http://jsfiddle.net/m5wnnnm5/1/](http://jsfiddle.net/m5wnnnm5/1/)。拖动该点时,请在释放鼠标之前暂停一下。它似乎与散点有关,并且具有可拖动的点。 另外,在最初的文章中修复了R-Shiny代码。它现在将运行,并且问题仍然存在。 – SMzgr356

回答

0

这个例子可以帮助你:http://jsfiddle.net/kkulig/th37vnv5/

我在烧制而成的点击动作阻止了核心功能添加了一个标志

var dragHappened; 

(function(H) { 
    var addEvent = H.addEvent; 

    H.Pointer.prototype.setDOMEvents = function() { 

    var pointer = this, 
     container = pointer.chart.container, 
     ownerDoc = container.ownerDocument; 

    container.onmousedown = function(e) { 
     dragHappened = false; 
     pointer.onContainerMouseDown(e); 
    }; 
    container.onmousemove = function(e) { 
     pointer.onContainerMouseMove(e); 
    }; 
    container.onclick = function(e) { 
     if (!dragHappened) { 
     pointer.onContainerClick(e); 
     } 
    }; 

    (...) 
    }; // setDOMEvents 

})(Highcharts); 

(...) 
    plotOptions: { 
    series: { 
     point: { 
     events: { 
      drag: function() { 
      console.log('drag'); 
      dragHappened = true; 
      }, 
      click: function() { 
      console.log('click'); 
      } 
     } 
     } 
    } 
    }, 
+0

因为我使用'highcharter',所以我必须弄清楚如何将JSFiddle的核心代码修改加载到R.有一些写在[[eg]]上(https://stackoverflow.com/questions/47998499 /如何做 - 修改 - highcharter-htmlwidget代码)。我试图快速实施解决方案,但它不是一个简单的剪切和粘贴修复。一旦我弄清楚如何让核心JS代码修改和'highcharter'发挥出色,我会将其标记为已回答。 – SMzgr356

+0

获取修改后的JS代码以加载而不会出现错误,因为修改后的文件在Web Inspector窗口中可见并且注册为GET成功。 Shiny应用中的“highcharter”图也呈现。但是,拖动之后,点击操作仍然会触发。将在接下来的几天/几周内排除更多故障。 – SMzgr356