這裏是我同時使用觸摸屏或鼠標事件X如何固定,Y通過包裹事件屏幕座標爲優良D3例如上述座標以更「通用」的x,y的對象。
(大概D3具有讀,找出類似的處理這兩種類型的事件的東西,但很多..)
//Get an class of {points: [{x, y},], type: event.type} clicked or touched
function getEventPoints(event)
{
var retval = {point: [], type: event.type};
//Get x,y of mouse point or touch event
if (event.type.startsWith("touch")) {
//Return x,y of one or more touches
//Note 'changedTouches' has missing iterators and can not be iterated with forEach
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches.item(i);
retval.point.push({ x: touch.clientX, y: touch.clientY })
}
}
else if (event.type.startsWith("mouse")) {
//Return x,y of mouse event
retval.point.push({ x: event.layerX, y: event.layerY })
}
return retval;
}
..這裏是我會怎麼用它在上面的例子D3存儲最初的抓點Y.並且適用於鼠標和觸摸。
檢查Fiddle
在這裏,我是如何解決這個問題,使用D3和想要拖動移動或觸摸屏的文檔。不知何故,d3事件訂閱的所有圖表區域事件已經被阻止冒泡DOM。
無法弄清楚,如果D3可以被配置成自動傳遞畫布事件,不接觸他們。所以在一次抗議中,我剛剛取消了d3,因爲除了訂閱活動之外,它並沒有太多涉及。
並非是一個Javascript高手,這是一些有趣的代碼,訂閱事件的老路上。爲了防止拖動屏幕上的圖表觸摸,只有當一個圖表點grabed每個處理程序只需要迴歸真和event.preventDefault()被稱爲該事件保持你的自我。
//ChartJs event handler attaching events to chart canvas
const chartEventHandler = {
//Call init with a ChartJs Chart instance to apply mouse and touch events to its canvas.
init(chartInstance) {
//Event handler for event types subscribed
var evtHandler =
function myeventHandler(evt) {
var cancel = false;
switch (evt.type) {
case "mousedown":
case "touchstart":
cancel = beginDrag(evt);
break;
case "mousemove":
case "touchmove":
cancel = duringDrag(evt);
break;
case "mouseup":
case "touchend":
cancel = endDrag(evt);
break;
default:
//handleDefault(evt);
}
if (cancel) {
//Prevent the event e from bubbling up the DOM
if (evt.cancelable) {
if (evt.preventDefault) {
evt.preventDefault();
}
if (evt.cancelBubble != null) {
evt.cancelBubble = true;
}
}
}
};
//Events to subscribe to
var events = ['mousedown', 'touchstart', 'mousemove', 'touchmove', 'mouseup', 'touchend'];
//Subscribe events
events.forEach(function (evtName) {
chartInstance.canvas.addEventListener(evtName, evtHandler);
});
}
};
處理機上述啓動這樣與現有chart.js之對象:
chartEventHandler.init(chartAcTune);
的beginDrag(EVT),duringDrag(EVT)和endDrag(EVT)具有與上面d3例子相同的基本功能。當想要使用該事件並且不將它放在文檔平移和類似的位置時,只返回true。
使用觸摸屏在此嘗試Fiddle。除非您接近選擇圖表點,否則圖表的其餘部分對觸摸/鼠標事件是透明的,並允許平移頁面。
y方向上存在初始小抓取偏移錯誤,並受瀏覽器窗口滾動位置的影響。 – flodis
解決方案。如果我使用:_chartInstance.scales [scale] .getValueForPixel(** e.layerY **)_,則Y座標將補償圖表滾動位置。 – flodis
以下是我對第二個「舊」數據系列拒絕編輯和新值在整數步驟0..100中更改的圖表的貢獻。小提琴在這裏:[小提琴](https://jsfiddle.net/flodis/3btgtptb/) – flodis