Скажем, у меня определен обработчик кликов:
$("#foo").click(function(e){
});
Как я могу в обработчике функции определить, было ли событие запущено программно или пользователем?
Скажем, у меня определен обработчик кликов:
$("#foo").click(function(e){
});
Как я могу в обработчике функции определить, было ли событие запущено программно или пользователем?
$x.click()или $x.trigger('click').
Ответы:
Вы можете взглянуть на объект события 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/
originalEvent? Это правильно? Есть где-нибудь координаты? Согласованы ли координаты? Координаты внутри #foo? ...
Вы можете использовать дополнительный параметр, как указано в руководстве по триггеру jQuery :
$("#foo").click(function(e, from){
if (from == null)
from = 'User';
// rest of your code
});
$('#foo').trigger('click', ['Trigger']);
$x.click(), тем .click()абонент должен явно сказать, что они притворяются. Это может быть или не быть проблемой в зависимости от того, что задумал Кевин Овоки.
$x.click()обработчиком событий (для пользовательского щелчка, который может быть «нормальным»)
Уже есть ответ на другой вопрос.
Как определить, является ли click () щелчком мыши или запускается каким-либо кодом?
Используйте whichсвойство объекта события. Это должно быть undefinedдля событий, запускаемых кодом
$("#someElem").click(function(e) {
if (e.which) {
// Actually clicked
} else {
// Triggered by code
}
});
Пример JsFiddle - http://jsfiddle.net/interdream/frw8j/
Надеюсь, это поможет!
select, дали бы e.which==undefinedдаже за настоящее событие.
Я испробовал все вышеперечисленные решения, в моем случае ничего не помогло. Ниже решение сработало для меня. Надеюсь, это поможет и вам.
$(document).ready(function(){
//calling click event programmatically
$("#chk1").trigger("click");
});
$(document).on('click','input[type=checkbox]',function(e) {
if(e.originalEvent.isTrusted==true){
alert("human click");
}
else{
alert("programmatically click");
}
});
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js">
</script>
<input type="checkbox" id="chk1" name="chk1" >Chk1</input>
<input type="checkbox" id="chk2" name="chk2" >Chk2</input>
<input type="checkbox" id="chk3" name="chk3" >Chk3</input>
DOM Level 3 определяет event.isTrusted. В настоящее время это поддерживается только в IE9 + и Firefox (на основе моих тестов. Я также читал (хотя и не изучал полностью), что его можно переопределить в некоторых браузерах, и, вероятно, он еще не на 100% готов к тому, чтобы действительно доверять (к сожалению).
Это модифицированная версия скрипки @ mu, которая работает в IE и Firefox.
isTrustedподдерживается ли он, а не записывается ли. Я думаю, что настоящий ответ зависит от того, почему стоит этот вопрос, и мы так и не узнали почему.
Не собираюсь участвовать в интеллектуальной дискуссии, код , который работал для меня фильтр .click()и .trigger('click')IS -
$(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
}
});