开发者

jQuery Multiple Hidden Panel Issue

I've been working on setting up some hidden sliding panels. I've found a "slider" that seems to work pretty well so far. I'm able to open the panels properly, and have them close when click off the panel window. Now I'm trying to finish up one last problem.

As the panels are opening, they are stacking, one on top of another. What I'd like to do is have these panels close as a different panel is opened. I've attempted to adjust the scripts, but I'm extremely new to jQuery and scripting. Here's what I've currently got:

<script type="text/javascript" src="../js/slidepanel/jquery.slidePanel.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

    // default settings
    // $('.panel').slidePanel();

    // custom settings
    $('#panel1').slidePanel({
        triggerName: '#trigger1',
        position: 'fixed',
        triggerTopPos: '300px',
        panelTopPos: '25px',
    });

    $('#panel2').slidePanel({
        triggerName: '#trigger2',
        position: 'fixed',
        triggerTopPos: '340px',
        panelTopPos: '210px'
    });

    $('#panel3').slidePanel({
        triggerName: '#trigger3',
        position: 'fixed',
        triggerTopPos: '380px',
        panelTopPos: '210px',
    });
});
</script>

From what I can find I need to have some type of toggle functionality added to this, but after several attempts, I'm getting nowhere fast. Any information would be greatly appreciated. Please let me know if there is more information that I would need to provide to properly answer this quest开发者_开发问答ion. Thanks for viewing and thanks for any assistance!


Assumptions:

  1. It looks like you are using the slidepanel plugin at http://plugins.jquery.com/project/slidePanel
  2. You want all other panels to close that do not belong to the current trigger, while maintaining the ability to toggle the current trigger's panel.

THE SOLUTION
You can add a small change to the plugin that will hide all panels before executing slidePanel() to show the intended panel.

if (!panel.is(':visible')) {
   $('.panel').hide(opts.speed);$('.trigger').removeClass('active');
}

The entire plugin has been included below to show where you should make the change (look for comment that says "STACKOVERFLOW EDIT"). See the working example at jsfiddle using markup from the plugin demo page.

/* jQuery slidePanel plugin
 * Examples and documentation at: http://www.jqeasy.com/
 * Version: 1.0 (22/03/2010)
 * No license. Use it however you want. Just keep this notice included.
 * Requires: jQuery v1.3+
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */
(function($){
    $.fn.slidePanel = function(opts) {
        opts = $.extend({
            triggerName: '#trigger',
            position: 'absolute',
            triggerTopPos: '80px',
            panelTopPos: '50px',
            panelOpacity: 0.9,
            speed: 'fast',
            ajax: false,
            ajaxSource: null,
            clickOutsideToClose: true
        }, opts || {});

        var panel = this;
        var trigger = $(opts.triggerName);
        var isIE6 = $.browser.msie && $.browser.version=="6.0"

        // ie6 doesn't like fixed position
        if(isIE6) { opts.position = 'absolute' }
        // set css properties for trigger and panel
        trigger.css('position',opts.position)
        trigger.css('top',opts.triggerTopPos);
        panel.css('position',opts.position)
        panel.css('top',opts.panelTopPos);
        panel.css('filter', 'alpha(opacity='+(opts.panelOpacity*100)+')');
        panel.css('opacity', opts.panelOpacity);

        // triggerName mousedown event
        trigger.attr( "href", "javascript:void(0)" ).mousedown(function() {
            // load default content if ajax is false

            // STACKOVERFLOW EDIT: http://stackoverflow.com/questions/2551217/jquery-select-all-elements-of-a-given-class-except-for-a-particular-id
            // hide all panels and reset all trigger classes.  first check if visible to allow toggle to function
            if (!panel.is(':visible')) {
                $('.panel').hide(opts.speed);$('.trigger').removeClass('active');
            }

            if (!opts.ajax) {
                panel.toggle(opts.speed);
                trigger.toggleClass("active");
            };
            // load ajax data if ajax is true or throw error if no ajaxSource defined
            if (opts.ajax && opts.ajaxSource!=null) {
                // fetch data ONLY when panel is hidden...
                // otherwise it fetches data when the panel is closing
                if (!panel.is(':visible')) {
                    panel.load(opts.ajaxSource, function(response, status, xhr) {
                        // if the ajax source wasn't loaded properly
                        if (status !== "success") {
                            var msg = "<p>Sorry, but there was an error loading the document.</p>";
                            panel.html(msg);
                        };
                        // this is part of the .load() callback so it fills the panel BEFORE opening it
                        panel.toggle(opts.speed);
                    });
                } else {
                    panel.toggle(opts.speed);
                };
                trigger.toggleClass("active");
            } else if (opts.ajax && opts.ajaxSource==null) {
                    alert('You must define an ajaxSource to use Ajax.');
                };
            return false;
        });

        if (opts.clickOutsideToClose) {
            // bind the 'mousedown' event to the document so we can close panel without having to click triggerName
            $(document).bind('mousedown',function(){panel.hide(opts.speed);trigger.removeClass('active');});

            // don't close panel when clicking inside it
            panel.bind('mousedown',function(e){e.stopPropagation();});
        };
    };
})(jQuery);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