2016-06-20 4 views
2

У меня есть событие jQuery change, когда пользователь меняет данный элемент SELECT. Однако событие может также инициироваться сторонним скриптом. Я хочу, чтобы определить, было ли событие запущено программно или пользователем.jQuery - обнаружение события изменения запускается программно

Я попытался общепринятым решением в этом вопросе Check if event is triggered by a human Но обратите внимание на JSFiddle в этом ответ на click событие, а не change события.

Для демонстрации я внес изменения в скрипку и создал этот один: http://jsfiddle.net/Uf8Wv/231/

Если вы попробуете это в последней Firefox или Chrome, вы увидите, что предупреждение human показывается, даже если событие было вызвано программно.

Я пробовал event.originalEvent.isTrusted, но это не работает во всех браузерах. Может ли кто-нибудь помочь?

ответ

0

Я добавил события mouseenter и mouseleave. Идея состоит в том, что это человек, если щелчок совпал с указателем мыши над элементом. См: http://jsfiddle.net/Uf8Wv/232/

$("#try").mouseenter(function(event) { 
    mouseover = true; 
}); 
// ... etc. 

Я не могу думать о каком-либо другом способе.

0

Вы можете легко определить, действительно ли событие click на кнопке запускается щелчком мыши или нет. Поступая,

$('#click').click(function(ev) { 
    if (ev.which !== undefined && ev.button !== undefined) { 
     $("#try").click(); 
    } 
}); 

Вот Fiddle

Примечание: Остерегайтесь либо ev.which или ev.button может привести к 0 на каком-то браузере для левой кнопкой мыши.

0

Вы можете проверить, если event.srcElement (который является исходным элементом, на котором срабатывает событие) равно event.currentTarget что-то вроде:

$("#try").change(function(event) {console.log(event,event.target,event.currentTarget,event.srcElement) 
    if (event.currentTarget=== event.srcElement) { 
     alert(' human') 
    } else { 
     alert(' not human'); 
    } 
}); 

Fiddle: http://jsfiddle.net/Uf8Wv/234/

0

Вы можете найти какое-то смутное различие между щелчок и эмулирование с помощью этого кода:

$(document).on('change', "#try", function (event) { 
    //some difference appear in the next line 
    console.log(event.delegateTarget.activeElement); 
    //no difference 
    if (event.originalEvent === undefined) { 
     alert('not human') 
    } else { 
     alert(' human'); 
    } 
    event.delegateTarget = null;//doesn't help 

}); 

$('#click').click(function (event) { 
    $("#try").click(); 
}); 

Нажмите на флажок журналы <input id="try" type="checkbox">.
Нажмите на кнопку logs <button id="click">.
Но ...
Запустите $("#try").click(); с консоли перед любыми записями журналов <body> и после нажатия на клик последнего клика.
Как правило, JS всегда может подделывать любое клиентское событие. Так что isTrusted никогда не доверяют.

0

Вы также можете прослушать событие и изменить переменную.Событие похоже действительно похоже на то, что это настоящий клик или щелчок по сценарию, но нажмите на #try Событие не будет одинаковым. А так как щелчок запускается до изменение, у вас есть время, чтобы установить переключатель. Как это, например:

var realClick; 
$("#try").change(function(event) { 
    console.log('change') 
    if (!realClick) { 
    alert('not human') 
    } else { 
    alert(' human'); 
    } 

});

$("#try").click(function(event) { 
    console.log('click') 
    // originalEvent is one way, but there will be many differences 
    if (event.originalEvent) { 
    realClick = true; 
    } else { 
    realClick = false; 
    } 
}); 

// Since this is called from outside, better not put 
// any controls here. 
$('#click').click(function(event) { 
    $("#try").click(); 
}); 

http://jsfiddle.net/2xjjmo09/3/

Смежные вопросы