Bootstrap v2 Dropdown Navigation не работает в мобильных браузерах

У меня возникла проблема с выпадающими меню Bootstrap на мобильных устройствах (Bootstrap 2). Аналогичный вопрос был задан здесь с раскрывающимися кнопками, однако ответом на это была встроенная ошибка в начальной загрузке, которая была устранена в обновлении. Похоже, у меня такая же проблема, так что, возможно, это связано с моей наценкой?

У меня есть складная панель навигации с выпадающими списками, и все отлично работает в настольных браузерах. Однако на мобильном устройстве выпадающие списки будут открываться, когда вы нажимаете на раскрывающийся список, но нажатие любой ссылки в раскрывающемся списке просто снова свернет раскрывающийся список — ссылки недоступны. Я пробовал разные версии начальной загрузки и не могу это исправить, поэтому могу только представить, что это моя разметка. Вот:

 <header class="navbar">
    <div class="navbar-inner">
        <div class="container">
            <a href="#"><h1>Branding</h1></a>
            <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> Menu </button>
            <div class="nav-collapse collapse">
                <ul class="nav">
                    <li><a href="#">Menu Item 1</a></li>
                    <li class="dropdown">                    
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Menu Item 2 (Dropdown)<b class="caret"></b></a>      
                        <ul class="dropdown-menu">
                            <li><a href="#">Dropdown Item 1</a></li>
                            <li><a href="#">Dropdown Item 2</a></li>
                            <li><a href="#">Dropdown Item 3</a></li>  
                            <li><a href="#">Dropdown Item 4</a></li>                           
                        </ul>
                    </li>
                    <li><a href="#">Menu Item 3</a></li>
                    <li><a href="#">Menu Item 4</a></li>
                </ul>
            </div><!--/.nav-collapse -->
        </div>
    </div>
</header>

Вот пример, воспроизводящий код (извините, не могу отправить сайт): http://jsfiddle.net/yDjw8/1/

(Проблему можно увидеть/воспроизвести только на мобильном телефоне — я использую iOS)

Любая помощь приветствуется.


person Stuart    schedule 18.06.2013    source источник
comment
Возможно, вам потребуется найти другой CDN для ссылки в Fiddle. Когда я посещаю его, файлы CSS и JS не загружаются должным образом. Я попытался создать свой собственный Fiddle, используя тот же CDN, и ссылки на файлы CSS и JS сломались после того, как я перезагрузил Fiddle.   -  person Michael Freake    schedule 19.06.2013
comment
Спасибо за это @MichaelFreake — я сменил хостинг на дропбокс — лучше?   -  person Stuart    schedule 19.06.2013
comment
Я могу подтвердить, что теперь он работает в Chrome на моем компьютере с Win7. Скрипка также отображается точно так же на моем iPhone 5 iOS 6.1.3 с использованием Chrome и Safari. Я также вижу описанное вами поведение. Нажмите на ссылку меню — она подсветится. Нажмите на ссылку подменю — меню свернется.   -  person Michael Freake    schedule 19.06.2013


Ответы (15)


В сжатом файле bootstrap.min.js найдите подстроку

"ontouchstart"

и замените его на

"disable-ontouchstart"

Проверьте этот похожий вопрос SO: Свернутое меню Bootstrap Ссылки не работают на мобильных устройствах

person Jollyra    schedule 24.07.2013
comment
Спасибо, это отлично работает после нескольких часов веб-серфинга T_T, спасибо! - person Daniel Flores; 18.09.2014
comment
Это решение не работает с начальной загрузкой 3.3.6:/ - person Guillaume; 15.05.2016
comment
Это не «решение». - person zilj; 03.10.2016

Нашел это исправление для версии 2.3.2:

<script>
jQuery(document).ready(function($)  {
$("li.dropdown a").click(function(e){
    $(this).next('ul.dropdown-menu').css("display", "block");
    e.stopPropagation();
  });
}); </script>     

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

