0

我经常组合多个 jQuery 插件,却发现它们不能一起正常工作。

下面的例子结合了两种效果:缩略图一一出现,滚动条消失。

这个在 html 底部有两个 jQuery,但只有“一个一个出现”在工作。它以某种方式禁用了滚动条功能:

http://heidixu.com/creative/test/index2.html

而这个已经“一一出现”的jQuery注释掉了,并且显示:无;从取出的css中,突然滚动条功能又开始工作了:

http://heidixu.com/creative/test/index2.html将鼠标悬停在内容区域上可以看到滚动条出现和消失。

如何让多个插件一起工作?

非常感谢!

编辑:为了使它更容易,我想我将代码附加到这个。

消失的滚动条:

<script type="text/javascript">
            $(function() {

                // the element we want to apply the jScrollPane
                var $el                 = $('#jp-container').jScrollPane({
                    verticalGutter  : -16
                }),

                // the extension functions and options  
                    extensionPlugin     = {

                        extPluginOpts   : {
                            // speed for the fadeOut animation
                            mouseLeaveFadeSpeed : 500,
                            // scrollbar fades out after hovertimeout_t milliseconds
                            hovertimeout_t      : 1000,
                            // if set to false, the scrollbar will be shown on mouseenter and hidden on mouseleave
                            // if set to true, the same will happen, but the scrollbar will be also hidden on mouseenter after "hovertimeout_t" ms
                            // also, it will be shown when we start to scroll and hidden when stopping
                            useTimeout          : true,
                            // the extension only applies for devices with width > deviceWidth
                            deviceWidth         : 980
                        },
                        hovertimeout    : null, // timeout to hide the scrollbar
                        isScrollbarHover: false,// true if the mouse is over the scrollbar
                        elementtimeout  : null, // avoids showing the scrollbar when moving from inside the element to outside, passing over the scrollbar
                        isScrolling     : false,// true if scrolling
                        addHoverFunc    : function() {

                            // run only if the window has a width bigger than deviceWidth
                            if( $(window).width() <= this.extPluginOpts.deviceWidth ) return false;

                            var instance        = this;

                            // functions to show / hide the scrollbar
                            $.fn.jspmouseenter  = $.fn.show;
                            $.fn.jspmouseleave  = $.fn.fadeOut;

                            // hide the jScrollPane vertical bar
                            var $vBar           = this.getContentPane().siblings('.jspVerticalBar').hide();

                            /*
                             * mouseenter / mouseleave events on the main element
                             * also scrollstart / scrollstop - @James Padolsey : http://james.padolsey.com/javascript/special-scroll-events-for-jquery/
                             */
                            $el.bind('mouseenter.jsp',function() {

                                // show the scrollbar
                                $vBar.stop( true, true ).jspmouseenter();

                                if( !instance.extPluginOpts.useTimeout ) return false;

                                // hide the scrollbar after hovertimeout_t ms
                                clearTimeout( instance.hovertimeout );
                                instance.hovertimeout   = setTimeout(function() {
                                    // if scrolling at the moment don't hide it
                                    if( !instance.isScrolling )
                                        $vBar.stop( true, true ).jspmouseleave( instance.extPluginOpts.mouseLeaveFadeSpeed || 0 );
                                }, instance.extPluginOpts.hovertimeout_t );


                            }).bind('mouseleave.jsp',function() {

                                // hide the scrollbar
                                if( !instance.extPluginOpts.useTimeout )
                                    $vBar.stop( true, true ).jspmouseleave( instance.extPluginOpts.mouseLeaveFadeSpeed || 0 );
                                else {
                                clearTimeout( instance.elementtimeout );
                                if( !instance.isScrolling )
                                        $vBar.stop( true, true ).jspmouseleave( instance.extPluginOpts.mouseLeaveFadeSpeed || 0 );
                                }

                            });

                            if( this.extPluginOpts.useTimeout ) {

                                $el.bind('scrollstart.jsp', function() {

                                    // when scrolling show the scrollbar
                                clearTimeout( instance.hovertimeout );
                                instance.isScrolling    = true;
                                $vBar.stop( true, true ).jspmouseenter();

                            }).bind('scrollstop.jsp', function() {

                                    // when stop scrolling hide the scrollbar (if not hovering it at the moment)
                                clearTimeout( instance.hovertimeout );
                                instance.isScrolling    = false;
                                instance.hovertimeout   = setTimeout(function() {
                                    if( !instance.isScrollbarHover )
                                            $vBar.stop( true, true ).jspmouseleave( instance.extPluginOpts.mouseLeaveFadeSpeed || 0 );
                                    }, instance.extPluginOpts.hovertimeout_t );

                            });

                                // wrap the scrollbar
                                // we need this to be able to add the mouseenter / mouseleave events to the scrollbar
                            var $vBarWrapper    = $('<div/>').css({
                                position    : 'absolute',
                                left        : $vBar.css('left'),
                                top         : $vBar.css('top'),
                                right       : $vBar.css('right'),
                                bottom      : $vBar.css('bottom'),
                                width       : $vBar.width(),
                                height      : $vBar.height()
                            }).bind('mouseenter.jsp',function() {

                                clearTimeout( instance.hovertimeout );
                                clearTimeout( instance.elementtimeout );

                                instance.isScrollbarHover   = true;

                                    // show the scrollbar after 100 ms.
                                    // avoids showing the scrollbar when moving from inside the element to outside, passing over the scrollbar                              
                                instance.elementtimeout = setTimeout(function() {
                                    $vBar.stop( true, true ).jspmouseenter();
                                }, 100 );   

                            }).bind('mouseleave.jsp',function() {

                                    // hide the scrollbar after hovertimeout_t
                                clearTimeout( instance.hovertimeout );
                                instance.isScrollbarHover   = false;
                                instance.hovertimeout = setTimeout(function() {
                                        // if scrolling at the moment don't hide it
                                    if( !instance.isScrolling )
                                            $vBar.stop( true, true ).jspmouseleave( instance.extPluginOpts.mouseLeaveFadeSpeed || 0 );
                                    }, instance.extPluginOpts.hovertimeout_t );

                            });

                            $vBar.wrap( $vBarWrapper );

                        }

                        }

                    },

                    // the jScrollPane instance
                    jspapi          = $el.data('jsp');

                // extend the jScollPane by merging 
                $.extend( true, jspapi, extensionPlugin );
                jspapi.addHoverFunc();

            });
        </script>

