2015-03-19 3 views
1

Я создал расширения jquery, которые скрывают мои элементы выбора и вместо этого добавляет пользовательскую разметку. Это так, что я могу укладывать элементы и выполнять некоторые пользовательские behvaiour (например, добавление изображений к элементам)Как я могу поймать попытку сосредоточиться на скрытом объекте?

Это то, что разметка будет выглядеть в простом примере:

<select id="original" style="display:none"><option value="1">1</option><select> 
<ul id="new" class="select"> 
    <li>1</li> 
</ul> 

Я также использовать другой jquery-extension для проверки форм. Если поле недействительно, оно пытается сфокусировать это поле. Браузеры не позволят сосредоточиться на скрытых полях. Это проблема в основном потому, что если поле не сфокусировано, браузер не будет прокручиваться до места, где это недопустимое значение.

Моим решением для сновидений было бы добавить слушателя для попыток сфокусировать элемент select, но я не могу использовать обычный $('parent').on('focus', "#original ...), потому что события не запускаются на display:none -объектах. Я также считал, что скрывать элемент каким-то другим способом, но по крайней мере visbility: hidden также не позволит фокусироваться.

Как сфокусировать либо оригинал, либо новый элемент? Когда делается попытка сфокусировать исходный элемент?

+0

семантически (и логически), что невозможно сфокусировать то, что не видно. Возможно, вы должны попробовать совершенно другой подход, возможно, не прокручивать входные данные, а прокручивать до пункта/раздела. Или поставьте какой-то «if» перед * попыткой *, чтобы проверить видимость элементов. – DanFromGermany

+0

Уверен, и все в порядке, я мог бы сфокусировать #new, что видно. Но какое событие может вызвать этот фокус? – Himmators

+0

непрозрачность: 0 может помочь? но разница в том, что невидимые элементы против не отображаемых элементов занимают место на странице –

ответ

1

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

Я придумал обходным:

  1. Добавить вход закадровым и скрытый класс:
    HTML:<input id="I0">
    CSS:#I0, .hidden {position: absolute; left: -999px;}

  2. Включите этот вход в начале всех вызовов фокуса:
    $('#I0, #Name').focus();

  3. Добавьте этот код:

$('input, select').focus(function() { 
    if($(this).data('invisible')) { 
    //this will be run if the element is hidden 
    } 

    $('input, select').each(function() { 
    $(this).data('invisible', !$(this).is(':visible')); 
    if($(this).data('invisible')) { 
     $(this) 
     .show() 
     .addClass('hidden'); 
     (function(self) { 
     setTimeout(function() { 
      self 
      .hide() 
      .removeClass('hidden'); 
     },0); 
     })($(this)); 
    } 
    }); 

}); 

Working Fiddle

+0

Это отличное усилие! Я сделал вариацию. Я спрятал элемент, установив непрозрачность: 0, положение: абсолютное и добавив положение относительно элемента обертки. Это также спрятало элемент и заставило его заняться нулевым пространством. – Himmators

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