Выпадающий список Jquery не работает в IE8

#javascript #jquery

#javascript #jquery

Вопрос:

Я использую следующий скрипт для создания горизонтального выпадающего меню на сайте. Он прекрасно работает в Firefox и Safari, но терпит неудачу в IE8 (неожиданный сюрприз). Предполагаемое поведение заключается в том, что при наведении курсора мыши на пункт главного меню с подменю в списке навигации появится соответствующее подменю, и все существующие подменю в .submenu div исчезнут. Однако в IE8 только один из пунктов меню будет отображать соответствующее подменю (и то только после наведения курсора мыши на ссылку слева от него, ссылку без подменю), и это отключает эффект наведения курсора CSS на ссылки. Вот живой пример.

Я недостаточно разбираюсь в jQuery, чтобы знать, почему у меня могут возникнуть проблемы, поэтому я обращаюсь за помощью к хорошим людям из StackOverflow. Спасибо!

(Редактировать: я также запускаю ie7.js на этой конкретной странице — я не знаю, повлияет ли это на что-нибудь или нет, но я подумал, что это стоит упомянуть)

 $(document).ready(function() {
            $('.submenu ul').hide(); //hide all submenus
                var msec = document.location.href; //get current  url
                var mshref = msec.split("/"); //trim URL to include only current section
                $('.submenu ul[class~=' mshref[3] ']').show(); //show submenu belonginging to current section

            $('.topmenu a').hover(function(){
                var msection = $(this).attr("href");
                var msechref = msection.split("/");
                if($('.submenu ul[class~=' msechref[3] ']').length){ //if there's a submenu belonging to this section
                    $('.submenu ul').hide();//hide all submenus
                    $('.submenu ul[class~=' msechref[3] ']').show(); //show the submenu for the section being hovered over
                } 
                else
                {
                $('.submenu ul').hide();//hide all submenus
                $('.submenu ul[class~=' mshref[3] ']').show();//show submenu for current section
                }

            });
        });
 

И вот HTML.

         <nav><!-- top nav -->
    <div class="topmenu">
        <ul class="section_list">
<li><a class="active" href="http://test/">Home</a></li>
<li><a href="http://test/about/">About</a></li>
<li><a href="http://test/ministries/">ministries</a></li>
<li><a href="http://test/news/">news</a></li>

<li><a href="http://test/sermons/">sermons</a></li>
<li><a href="http://test/contact/">contact</a></li>
</ul>
    </div>      
    <div class="submenu">
        <ul class="category_list about">
<li><a href="http://test/about/?c=join-us">join us</a></li>
<li><a href="http://test/about/?c=our-beliefs">our beliefs</a></li>

<li><a href="http://test/about/?c=our-staff">our staff</a></li>
<li><a href="http://test/about/?c=services">services</a></li>
</ul>
        <ul class="category_list ministries">
<li><a href="http://test/ministries/?c=adults">adults</a></li>
<li><a href="http://test/ministries/?c=children">children</a></li>
<li><a href="http://test/ministries/?c=preschool">preschool</a></li>

<li><a href="http://test/ministries/?c=youth">youth</a></li>
</ul>
    </div>
</nav><!-- end of top nav -->
 

Комментарии:

1. Можем ли мы увидеть часть вашего HTML-контента?

2. @kara я добавил это к вопросу.

3. Посмотрите на это с IE8. Если это работает, значит, с вашим скриптом возникла другая проблема, и вам нужно показать больше своего кода или пример страницы.

4. @kara вот ссылка на живой образец.

5. в IE8 в режиме совместимости это работает 🙂 (ваша примерная страница)

Ответ №1:

РЕДАКТИРОВАТЬ — Можете ли вы попробовать это вместо вашего:

 $(document).ready(function() {
  var root = 'http://www.qualprnt.com/clients/fbcw/', $submenu = $('.submenu ul');
  $submenu.hide();
  var current = location.href.replace(root, '').split('/')[0];
  if(current != '') {
    $submenu.filter('.'   current).show();
  }
  $('.topmenu a').mouseenter(function(){
    var section = this.href.replace(root, '').split('/')[0];
    $submenu.hide();
    if(section != '') {
      $submenu.filter('.'   section).show();
    }
    else {
      if(current != '') {
        $submenu.filter('.'   current).show();
      }
    }
    return false;
  });
});
 

С помощью этого решения вам необходимо изменить root переменную после перемещения сайта в его исходный домен. Пожалуйста, дайте мне знать, если это работает.

Я не буду удалять свой старый ответ, возможно, он будет полезен кому-то еще.

СТАРЫЙ ОТВЕТ:

Если вы хотите немного изменить свой CSS и HTML, то это решение может быть лучше для вас.

HTML:

 <nav><!-- top nav -->
    <div class="topmenu">
        <ul class="section_list">
            <li><a class="active" href="http://test/">Home</a></li>
            <li><a href="http://test/about/">About</a>
                <ul class="category_list">
                    <li><a href="http://test/about/?c=join-us">join us</a></li>
                    <li><a href="http://test/about/?c=our-beliefs">our beliefs</a></li>
                    <li><a href="http://test/about/?c=our-staff">our staff</a></li>
                    <li><a href="http://test/about/?c=services">services</a></li>
                </ul>
            </li>
            <li><a href="http://test/ministries/">ministries</a>
                <ul class="category_list">
                    <li><a href="http://test/ministries/?c=adults">adults</a></li>
                    <li><a href="http://test/ministries/?c=children">children</a></li>
                    <li><a href="http://test/ministries/?c=preschool">preschool</a></li>
                    <li><a href="http://test/ministries/?c=youth">youth</a></li>
                </ul>
            </li>
            <li><a href="http://test/news/">news</a></li>
            <li><a href="http://test/sermons/">sermons</a></li>
            <li><a href="http://test/contact/">contact</a></li>
        </ul>
    </div>      
</nav><!-- end of top nav -->
 

Javascript:

 $(document).ready(function() {
    $('.section_list > li').hover(
        function() {
            var $this = $(this);
            if($this.has('ul')) {
                $this.find('ul').show();
            }
        },
        function() {
            var $this = $(this);
            if($this.has('ul')) {
                $this.find('ul').hide();
            }
        }
    );
});
 

Комментарии:

1. Я создаю всю навигацию через CMS, а собственные теги не позволяют мне использовать структуру UL> LI> UL. Мне пришлось бы вручную кодировать все элементы навигации, чего я бы предпочел не делать, поскольку клиент будет поддерживать это в будущем, и я хочу как можно меньше обслуживать в будущем.

2. Я попробовал ваш новый код, но он фактически отключил отображение подменю в Firefox. В комментарии к исходному сообщению Марк предположил, что мой код работал в режиме совместимости с IE8; Я включил режим совместимости на тестовом сайте localhost, и он работает отлично.

Ответ №2:

измените теги вашего скрипта:

 <script>
 

Для

 <script type="text/javascript">
 

Комментарии:

1. К сожалению, никакого эффекта не оказало. Хотя ваше предыдущее предложение о просмотре сайта в режиме совместимости сработало. Я попробую предложение Кары ниже, но если я все еще не смогу заставить его работать, мне придется принудительно установить совместимость в IE8.

2. Есть несколько других тегов скрипта, кроме трех простых с src=, но также без типа (например, jquery min one). Ничто не выдает «ошибку», кроме плохого поведения, которое я наблюдал раньше, когда тип опущен ИЛИ если тег скрипта сделан самозакрывающимся.

3. здесь тоже нет типа: <script src='http://www.qualprnt.com/clients/fbcw/js/jquery.googlecalreader-1.0.js'></script>