person asbanks    schedule 07.08.2013
comment
Спасибо за этот ответ. Это заставило ссылки работать, но раскрывающийся список больше не рушится в тестируемой мной версии. В любом случае, я бы назвал это принятым ответом, но @Jollyra пришла первой! - person Stuart; 09.08.2013
comment
спасибо за решение. однако есть две проблемы: 1. выпадающие списки не закрывают другие открытые выпадающие списки, когда они открываются; и 2. ссылки внутри раскрывающихся списков не могут распространять свой JS. публикация исправления: stackoverflow.com/a/25041753/437019 - person Yossi Shasho; 30.07.2014
comment
Привет @YossiShasho, ваше решение работает для меня, большое спасибо, но при каждом нажатии кнопки представление веб-сайта будет возвращаться к верхней части представления веб-сайта, как сделать так, чтобы представление не возвращалось наверх / все еще в том же положении, если я нажму раскрывающийся список кнопка? - person karisma; 07.11.2020

Я использую BootStrap 3.1.1. Я пробовал много ответов, выпадающее меню отлично работает на устройствах Android, но по-прежнему не работает на устройстве iOS. Наконец-то я нахожу корень проблемы.

Safari на iPhone поддерживает событие клика только для элементов <a> и <input>. См. этот отрывок Делегирование события Click на iPhone.

Поэтому нам нужно добавить настраиваемое делегирование кликов. Следующий код решит проблему.

$('[data-toggle=dropdown]').each(function() {
 this.addEventListener('click', function() {}, false);
});
person icemelon    schedule 11.03.2014
comment
Этот. Большое спасибо, приятель. - person Josue Alexander Ibarra; 26.02.2016

Я решил эту же проблему, выполнив следующее:

1. Откройте js/bootstrap-dropdown.js или его уменьшенную версию.

2. Найдите строки или места для: touchstart.dropdown.data-api

3. Должно быть только 4 случая. Что-то вроде этого:

.on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
.on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
.on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)

Вы должны вставить эту новую строку между 2-м и 3-м вхождением:

.on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })

4. Код вашей новости должен быть примерно таким:

.on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
.on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
.on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
.on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)

Будьте осторожны с уменьшенными версиями Bootstrap.js... поэтому вы должны соединить новую строку в точном месте на ней.

Удачи! :)

person Massa    schedule 08.01.2014
comment
лучшее решение, у меня отлично работало для старых версий BS. Спасибо! - person Aslam; 17.04.2014

Я рекомендую загрузить последние файлы Bootstrap и заменить bootstrap.js и bootstrap.min.js на вашем сервере новыми версиями.

Это решило проблему для меня.

person Duncan Micahel-MacGregor    schedule 28.03.2014
comment
Этот вопрос сейчас довольно старый, однако на момент написания я уже пробовал это несколько раз. - person Stuart; 28.03.2014
comment
У меня работало, переходя с BS 3.7.1 на BS 4.1.3 - person PruitIgoe; 21.11.2018

Я нашел решение этого на форуме bootstrap git-hub. Вам нужно включить только одну строку кода в скрипт в готовом документе, как,

$('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); });

Это работа для меня!!!

person Jigar Trivedi    schedule 10.07.2015

Это исправление предназначено для Bootstrap 2.3.2 и основано на ответе @asbanks (https://stackoverflow.com/a/18107103/437019).

Помимо ответа asbanks, этот скрипт также распространяет вызовы JS из ссылок внутри раскрывающихся списков, а открытый раскрывающийся список закрывает другие открытые.

$(function() {
  return $("a.dropdown-toggle:not(.multiselect)").click(function(e) {
    $("ul.dropdown-menu:not(.multiselect-container)").css("display", "none");
    $(this).next("ul.dropdown-menu").css("display", "block");
    return e.stopPropagation();
  });
});

$(document).on('click click.dropdown.data-api', function(e) {
  if (!$(e.target).closest('.dropdown, .multiselect-container').length) {
    return $("ul.dropdown-menu:not(.multiselect-container)").css("display", "none");
  }
});
person Yossi Shasho    schedule 30.07.2014
comment
Этот код исправил мою проблему даже на Bootstrap 3.3.7. - person CopyJosh; 09.05.2017
comment
Привет, братан @Yossi, это решение работает для меня, но при каждом нажатии кнопки представление веб-сайта будет возвращаться к верхней части представления веб-сайта, как сделать так, чтобы представление не возвращалось к началу / все еще в той же позиции, если я нажимаю кнопку раскрывающегося списка? - person karisma; 07.11.2020

Кажется, это работает без каких-либо проблем. Класс «open» уже существует с начальной загрузкой и должен работать, но по какой-то причине это не так. Этот код заставляет его работать соответственно. :)

    jQuery(document).ready(function($) {
    $("li.dropdown").click(function(e){
        $(this).toggleClass("open");
        });
    });
person Kathryn    schedule 20.04.2016

Похоже, у меня все работает, возможно, попробуйте заменить файлы начальной загрузки новой копией, если вы случайно что-то там испортили. Или, если это не сработает, убедитесь, что вы импортируете все. Вы уверены, что импортируете все файлы CSS и JS?

person Community    schedule 18.06.2013
comment
К сожалению, я пытался повторно добавить Bootstrap около 5 раз. Там все есть из коробки. Я действительно застрял на этом — странное поведение без причины. Как я уже говорил, все это прекрасно работает на рабочем столе, но, очевидно, не там, где оно будет использоваться :) - person Stuart; 19.06.2013

