在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元素中拖动事件的单击和结束,解决方案是什么?
答案 0 :(得分:48)
The documentation有一些明确的例子:
在可拖动元素上注册您自己的单击侦听器时,您可以检查单击事件是否被抑制,如下所示:
selection.on("click", function() {
if (d3.event.defaultPrevented) return; // click suppressed
console.log("clicked!");
});
这与之后的stopPropagation()
示例一起,允许您控制触发和处理哪些事件。
要明确,区分拖拽结束和点击事件完全取决于您。最简单的方法是在拖动时设置一个标志,并使用该标志来确定是否应该处理dragend
或click
事件。
答案 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>