D3鼠标事件 - Click& DragEnd

时间:2013-09-29 07:01:47

标签: javascript javascript-events svg d3.js

在D3中,如果您定义了这样的拖动功能:

var drag = d3.behavior.drag()
        .on("drag", function () {alert("drag")})
        .on("dragend", function () {alert("dragEnd")});

你真的不能做到以下几点:

d3.select("#text1")
.on("click", function(d,i) {alert("clicked")})
.call(drag);

原因是点击将在“dragend”触发后被触发。在我看来,应该有一个单独的点击事件,因为我看到dragend和click之间存在巨大差异。

要区分SVG元素中拖动事件的单击和结束,解决方案是什么?

2 个答案:

答案 0 :(得分:48)

The documentation有一些明确的例子:

  

在可拖动元素上注册您自己的单击侦听器时,您可以检查单击事件是否被抑制,如下所示:

selection.on("click", function() {
  if (d3.event.defaultPrevented) return; // click suppressed
  console.log("clicked!");
});

这与之后的stopPropagation()示例一起,允许您控制触发和处理哪些事件。

要明确,区分拖拽结束和点击事件完全取决于您。最简单的方法是在拖动时设置一个标志,并使用该标志来确定是否应该处理dragendclick事件。

答案 1 :(得分:0)

自4.9.0以来,您可以控制.clickDistance(),在距离开始拖动的距离之后,您将无法获得package com.custardpine.v_guide.movie; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.widget.ListView; import android.widget.Toast; import com.custardpine.v_guide.bus.Connector; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; public class DownloaderMovies extends AsyncTask<Void,Void,String> { Context c; String url; ListView lv; ProgressDialog pd; public DownloaderMovies(Trending c, String url, ListView lv) { this.c = c; <--Error Occuring Here--> this.url = url; this.lv = lv; } @Override protected void onPreExecute() { super.onPreExecute(); pd = new ProgressDialog(c); pd.setTitle("Downloading.."); pd.setMessage("Please wait....."); pd.show(); } @Override protected String doInBackground(Void... voids) { return downloadData(); } @Override protected void onPostExecute(String jsonData) { super.onPostExecute(jsonData); pd.dismiss(); if (jsonData==null){ Toast.makeText(c,"Failed to Download",Toast.LENGTH_SHORT).show(); }else { ParseMovies p= new ParseMovies(c,jsonData,lv); p.execute(); } } private String downloadData() { HttpURLConnection con = Connector.connect(url); if (con == null) { return null; } try{ InputStream is = new BufferedInputStream(con.getInputStream()); BufferedReader br= new BufferedReader(new InputStreamReader(is)); String line; StringBuffer jsonData= new StringBuffer(); while ((line=br.readLine())!=null) { jsonData.append(line+"n"); } br.close(); is.close(); return jsonData.toString(); } catch (IOException e) { e.printStackTrace(); } return null; } } 事件。

请注意,如果在释放按钮之前从DOM中删除元素,则可能会获得任何click事件(例如,在click处理程序中使用.raise())。< / p>