Когда вы щелкаете по раскрывающемуся списку, он добавляет класс open к вашему <li class="dropdown">, что дает вам: <li class="dropdown open">. Когда вы щелкаете ссылку в раскрывающемся меню или «Пункт меню 2 (раскрывающийся список)», класс open удаляется, в результате чего раскрывающееся меню снова складывается.

В приведенной ниже скрипте показано, как остановить распространение события click, но это может вызвать проблемы в другом месте. Кроме того, я предотвратил распространение только по пункту № 1 в раскрывающемся списке. Вы можете использовать jQuery, чтобы это произошло со всеми элементами раскрывающегося списка.

JS-скрипт: http://jsfiddle.net/yDjw8/2/

person Michael Freake    schedule 19.06.2013

Я использую bootstrap-3.3.1 и сталкиваюсь с той же проблемой в приложении Android phonegap.

Я нашел забавный обходной путь после нескольких проб и ошибок:

// clueless hack here!!!! otherwise dropdown menu doesn't work
$('.dropdown-toggle').dropdown('toggle');
$('.dropdown-toggle').dropdown('toggle');
person Miao ZhiCheng    schedule 03.01.2015
comment
Да, это работает для меня. Я не знаю, почему дважды заявил, что это работает. - person Raza; 31.10.2015
comment
хорошо, это работает ... но это действительно относится к тому, почему ЭТО работает. - person Abela; 18.05.2016

добавление role="button" к <a href="#" class="dropdown-toggle" data-toggle="dropdown">Menu Item 2 (Dropdown)<b class="caret"></b></a> сработало для меня

<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button">Menu Item 2 (Dropdown)<b class="caret"></b></a>

person David DiBenedetto    schedule 19.01.2017

jquery-1.11.2, бутстрап-3.3.2:

$('#yourId').on('hidden.bs.dropdown', function (){
    $(this).click(function (event) {
       $('.dropdown-toggle').dropdown('toggle'); 
    });
});
person Ferry    schedule 15.02.2015
comment
Было бы полезно, если бы вы подробно описали причину проблемы и почему ваше решение работает. - person Jon Surrell; 16.02.2015
comment
работает на меня, потому что я использую dropdown.js из бутстрапа. и такая же ошибка происходит. - person Ferry; 06.10.2016
comment
Мой комментарий на самом деле касается предоставления информации в вашем ответе, а не просто предоставления фрагмента кода. Как правило, полезнее объяснить, чем просто сказать, что это работает. - person Jon Surrell; 06.10.2016

Я думаю, если вы сделаете следующее, ссылки будут работать правильно

$(document).ready(function(){
            $('.youClass').click(function(){
                var menuItem = '<a class=" " href=" ">Log Out</a>';

                $('.anotherClass').append('<li class=".youClass">'+ menuItem +'</li>');

            });
        });
person Edward Okech    schedule 08.03.2016

Мне приходилось работать с Bootatrap v2.2.1. Выпадающий список работал на десктопе, но сразу же закрывался после открытия на мобильном телефоне.

И я думаю, проблема в том, что старая версия не рассчитана на работу с сенсорными устройствами.

Итак, мое исправление основано на предотвращении некоторых событий касания:

$('a.dropdown-toggle').on('touchstart', function (e) {
  e.preventDefault();
});

В редких случаях может потребоваться добавить:

  $('a.dropdown-toggle').on('touchmove', function (e) {
      e.preventDefault();
  });

  $('a.dropdown-toggle').on('touchcancel', function (e) {
      e.preventDefault();
  });
person Galina    schedule 28.01.2021