2016-11-28 6 views
3

Я кодирую всплывающее окно, используя Foundation6. Я столкнулся с проблемой JavaScript, которую я отслеживал, возможно, что-то связано с привязкой или обработкой событий jQuery.js/Foundation.js.Фонд6 всплывающее поле формы нежелательный фокус потерян (в событиях jQuery?)

screenshot from codepen

Когда я нажимаю текстовое поле (или любое другое поле) в окне раскрыть поле получает фокус, а затем раскрыть окно быстро скрывает и снова показывает, и поле потерял фокус. Окно раскрытия также изменяет его положение на экране. Доступ к текстовым полям возможен только с помощью табуляции.

index.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.2.4/foundation.css"/>  
     <script src="https://code.jquery.com/jquery-3.1.1.js"></script> 
     <script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.2.4/foundation.js"></script> 
     <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> 
     <script src="app.js"></script> 
    </head> 
    <body> 
     <section class="container clearfix"> 
      <h3>Click button to open modal and test focus lost problem:</h3> 
      <p><a href="modalform.html" class="button" data-open="newFormModal" data-showloading="1">Test focus modal form</a></p> 
     </section> 
     <div class="reveal" id="newFormModal" data-reveal data-close-on-click><section class="modalContent"></section><button class="close-button" data-close aria-label="Close reveal" type="button"><i class="fi-x"></i></button></div> 
    </body> 
</html> 

modalform.html

<h3 class="modalheader">PopupForm</h3> 
<form method="post" accept-charset="utf-8" class="ajaxModal" data-showloading="1" data-open="newFormModal" action="/test/modalform3"> 
    <div style="display:none;"><input type="hidden" name="_method" value="POST" /></div> 
    <div class="input text"><label for="ga-20x28">Product 1 qty:</label><input type="text" name="ProductQuantities[726][value]" id="ga-20x28" value="0" /></div> <input type="hidden" name="ProductQuantities[726][name]" value="GA 20x28" /> 
    <div class="input text"><label for="ga-30x40">Product 2 qty:</label><input type="text" name="ProductQuantities[727][value]" id="ga-30x40" value="0" /></div> <input type="hidden" name="ProductQuantities[727][name]" value="GA 30x40" /> 
    <div class="input text"><label for="ga-50x70">Product 3 qty:</label><input type="text" name="ProductQuantities[728][value]" id="ga-50x70" value="0" /></div> <input type="hidden" name="ProductQuantities[728][name]" value="GA 50x70" /> 
<button type="submit">Next</button> 
</form> 
<button data-close="" class="refreshId" type="submit">Close</button> 

app.js:

$(document).ready(function() { 

    $(document).foundation(); 

    $("body").on("click", "a[data-open]", function(e) { 
     e.preventDefault(); 

     var $this = $(this); 
     var modalName = $this.data("open"); 
     var $modal = $("#" + modalName); 
     var $target = $modal.children(".modalContent"); 
     var requestUri = $(this).attr('href'); 
     var requestData; 
     var method; 
     if($this.attr('data-request')) { 
      requestData = $(this).data("request"); 
      method = 'POST'; 
     } else { 
      requestData = ""; 
      method = 'GET'; 
     } 


     // Load content: 
     var request = $.ajax({ 
      url: requestUri, 
      method: method, 
      data: requestData, 
      dataType: "html", 
      timeout: 60000 
     }); 

     request.done(function(response) { 
      $target.html(response); 
      $target.foundation(); 
     }); 
    }); 
}); 

