триггерное действие jQuery с фокусом или щелчком, но не обоими

У меня есть этот пример кода:

$myTrigger
    .click(function(e){
         alert('click');
    })
    .focus(function(e){
         alert('focus');
         $(this).click()
    })

Намерение состоит в том, что я хочу, чтобы что-то произошло, когда Вы нажимаете на $myTrigger. Если с другой стороны, Вы снабжаете вкладками на него через клавиатуру (т.е., фокус), я хочу ту же самую вещь произойти, таким образом, я прошу, чтобы это нажало.

Выгода - то, если я нажимаю на нее, она также фокусируется. Таким образом, оба предупреждения уходят.

Существует ли способ препятствовать тому, чтобы событие фокуса ушло при нажатии?

ОБНОВЛЕНИЕ:

Комментарий Ajm получил меня думающий, что я, возможно, спрашиваю неправильную вещь.

Вопрос: событие щелчка всегда также инициировало фокус в JavaScript (и/или в jQuery?). Я могу принять каждый раз, когда я хочу обработать и нажимающий мышью и снабжающий вкладками - в с клавиатурой, фокус (), событие обработает обоих?

Или действительно ли это зависит от конкретного элемента, к которому я присоединяю события? (В этом случае $myObject, оказывается, тег привязки (ссылка).

10
задан eMBee 1 November 2016 в 08:18
поделиться

4 ответа

jQuery имеет для этого встроенную функцию, которая не используется так часто, как .one ()

$mytrigger.one('click focus', function() { alert("event"); });

Это сработает только один раз, или вы можете повторно привязать, если хотите впоследствии.

13
ответ дан 3 December 2019 в 19:32
поделиться

Чтобы предотвратить двойной вызов фокуса, установите переменную, чтобы определить, есть ли у элемента фокус.

var hasFocus = false;
$('#myTrigger').focusIn(
   function(){
      hasFocus = true;
      //do stuff
   }
);

$('#myTrigger').focusOut(
   function(){
      hasFocus = false;
   }
);

Переведите все функции в фокус и сообщите jQuery, чтобы он устанавливал фокус на элементе при щелчке по нему, если вы запускаете браузер, который этого не делает.

$(#myTrigger).click( function(){ if(!hasFocus){$(#myTrigger).focus()}});
0
ответ дан 3 December 2019 в 19:32
поделиться

Некоторое время назад я столкнулся с похожей проблемой. Я решил это , отвечая на первое событие и игнорируя события в течение следующих 20 мс.

Попробуйте что-то вроде этого:

$(document).ready(OnReady);

var okToClick = true;

function OnReady() {
    //Attach to both click and focus events
    $("#item").click(PerformAction).focus(PerformAction);
}

function PerformAction() {
    if (okToClick) {
        okToClick = false;

        // Do something interesting here...

        setTimeout(function() { okToClick = true; }, 20);
    }
}
0
ответ дан 3 December 2019 в 19:32
поделиться

Вы можете использовать только метод focus () и прочитать эту статью о типах событий (e) в JavaScript: http : //www.quirksmode.org/js/events_properties.html

Чтобы определить, какое событие произошло с вашей мышью или клавиатурой (чтобы проверить это), вы можете использовать:

if (!e) var e = window.event;
alert(e.type);
0
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: