2016-10-20 2 views
0

Попытка получить ввод для фокусировки, когда родительский контейнер имеет класс open.Ввод не будет фокусироваться при открытии элемента

код, который я до сих пор:

$("#search-trigger").click(function(){ 
$("input").focus(); 
}); 

Который, работает только странно, когда элемент начинает закрываться. Таким образом, я сменил его на:

$("#search-trigger").click(function(){ 
    if(("#target-2").hasClass("open")){ 
    $("input").focus(); 
    }else{ 
    $("input").blur();} 
}); 

Что не работает вообще. Есть идеи?

Codepen here

+1

Пожалуйста, включите весь код, необходимый для репликации проблемы в самом вопросе (а не только codepen, скрипка и т.д.).Лучше по-прежнему использовать функцию фрагментов, нажмите кнопку <> в редакторе, чтобы добавить код, например код –

ответ

3

Я думаю, что основная проблема здесь в том, что вход не был выполнен анимацией, поэтому jQuery не мог сфокусироваться на нем. Разрешение будет состоять в том, чтобы использовать событие TweenMax onComplete, чтобы сфокусироваться на элементе после показа цели.

Обратите внимание, что ваш оригинальный вопрос не содержит код анимации, поэтому другие на этом сайте не смогли бы помочь, если бы они не захотели просмотреть ваш CodePen.

Вот новый JavaScript я сделал, хотя вы можете просто изменить исходный код, чтобы использовать функцию onComplete вместо:

$('.trigger').click(function(e) { 
    //remove active class from other triggers 
    $('.trigger').not(this).removeClass('active'); 
    //toggle active class on this trigger 
    $(this).toggleClass('active'); 
    //get target element 
    var target = $('#' + $(this).attr('data-target-id')); 
    //hide all elements of target class, except the current target 
    if($('.target.open').not(target).size() > 0) { 
    TweenMax.to($('.target.open').not(target), .2, {display:'none', y:'0%', autoAlpha:0}); 
    //remove open class from target elements that are now hidden 
    $('.target.open').not(target).removeClass('open'); 
    } 
    //if this element is now active 
    if($(this).hasClass('active')) { 
    //show current target element 
    TweenMax.to(target, .2, {display:'block', y:'100%', autoAlpha:1, onComplete:function() { 
     //once animation is complete, if the target has an input, focus on that input 
     if(target.find('input').size() > 0) { 
     target.find('input').focus(); 
     } 
    }}); 
    //indicate that this target class element is now open 
    target.addClass('open'); 
    } 
    //if the element is no longer active 
    else { 
    //hide the target 
    TweenMax.to(target, .2, {display:'none', y:'0%', autoAlpha:0}); 
    //remove open class from newly hidden target element 
    target.removeClass('open'); 
    } 
}); 

И вот CodePen обратно на тебя: http://codepen.io/anon/pen/qaLkYo

+0

Yeap, похоже, что это была проблема с проблемой onComplete :) Кажется, что этот код нарушает дизайн ... если вы снова нажмете триггер, он должен закройте целевой div, но в этом случае он не регистрирует событие. – Modermo

+0

Исправить - обновить ответ и ручку. –

+1

Обратный вызов гарантирует, что анимация будет выполнена до фокусировки. Я даже не проверял TeenMax, который я не знаю. Ваш ответ, очевидно, лучше, чем мой. И вы «очистили» код OP. Вы заслуживаете принятого ответа. ;) +1 –

0

Если у вас есть много входов на вашей странице, чем дать конкретный тот, который вы хотите сосредоточиться ID и называть его ID, как это:

$("input#my-input").focus(); 
+0

, почему не только идентификатор в селекторе? – bassxzero

+0

Просто ID * будет * достаточно - но я не думаю, что это ответит на вопрос. Если вы проверили ссылку OPP CodePen, вы увидите, что на странице есть только один вход, поэтому селектор элементов не является проблемой в этом случае. –

+0

Даже если вы ссылаетесь на идентификатор элемента, он все еще не работает – Modermo

1

I updated your CodePen.

У вас есть анимация ...
Я не проверял, как это достигается, поскольку внешняя библиотека (TweenMax) делает это.

Но, увидев анимацию, я подумал о задержка.
И это мой ответ.

Вы не можете focus элемент, который имеет display, установленный на none.
Этот дисплей выставиться в block или inline-block вашей анимации где-то ...

Я обнаружил, что 10ms задержка в этом от чего прийти случае.
И только для того, чтобы убедиться, что мы выбрали правильный input, потому что даже если в этом примере есть только один ... У вашего сайта будет больше наверняка.

Я указал, что это дети детей, принадлежащих одному из братьев и сестер. элемента с щелчком.

Вот соответствующий код:

// This is the code for the input focus 
$("#search-trigger").click(function(){ 
    var searchInput = $(this).siblings().find("input"); 
    setTimeout(function(){ 
     searchInput.focus(); 
    },10); 
}); 
+0

Вот оно! Не знал, что вы не можете сфокусировать поле в скрытом контейнере. – Modermo

+0

Я по-прежнему предлагаю использовать функцию onComplete от TweenMax, поскольку она обеспечивает обратный вызов. setTimeout может технически заняться дольше, чем указанные 10 миллисекунд, чтобы нанести удар, и может потенциально (хотя и не так) позволить другому пользователю щелкнуть перед завершением действия. Больше о том, почему задержки setTimeout могут занимать больше времени, чем предполагалось: https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout#Reasons_for_delays_longer_than_specified –

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