Bootstrap Modal - show не удаляет атрибут hide

Я создаю модуль Bootstrap 2.3.1 следующим образом:

myModal = $('<div/>', {
   'class': 'modal hide',
   'id': id + '-addModal',
   'tabindex': -1, // needed for escape to work...
   'role': 'dialog',
   'data-backdrop': 'static'
   }).append(content);


// insert Modal into DOM...
$(jqElement).after(myModal);

// focus on first input when it pops up...
myModal.on('shown', function () {
    myModal.find('select:first').focus();
   });

//в ответ на нажатие кнопки...  myModal.modal( 'шоу');

В редких случаях на заднем плане отображается, но модальный не отображается. Кто-нибудь сталкивался с подобной проблемой и обходным решением? Я знаю, что IE8 не любит анимированные модалы (использование класса fade), и это не похоже на ту же проблему, что и мы не используем fade. Проблема появляется в FF, Chrome и IE, но, как и испанская инквизиция, никогда, когда я этого ожидаю.

Ошибка оказывается в рамках выполнения modal('show'). Кажется, что модаль существует, но не скрыт. Я считаю, что это должно быть достигнуто добавлением класса in в модальное. Однако события show и shown происходят. От взгляда на код начальной загрузки факт, что показанное событие происходит, означает, что событие не предотвращено по умолчанию.

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

Также обратите внимание, что я не могу обновить Bootstrap 3. Я несу ответственность за внесение небольших изменений в уже выпущенный продукт, а изменение базовых библиотек - это не стартер.

Ответ 1

Я нашел следующие проблемы:

a) "показанное" действие модальных проверок для атрибута display:block и заставляет его устанавливать.

b) кнопка закрытия (которая необходима для проверки) была установлена ​​на событие click - изменение этого на делегированное событие заставило его работать надежно

c) обе кнопки отмены были сопоставлены с действием модального отклонения.

myModal.on('show', function (event) {
    self._debug("show modal");

    // show add form - should be a modal
    myModal.find('form')[0].reset();
    myModal.find('.alerts').empty();
    self._debug('show end');
    return true;
});

myModal.on('shown', function () {
    var $el = $('#myModal');
    if ($el.css('display') == 'none') {
       self._debug(" WARNING! modal css error");
    }
    self._debug("fix for bootstrap error");
    $el.css('display', 'block');
    myModal.find('select:first').focus();
    self._debug('Shown modal');
    return true;
 });

myModal.on('hide', function () {
    self._debug('Hide modal');
    return true;
});

myModal.on('hidden', function () {
  var $el = $('#myModal');
  $el.css('display', 'none');
  self._debug('Hidden modal');
  return true;
        });

Ответ 2

Я изменил код и добавил его в тело вместо неизвестного jqElement, указанного в вашем примере. Кроме того, я добавил несколько примеров содержимого места. См. Следующий JS Fiddle для рабочего примера http://jsfiddle.net/kYVtf/5/

var id = 'test',
content = '<div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h3 id="myModalLabel">Modal header</h3></div><div class="modal-body"><p><select><option>TEST</option></select></p></div>  <div class="modal-footer">    <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>    </div>';

var myModal = $('<div/>', {
    'class': 'modal hide fade',
    'id': id + '-addModal',
    'tabindex': -1, // needed for escape to work...
    'role': 'dialog',
    'data-backdrop': 'static'
}).html(content);


// insert Modal into DOM...
$('body').append(myModal);

// focus on first input when it pops up...
myModal.on('shown', function () {
    myModal.find('select:first').focus();
});

Ответ 3

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

$('.modal').modal({
    backdrop: 'static',
    keyboard: false
});

Я исправил это, добавив show: false к модальным параметрам и убедившись, что в <div class="modal fade"

не было класса hide