2 сценария jQuery конфликтуют! - PullRequest
1 голос
/ 26 февраля 2011

Я использовал два скрипта jquery (плагины), один для навигации и один для динамического контента.

  1. http://www.i -marco.nl / weblog / jquery-accordion-3 /
  2. http://css -tricks.com / dynamic-page-replacecing-content /

Они отлично работают в одиночку, но не вместе.Я устал переключать сценарии, когда я меняю порядок сценариев в index.html, сценарии, которые в последний раз начинают работать, как будто игнорируют первый.Например, в этом порядке работает меню:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="js/jquery.ba-hashchange.min.js" type="text/javascript"></script>
<script src="js/dynamicpage.js" type="text/javascript"></script>    
<script src="js/menu.js" type="text/javascript"></script>

И в этом порядке работает динамический контент:

<script src="js/menu.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="js/jquery.ba-hashchange.min.js" type="text/javascript"></script>
<script src="js/dynamicpage.js" type="text/javascript"></script>

Это dynamicpage.js:

$(function() {

    var newHash      = "",
        $mainContent = $("#main-content"),
        $pageWrap    = $("#wrapper"),
        baseHeight   = 0,
        $el;

    $pageWrap.height($pageWrap.height());
    baseHeight = $pageWrap.height() - $mainContent.height();

    $("nav").delegate("a", "click", function() {
        window.location.hash = $(this).attr("href");
        return false;
    });

    $(window).bind('hashchange', function(){

        newHash = window.location.hash.substring(1);

        if (newHash) {
            $mainContent
                .find("#guts")
                .fadeOut(200, function() {
                    $mainContent.hide().load(newHash + " #guts", function() {
                        $mainContent.fadeIn(200, function() {
                            $pageWrap.animate({
                                height: baseHeight + $mainContent.height() + "px"
                            });
                        });
                        $("nav a").removeClass("current");
                        $("nav a[href="+newHash+"]").addClass("current");
                    });
                });
        };

    });

    $(window).trigger('hashchange');

})(jQuery);

И это menu.js:

jQuery.fn.initMenu = function() {  
    return this.each(function(){

        var theMenu = $(this).get(0);
        $('.acitem', this).hide();
        $('li.expand > .acitem', this).show();
        $('li.expand > .acitem', this).prev().addClass('active');
        $('li a', this).click(
            function(e) {
                e.stopImmediatePropagation();
                var theElement = $(this).next();
                var parent = this.parentNode.parentNode;
                if($(parent).hasClass('noaccordion')) {
                    if(theElement[0] === undefined) {
                        window.location.href = this.href;
                    }
                    $(theElement).slideToggle('normal', function() {
                        if ($(this).is(':visible')) {
                            $(this).prev().addClass('active');
                        }
                        else {
                            $(this).prev().removeClass('active');
                        }    
                    });
                    return false;
                }
                else {
                    if(theElement.hasClass('acitem') && theElement.is(':visible')) {
                        if($(parent).hasClass('collapsible')) {
                            $('.acitem:visible', parent).first().slideUp('normal', 
                            function() {
                                $(this).prev().removeClass('active');
                            }
                        );
                        return false;  
                    }
                    return false;
                }
                if(theElement.hasClass('acitem') && !theElement.is(':visible')) {         
                    $('.acitem:visible', parent).first().slideUp('normal', function() {
                        $(this).prev().removeClass('active');
                    });
                    theElement.slideDown('normal', function() {
                        $(this).prev().addClass('active');
                    });
                    return false;
                }
            }
        }
    );
});
};

$(document).ready(function() {$('.menu').initMenu();});

Пожалуйста, помогите, я буду очень благодарен!

PS Это текущий порядок сценариев, в котором только динамический контентработает, меню не работает:

<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/menu.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="js/jquery.ba-hashchange.min.js" type="text/javascript"></script>
<script src="js/dynamicpage.js" type="text/javascript"></script>

1 Ответ

2 голосов
/ 26 февраля 2011

Мне кажется, что оба сценария связывают событие с тегами <a> в пределах <nav> и .menu (соответственно) и обоими return false в конце функции щелчка (). Возвращаемое значение false будет препятствовать распространению события и выполнению другим сценарием ...

Таким образом, функция click из последнего загруженного вами скрипта, которая добавляет привязку клика к этим тегам a, выполняется первой, возвращает false и, таким образом, предотвращает вызов привязки первого скрипта.

Если это проблема, изменение плагинов так, чтобы функции щелчка возвращали истину, и вместо этого вызывал event.preventDefault (), но это не сработало бы на 100%

EDIT

Трудно исправить, не углубляясь в то, что именно это все должно делать, но попробуйте заменить это в dynamicpage.js

$("nav").delegate("a", "click", function() {
        window.location.hash = $(this).attr("href");
        return false;
    });

с этим

$("nav").delegate("a", "click", function(e) {
        window.location.hash = $(this).attr("href");
        e.preventDefault()
        return true;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...