У меня есть обработчик, прикрепленный к событию, и я хотел бы, чтобы он выполнялся только в том случае, если он запускается человеком, а не методом trigger (). Как отличить?
Например,
$('.checkbox').change(function(e){
if (e.isHuman())
{
alert ('human');
}
});
$('.checkbox').trigger('change'); //doesn't alert
javascript
jquery
Дзиамид
источник
источник
:)
event.isTrigger
originalEvent
когда событие запускаетсяDOM.click()
, но вы можете использовать$($("#try")[0]).click();
, что неуклюже, но работает.Более прямым, чем выше было бы:
$('.checkbox').change(function(e){ if (e.isTrigger) { alert ('not a human'); } }); $('.checkbox').trigger('change'); //doesn't alert
источник
isTrigger
на публичный API на данный момент .Я думаю, что единственный способ сделать это - передать дополнительный параметр при
trigger
вызове в соответствии с документацией .$('.checkbox').change(function(e, isTriggered){ if (!isTriggered) { alert ('human'); } }); $('.checkbox').trigger('change', [true]); //doesn't alert
Пример: http://jsfiddle.net/wG2KY/
источник
Принятый ответ у меня не сработал. Прошло 6 лет, и с тех пор jQuery сильно изменился.
Например,
event.originalEvent
всегда возвращаетсяtrue
с jQuery 1.9.x. Я имею в виду, что объект существует всегда, но содержание другое.Те, кто использует более новые версии jQuery, могут попробовать это. Работает в Chrome, Edge, IE, Opera, FF
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) { //Hey hooman it is you }
источник
В настоящее время большинство браузеров поддерживают event.isTrusted :
if (e.isTrusted) { /* The event is trusted: event was generated by a user action */ } else { /* The event is not trusted */ }
Из документов :
источник
Если у вас есть контроль над всем вашим кодом, никаких инопланетных вызовов,
$(input).focus()
кромеsetFocus()
.Для меня использование глобальной переменной - правильный способ.
var globalIsHuman = true; $('input').on('focus', function (){ if(globalIsHuman){ console.log('hello human, come and give me a hug'); }else{ console.log('alien, get away, i hate you..'); } globalIsHuman = true; }); // alien set focus function setFocus(){ globalIsHuman = false; $('input').focus(); } // human use mouse, finger, foot... whatever to touch the input
Если какой-то инопланетянин все же захочет позвонить
$(input).focus()
с другой планеты. Удачи или проверьте другие ответыисточник
setFocus()
- это не мешает людям запускать событие фокусировки. ЕслиsetFocus()
вообще не писать, то люди не смогут его назвать, поэтому я не вижу в этом пользы. На самом деле, люди все еще могли позвонить$('input').focus()
и пройти.(function(){/*your code here*/})();
Это защитит функцию setFocus от вызова, а логическое значение - от изменения внешними скриптами.Вы можете использовать onmousedown для обнаружения щелчка мыши и вызова trigger ().
источник
Я бы подумал о возможности, когда вы проверяете положение мыши, например:
источник