缩略图一一出现:

<script type="text/javascript">
            $(function() {
                // Start showing the divs
                showDiv();
            });

            function showDiv() {
                // If there are hidden divs left
                if($('div:hidden').length) {
                    // Fade the first of them in
                    $('div:hidden:first').fadeIn();
                    // And wait one second before fading in the next one
                    setTimeout(showDiv, 500);
                }
            }
        </script>
4

1 回答 1

0

一般来说,jquery 插件应该独立工作。

他们可能不这样做的原因有很多,但所有这些都取决于一个或两个插件本身的缺陷。

由于 HTML 类名、id 等冲突,您经常会遇到 jquery 插件失败。例如,消失的滚动条很可能是一些冲突的 CSS,在您的工具中使用时不能很好地播放。

也很常见:插件中的一些 jquery 选择器覆盖了从另一个工具编写的一些 html。

一种解决方法 - 使用 iframe 元素将两个页面彼此分开。

或者查看插件,看看是否有任何方法可以为插件使用的类名创建前缀。这可能会有所帮助,因为它将使您的 css 类名保持独立。

否则,只需从 firebug 或其他工具查看 DOM。查看问题中涉及哪些 CSS 样式和 HTML 元素,以了解您可能会采取哪些措施来修复它。

于 2012-07-08T23:46:51.173 回答