Событие jqplotClick в серии jqPlot (браузер Safari для устройств iOS) - PullRequest
14 голосов
/ 25 февраля 2011

У меня возникли некоторые проблемы при выполнении щелчков действий на элементах jqPlot, и я надеюсь, что кто-то еще сможет пролить свет на то, что идет не так.

У меня есть блок-схема, отображаемая с помощью jqPlot, который прикрепляет обработчик событий щелчка к (на диаграмме jqPlot), используя следующий код:

$.jqplot.eventListenerHooks.push(['jqplotClick', myClickHandler]);

myClickHandler выглядит так:

function myClickHandler(ev, gridpos, datapos, neighbor, plot) {
  alert('you have triggered click action');
}

Мое намерение состоит в том, чтобы с помощью этой простой реализации jqPlot действие оповещения было бы инициировано, когда будет произведен щелчок в области внутри диаграммы, включая элемент гистограммы. Это отлично работает в любых настольных браузерах (IE6 / 7/8/9, Chrome, Safari).

Однако проблема, с которой я сталкиваюсь, заключается в том, что при доступе к сайту с помощью iPhone / iPad все отображается идеально, за исключением того, что указанное выше действие по щелчку ведет себя странно.

Если я попытаюсь прикоснуться к какому-либо элементу гистограммы, он не предупреждает «вы вызвали действие щелчка» - , как будто ничего не происходит .

Однако, когда я пытался щелкнуть (коснуться) пустое место диаграммы, сообщение сработало нормально.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 17 декабря 2012
$.jqplot.eventListenerHooks.push(['jqplotClick', myClickHandler]);

Этот вызов прикрепит обработчик onClick ко всему холсту события. (Этот холст события соответствует размеру графика и должен работать над всеми остальными полотнами для работы - это означает, что вам может потребоваться вручную изменить его z-index, чтобы все заработало). Я думаю, что в вашем случае происходит следующее:

  1. Вы присоединяете метод myClickHandler к холсту события. Он будет запускаться каждый раз при щелчке по холсту события, независимо от того, где он находится - над серией или над фоном графика.

  2. В случае с рендером barchart этот холст события находится ниже холста серии (либо он создается до холста серии, либо имеет более низкий z-индекс). Решение состоит в том, чтобы вручную увеличить z-индекс холста события ПОСЛЕ создания. После этого он будет наверху и события кликов будут обрабатываться правильно.

  3. Помните, это событие щелчка будет срабатывать при каждом щелчке по графику, независимо от того, где. Решением было бы отфильтровать выполнение метода myClickHandler следующим образом:

Код:

function myClickHandler(ev, gridpos, datapos, neighbor, plot) {
    if (isClickEventOverTheSeries(gridpos)) {
        alert('you have triggered click action');
    }
}

В этом примере gridpos - это массив, который содержит 2 точки - координаты x и y события click. « isClickEventOverTheSeries » - это функция, которая проверяет, нарисованы ли по этим координатам серии. Я не уверен, как этого добиться с помощью рендера BarChart - я никогда не использовал его, но с помощью функции рендеринга есть метод, который проверяет это ...

Надеюсь, это поможет

0 голосов
/ 24 мая 2012

Вы должны быть в состоянии решить эту проблему, выполнив в точности то, что предлагает @PriorityMark, т.е. установив явно значение z-index для jqplot-event-canvas.

То, как это можно сделать, показано, например, в этом ответе , где проблема была аналогичной природы. Там после моих первоначальных изменений, то есть отправки jqplot-overlayCanvas-canvas за jqplot-series-canvas, я забыл поставить jqplot-event-canvas впереди.

0 голосов
/ 21 марта 2012

Я не знаю, как работает jqplot, но в целом между сенсорными устройствами происходит событие mousedown и click. Существует большая вероятность «потерять» щелчок до того, как само событие click в конечном итоге сработает. mousedown, или в вашем случае 'jqplotMouseDown`, может быть лучше для вас.

...