Как вызвать foo только при нажатии кнопки "Фокусировка"
У меня есть директива, в которой я привязываю события focus
и click
к элементу:
app.directive('mydirective', function () {
return {
link: function ($scope, $element, $attrs) {
$element.bind('click focus', function (e) {
foo(e);
});
}
};
});
Я хочу называть foo
один раз, если focus
или click
или событие запущено, но при нажатии на элемент срабатывает событие focus
, а foo
вызывается 2 раза. как предотвратить вызов foo
в 2 раза?
Изменить:
Да. Я не очень хорошо сочетал наведение с щелчком и фокусом. Спасибо каждому телу
Ответы
Ответ 1
Вы можете отменить события, которые будут только запускать функцию для первого события
$element.bind('click focus', function(e) {
if ( !$(this).data('fired') ) foo(e);
$(this).data('fired', true);
setTimeout(function(self) {
$(self).data('fired', false);
}, 200, this);
});
FIDDLE
Ответ 2
Еще одна версия реализации функции debounce:
link: function($scope, $element, $attrs) {
var callOnce = (function() {
var timeout;
return function(e, callback) {
clearTimeout(timeout);
timeout = setTimeout(function() {
callback.call(self, e);
}.bind(this), 200);
};
})();
$element.bind('click focus mouseover', function(e) {
callOnce.call(this, e, foo);
});
}
Ответ 3
-
Я бы предложил использовать только событие фокуса, если вы хотите, чтобы foo()
вызывался при щелчке и фокусировке, потому что клик не срабатывает в одиночку, а также вызывает фокусировку элемента,
-
поскольку вы упомянули, что элемент не может быть введен, поэтому вы можете использовать событие click вместо фокуса
-
но в вашем случае, как вы говорите, его уволили 3 раза, возможно, щелчок дважды запускается, а фокус запускается один раз, когда фокус срабатывает дважды, и нажмите один раз, и в этом случае используйте e.preventDefault();
в своем клике и фокусе,
app.directive('mydirective', function () {
return {
link: function ($scope, $element, $attrs) {
$element.bind('click', function (e) {
e.preventDefault();
foo(e);
});
}
};
});
таким образом вы можете удостовериться, что повторный вызов такого же события не будет продолжаться дважды.
-
Или самый простой способ - проверить, введен ли элемент привязкой событие фокуса, иначе связать событие click
app.directive('mydirective', function () {
return {
link: function ($scope, $element, $attrs) {
if(element is input)
{
$element.bind('focus', function (e) {
e.preventDefault();
foo(e);
});
}
else
{
$element.bind('click', function (e) {
e.preventDefault();
foo(e);
});
}
}
};
});