2 jQuery脚本冲突!

时间:2011-02-25 21:40:12

标签: jquery scripting dynamic conflict

我使用了两个2 jquery(插件)脚本,一个用于导航,一个用于动态内容。

  1. http://www.i-marco.nl/weblog/jquery-accordion-3/
  2. http://css-tricks.com/dynamic-page-replacing-content/
  3. 他们单独工作但不在一起。我厌倦了切换脚本,当我更改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();});
    

    请帮助,我会非常感激!

    P.S。这是脚本的当前顺序,其中只有动态内容正在运行,菜单不起作用:

    <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 个答案:

答案 0 :(得分:2)

在我看来,这两个脚本都绑定了<a><nav>.menu标签上的事件,并且最后两个return false点击功能()。返回false将阻止事件传播并由其他脚本执行...

因此,实际上,您加载的最后一个脚本的click函数会在这些a标记上添加点击绑定,首先执行,返回false,从而阻止调用第一个脚本的绑定。

如果这是问题,修改插件以使click函数返回true并调用event.preventDefault()可能会起作用(不是100%肯定这个)

修改

如果没有深入研究究竟应该做什么,但很难修复,但尝试在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;
    });