Событие jqplotClick в серии jqPlot (устройства iOS, браузер Safari)

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

У меня есть barchart, обработанный 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 все делается отлично, за исключением того, что указанное действие click, указанное выше, ведет себя странно.

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

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

Любые идеи?

Ответ 1

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

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

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

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

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

код:

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

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

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

Ответ 2

Я не знаю о jqplot, но, как правило, там происходит гораздо больше событий mousedown и click на сенсорных устройствах. Там больше шансов "потерять" клик перед тем, как событие click в конечном итоге срабатывает. mousedown, или в вашем случае "jqplotMouseDown", может быть лучше для вас.

Ответ 3

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

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