0

複数の jQuery プラグインを組み合わせることがよくありますが、それらが適切に連携していないことがわかります。

以下の例では、サムネイルが 1 つずつ表示され、スクロール バーが消えるという 2 つの効果を組み合わせています。

これは、htmlの下の方にjQueryを両方持っていますが、「1つずつ表示」のみが機能しています。どういうわけかスクロールバー機能を無効にしました:

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

そして、これは「1つずつ表示」され、jQueryがコメントアウトされ、display: none; 取り出した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>

サムネイルが 1 つずつ表示されます。

<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書き込みを上書きします。

回避策-2つのページを互いに分離するには、iframe要素を使用します。

または、プラグインを調べて、プラグインで使用されるクラス名のプレフィックスを作成する方法があるかどうかを確認します。これは、cssクラス名を独立させておくのに役立つ場合があります。

それ以外の場合は、firebugまたは別のツールからDOMを調べてください。問題に関係しているCSSスタイルとHTML要素を確認して、問題を修正するために行う可能性のあるヒントを入手してください。

于 2012-07-08T23:46:51.173 に答える