порядок табуляции для ссылок в простом модальном диалоговом окне

Я использую отличный диалоговый плагин jquery.simplemodal, чтобы показать список элементов. Эти элементы содержат гиперссылки. Все это отлично работает, за исключением того, что ссылки в модальном диалоговом окне не появляются как часть порядка табуляции. Я попытался установить tabindex явно, но по какой-то причине только элементы ввода находятся в порядке табуляции - если я просматриваю диалоговое окно, я просто просматриваю 3 элемента ввода и не нажимаю якоря.

Я делаю что-то не так с вызовом плагина simplemodal?

Пример находится по адресу http://dev.andrewbucknell.com/basic/demo1.html.

Код (с относительными путями) для демонстрации выглядит следующим образом

<!DOCTYPE html>  
<html>  
<head>  
<title> SimpleModal Basic Modal Dialog </title>  
<meta name='author' content='Eric Martin' />  
<meta name='copyright' content='2010 - Eric Martin' /> 
<!-- Page styles -->  
<link type='text/css' href='css/demo.css' rel='stylesheet' media='screen' /> 
<!-- Contact Form CSS files -->  
<link type='text/css' href='css/basic.css' rel='stylesheet' media='screen' /> 
<!-- IE6 "fix" for the close png image -->  
<!--[if lt IE 7]>  
<link type='text/css' href='css/basic_ie.css' rel='stylesheet' media='screen' />  
<![endif]--> 
<!-- JS files are loaded at the bottom of the page -->  
</head>  
<body>  
<div id='container'>  
        <div id='logo'>  
                <h1>Simple<span>Modal</span></h1>  
                <span class='title'>A Modal Dialog Framework Plugin for jQuery</span>  
        </div>  
        <div id='content'>  
                <div id='basic-modal'>  
                        <h3>Basic Modal Dialog</h3>  
                        <p>A basic modal dialog with minimal styling and no additional options. There 
are a few CSS properties set internally by SimpleModal, however, SimpleModal relies mostly 
on style options and/or external CSS for the look and feel.</p>
                        <input type='button' name='basic' value='Demo' class='basic'/> or <a 
href='#' class='basic'>Demo</a>
                </div>  
                <div id="funddialog">  
                        <div id="fundpickfilter">  
                                <div class="fundfilter">  
                                        <label style="font-weight: bold;" for="filtertext">Find: </label>  
                                        <input class="tfilter" type="text" id="filtertext" value=""/>  
                                </div>  
                                <div id="fundactions">  
                                                <button type="button" id="fundsearch" 
class="searchbutton">Search</button>
                                                <button type="button" id="fundreset" 
class="resetbutton">Reset</button>  
                                </div>  
                        </div>  
                        <div id="fundpicklist">  
                                <div class="fund"><a href="http://www.slashdot.org" >Item 
1</a></div>  
                                <div class="fund"><a href="http://www.arstechnica.com" >Item 
2</a></div>  
                                <div class="fund"><a href="http://www.techmeme.com" >Item 
3</a></div>  
                        </div>  
                </div>  
                <!-- modal content -->  
                <div id="basic-modal-content">  
                        <div id="funddialog">  
                                <div id="fundpickfilter">  
                                        <div class="fundfilter">  
                                                <label style="font-weight: bold;" for="filtertext">Find: </label>  
                                                <input class="tfilter" type="text" id="filtertext" value=""/>  
                                        </div>  
                                        <div id="fundactions">  
                                                        <button type="button" id="fundsearch" 
class="searchbutton">Search</button>
                                                        <button type="button" id="fundreset" 
class="resetbutton">Reset</button>
                                        </div>  
                                </div>  
                                <div id="fundpicklist">  
                                        <div class="fund"><a href="http://www.slashdot.org" >Item 
1</a></div>  
                                        <div class="fund"><a href="http://www.arstechnica.com" >Item 
2</a></div>  
                                        <div class="fund"><a href="http://www.techmeme.com" >Item 
3</a></div>  
                                </div>  
                        </div>  
                </div>  
        </div>  
</div>  
<!-- Load jQuery, SimpleModal and Basic JS files -->  
<script type='text/javascript' src='js/jquery.js'></script>  
<script type='text/javascript' src='js/jquery.simplemodal.js'></script>  
<script type='text/javascript' src='js/basic.js'></script>  
</body>  
</html> 

person Andrew Bucknell    schedule 17.11.2011    source источник


Ответы (3)


Я сам столкнулся с этой проблемой. Вот то, что я разработал до сих пор. Simplemodal должен добавить навигацию по вкладкам в функциях watchTab и focus, чтобы сохранить фокус внутри модального окна. Это достигается путем записи первого и последнего ввода, а когда вы перемещаетесь мимо них, фокусируясь на соответствующем другом. К сожалению, он смотрит только на входы, а не на ссылки. Это означает, что вы можете перейти только к ссылкам, расположенным между первым и последним элементами ввода. Вы можете перезаписать или изменить эти функции, чтобы получить желаемое поведение. Что-то вроде этого:

замените строку 473 на var input = $('#simplemodal-data :input:visible:enabled, #simplemodal-data a:visible')[p]();

замените строку 592 на s.inputs = $('#simplemodal-data :input:visible:enabled, #simplemodal-data a:visible');

Это упрощенное решение, которое, вероятно, сломается в случае браузера, который не переходит по ссылкам. Я постараюсь придумать что-нибудь получше.

person Jon Lewis    schedule 18.11.2011
comment
Это фантастический Джон - спасибо, что поделились. Я также рассмотрю более надежное решение и поделюсь им. Спасибо, что указали мне правильное направление. - person Andrew Bucknell; 19.11.2011
comment
быстрое продолжение - я применил предложенные вами изменения, и пока он отлично работает в ie7 ie8 ie9 chrome и firefox 7. Я изменил #simplemodal-data на .simplemodal-data для моего конкретного случая использования, и пока это выглядит хорошо. Еще раз спасибо, Джон. - person Andrew Bucknell; 20.11.2011

Я нашел решение с SimpleModal 1.4.2

На линии 609

Изменить это s.inputs = $(':input:enabled:visible:first, :input:enabled:visible:last', s.d.data[0]);

К этому s.inputs = $('a:visible, :input:enabled:visible', s.d.data[0]).filter(':first,:last');

person Jean-Francois Sanfacon    schedule 21.03.2012

s.d.data[0]s.d.data[0] также обратите внимание, что ни одна из существующих реализаций со следующим селектором:

s.inputs = $(':input:enabled:visible:first, :input:enabled:visible:last', s.d.data[0]);

ни ответ выше, правильно обрабатывайте tabindexes - переключение после последнего элемента будет выполнено первым элементом в dom, а не тем, у которого наименьшее tabindex (и наоборот), чтобы исправить это, вы должны сделать что-то вроде этого:

s.inputs = $.merge(self.smallestTabindex(s.d.data[0]), self.biggestTabindex(s.d.data[0]));

где функции small/biggestTabindex возвращают соответствующие элементы

person jarek.jpa    schedule 02.02.2012