2017-10-04 8 views
1

ハイハターグラフを含む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/)。ポイントをドラッグすると、マウスを離す前にビートを一時停止します。これは散漫に関連するもので、またポイントx-draggableを持つように見えます。 また、最初の投稿に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にロードする方法を理解しなければなりません。そういうことで書かれているものもあります(https://stackoverflow.com/questions/47998499/how-to-modify-highcharter-htmlwidget-code)。私はこのソリューションをすばやく実装しようとしましたが、カットアンドペーストの簡単な修正ではありませんでした。コアのJSコードの修正方法と、ハイハターをうまく再生する方法を見つけたら、これを答えてみましょう。 – SMzgr356

+0

修正されたJSコードがエラーなしで読み込まれるようにしました。変更されたファイルはWebインスペクタウィンドウに表示され、正常に取得されたものとして登録されます。 Shinyアプリケーションの 'highcharter'グラフもレンダリングされます。ただし、クリック操作は引き続きドラッグ後に開始されます。来るべき数日/数週間でさらにトラブルシューティングを行います。 – SMzgr356

関連する問題