Здесь вы можете проверить поведение (по крайней мере, на моих браузерах Firefox & Хром): [http://codepen.io/repeat_spacer/pen/bBRZKd][1]. Откройте всплывающее окно всплывающего окна с кнопкой и попытайтесь изменить значение любого текстового поля. Невозможно ввести поле с помощью мыши.

Надеюсь, что кто-нибудь может указать мне на проблему или как продолжить ее отслеживание.

UPDATE:

Я очистил код modalform.html (есть некоторые Аякса показывают нагрузки нового вида вещь, у меня там Аякса нагрузки следующей формы). Итак, теперь функциональность «загрузка следующей формы» не работает, но с другой стороны «потерянное фокус» поведение исчезло.

modalform_updated.html:

<h3 class="modalheader">PopupForm</h3> 
<form method="post" accept-charset="utf-8" class="ajaxModal" action="submitmodal.php"> 
    <div style="display:none;"><input type="hidden" name="_method" value="POST" /></div> 
    <div class="input text"><label for="p1qty">Product 1 qty:</label><input type="text" name="ProductQuantities[p1][value]" id="p1qty" value="0" /></div> 
    <div class="input text"><label for="p2qty">Product 2 qty:</label><input type="text" name="ProductQuantities[p2][value]" id="p2qty" value="0" /></div> 
    <div class="input text"><label for="p3qty">Product 3 qty:</label><input type="text" name="ProductQuantities[p3][value]" id="p3qty" value="0" /></div> 
    <button type="submit">Submit</button> 
</form> 
<button data-close="" class="refreshId" type="submit">Close</button> 

Обновлено codepen: http://codepen.io/repeat_spacer/pen/MbrYvj

UPDATE 2:

Вот причина, почему я данных с открытым (Фонд Reveal открытым атрибут) в виде атрибутов. Похоже, что причиной такого поведения является инициирование события Foundation Open при нажатии на поле в форме. Поэтому быстрое исправление будет фильтровать его грязным способом.

Вот стельку с несколькими функциональными всплывающей я хочу иметь: http://codepen.io/repeat_spacer/pen/JbMdPm (первый Всплывающие модальные Ajax загружает следующий выскочит содержание в то же модальная)

+0

Что является причиной вниз голосования? –

+2

Возможно, потому что ваш вопрос не соответствует http://stackoverflow.com/help/how-to-ask well – GillesC

+0

@ GillesC Итак, теперь все в порядке? –

ответ

2

Хорошо теперь я получил это работает.Как хотелось бы, проблема заключалась в привязке события Foundation.

Я думал о какой-то причудливой общности, когда я добавил data-open="modalName" в атрибутах формы, чтобы указать, в каком модальном я хочу, чтобы Ajax загружал следующую модальную страницу (точно так же, как мне нужно сделать в первой кнопке, чтобы показать модальное окно .)

Теперь, когда data-open имеет атрибуты формы, он запускает открытое событие каждый раз, когда что-то в форме кликается. Событие закроет все раскрытия, а затем откройте раскрытие с идентификатором в атрибуте open-open, что приведет к потере фокуса.

Теперь я сохранил модное имя до data-modalname, и все работает, как и ожидалось.

HTML модификация:

<form method="get" accept-charset="utf-8" class="ajaxModal" data-showloading="1" data-modalname="this" action="modalform2.html"> 

А затем изменить обработчик событий в JS читать модальное имя там.

Рабочая CodePen: http://codepen.io/repeat_spacer/pen/QGazJj

+1

Я вникнул в это больше, и я думаю, что ваши рассуждения верны. data-open в форме приводит к любым щелчкам по форме, запускающей открытую. – kball

1

Я считаю проблему вы работаете в здесь является тот факт, что вы размещаете свой обработчик событий на body, а это означает, что он будет запускаться каждый раз, когда нажимается вся информация на странице. Щелчок внутри раскрывающегося списка запускает ваш обработчик событий, который снова открывает модальность отображения, тем самым возиться с вашим фокусом.

Чтобы устранить это, назначьте свой обработчик кликов на что-то еще на странице. Или, если вы действительно хотите, чтобы иметь его на теле, сделать что-то, чтобы проверить, действительно ли выявить уже открыт, прежде чем запустить его ... а-ля

$("body").on("click", "a[data-open]", function(e) { 
    if($('body').hasClass('is-reveal-open')) { return; } 
    // rest of handler 
} 
+0

Спасибо за предложение. То, что я видел в обработчиках событий с .on, обычно является привязкой к телу или всему документу. Идея заключается в том, что она также связывается с динамическими добавленными элементами (с помощью JavaScript и т. Д. После загрузки документа). Это событие срабатывает только при нажатии на якорь с атрибутом данных «data-open» внутри тега тела. Таким образом, он не срабатывает при нажатии на поле в режиме revel. –