В jQuery, как я могу сказать между программным и пользовательским щелчком?

Скажите, что у меня установлен обработчик кликов:

$("#foo").click(function(e){

});

Как я могу в рамках обработчика функции указать, было ли событие запущено программно или пользователем?

Ответ 1

Вы можете посмотреть объект события e. Если событие было вызвано реальным нажатием, у вас будут такие вещи, как clientX, clientY, pageX, pageY и т.д. Внутри e, и они будут числами; эти числа связаны с положением мыши при нажатии кнопки, но они, вероятно, будут присутствовать, даже если клик был инициирован с клавиатуры. Если событие было вызвано $x.click(), тогда у вас не будет обычных значений позиции в e. Вы также можете посмотреть свойство originalEvent, которого не должно быть, если событие произошло от $x.click().

Возможно, что-то вроде этого:

$("#foo").click(function(e){
    if(e.hasOwnProperty('originalEvent'))
        // Probably a real click.
    else
        // Probably a fake click.
});

И вот небольшая песочница для игры: http://jsfiddle.net/UtzND/

Ответ 2

Вы можете использовать дополнительный параметр, как указано в jQuery trigger manual:

$("#foo").click(function(e, from){
    if (from == null)
        from = 'User';
    // rest of your code
});

$('#foo').trigger('click', ['Trigger']);

Ответ 3

Уже есть еще один вопрос.

Как определить, является ли щелчок() щелчком мыши или вызван каким-то кодом?

Используйте свойство which объекта события. Это должно быть undefined для событий, вызванных кодом

$("#someElem").click(function(e) {
    if (e.which) {
        // Actually clicked
    } else {
        // Triggered by code
    }
});

Пример JsFiddle - http://jsfiddle.net/interdream/frw8j/

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

Ответ 4

DOM Уровень 3 указывает event.isTrusted. Это поддерживается только в IE9 + и Firefox (на основе моих тестов. Я также читал (хотя и не тщательно изучил), что он может быть переопределен в некоторых браузерах и, вероятно, еще не на 100% готов к тому, чтобы на самом деле быть доверенным (к сожалению).

Это - модифицированная версия @mu скрипта, которая работает в IE и Firefox.

Ответ 5

Не собираюсь участвовать в интеллектуальном обсуждении, код, который работал у меня для фильтрации .click() и .trigger('click'), -

$(document).on('click touchstart', '#my_target', function(e) {
    if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click')
        //Then code goes here
    }
});