使用jQuery

时间:2015-10-02 18:20:39

标签: jquery html prototype jquery-events dropdown

最终,我希望在单击图像时切换选择下拉列表。我想利用自定义jQuery库中定义的“打开/关闭”功能,但无法弄清楚如何访问“打开”功能。

问题:如何访问自定义jQuery库中定义的“open”或“close”函数? (更多细节如下 - 请注意,我没有使用jQuery Prototypes的经验,这是这个问题的一个重要部分 - 我甚至不确定我是否可以正确访问该对象。)

感谢任何帮助/建议或指导

我正在使用Codrops Simple Effects for Dropdowns文章作为参考。

具体来说,我在我的示例/问题中引用了Demo #4

该示例使用自定义jQuery库来设置样式/动画下拉列表:

这很简单:

  1. 首先,您可以布置HTML“选择”(下拉)标记

    <select id="cd-dropdown" class="cd-select">
        <option value="-1" selected>Choose an animal</option>
        <option value="1" class="icon-monkey">Monkey</option>
        <option value="2" class="icon-bear">Bear</option>
        <option value="3" class="icon-squirrel">Squirrel</option>
        <option value="4" class="icon-elephant">Elephant</option>
    </select>
    
  2. (包含所有必要的项目文件后)您可以调用插件函数

    $( '#cd-dropdown' ).dropdown();
    
  3. 该函数然后将我们的“选择”标记转换为以下结构

    <div class="cd-dropdown">
        <span>Choose an animal</span>
        <input type="hidden" name="cd-dropdown">
        <ul>
            <li data-value="1"><span class="icon-monkey">Monkey</span></li>
            <li data-value="2"><span class="icon-bear">Bear</span></li>
            <li data-value="3"><span class="icon-squirrel">Squirrel</span></li>
            <li data-value="4"><span class="icon-elephant">Elephant</span></li>
        </ul>
    </div>
    
  4. 然后该函数响应其文档中指定的click事件:

  5.   

    当点击第一个跨度时,我们将“cd-active”类应用于其父级,即“cd-dropdown”类的分区。选择一个选项时,相应的范围将插入第一个范围。

    接下来,jquery.dropdown.js file包含所有使用“原型”方法构建的定义 - 正如我之前提到的,我没有使用经验。我不会包含整个文件(因为有一个link)但我会包含我尝试访问的两个函数以及我认为正在初始化的文件。

    打开功能

    open : function() {
            var self = this;
            this.dd.toggleClass( 'cd-active' );
            this.listopts.css( 'height', ( this.optsCount + 1 ) * ( this.size.height + this.options.gutter ) );
            this.opts.each( function( i ) {
    
                $( this ).css( {
                    opacity : 1,
                    top : self.options.rotated ? self.size.height + self.options.gutter : ( i + 1 ) * ( self.size.height + self.options.gutter ),
                    left : self.options.random ? Math.floor( Math.random() * 11 - 5 ) : 0,
                    width : self.size.width,
                    marginLeft : 0,
                    transform : self.options.random ?
                        'rotate(' + Math.floor( Math.random() * 11 - 5 ) + 'deg)' :
                        self.options.rotated ?
                            self.options.rotated === 'right' ?
                                'rotate(-' + ( i * 5 ) + 'deg)' :
                                'rotate(' + ( i * 5 ) + 'deg)'
                            : 'none',
                    transitionDelay : self.options.delay && Modernizr.csstransitions ? self.options.slidingIn ? ( i * self.options.delay ) + 'ms' : ( ( self.optsCount - 1 - i ) * self.options.delay ) + 'ms' : 0
                } );
    
            } );
            this.opened = true;
    
        },
    

    关闭功能

    close : function() {
    
            var self = this;
            this.dd.toggleClass( 'cd-active' );
            if( this.options.delay && Modernizr.csstransitions ) {
                this.opts.each( function( i ) {
                    $( this ).css( { 'transition-delay' : self.options.slidingIn ? ( ( self.optsCount - 1 - i ) * self.options.delay ) + 'ms' : ( i * self.options.delay ) + 'ms' } );
                } );
            }
            this._positionOpts( true );
            this.opened = false;
    
        }
    

    全部通话

    $.fn.dropdown = function( options ) {
        var instance = $.data( this, 'dropdown' );
        if ( typeof options === 'string' ) {
            var args = Array.prototype.slice.call( arguments, 1 );
            this.each(function() {
                instance[ options ].apply( instance, args );
            });
        }
        else {
            this.each(function() {
                instance ? instance._init() : instance = $.data( this, 'dropdown', new $.DropDown( options, this ) );
            });
        }
        return instance;
    };
    

    设置功能 - 初始定义

    ( function( $, window, undefined ) {
    
    'use strict';
    
    $.DropDown = function( options, element ) {
        this.$el = $( element );
        this._init( options );
    };
    
    // the options
    $.DropDown.defaults = {
        speed : 300,
        easing : 'ease',
        gutter : 0,
        // initial stack effect
        stack : true,
        // delay between each option animation
        delay : 0,
        // random angle and positions for the options
        random : false,
        // rotated [right||left||false] : the options will be rotated to thr right side or left side.
        // make sure to tune the transform origin in the stylesheet
        rotated : false,
        // effect to slide in the options. value is the margin to start with
        slidingIn : false,
        onOptionSelect : function(opt) { return false; }
    };
    
    $.DropDown.prototype = {
    
        _init : function( options ) {
    
            // options
            this.options = $.extend( true, {}, $.DropDown.defaults, options );
            this._layout();
            this._initEvents();
    
        },
    

    希望这对某人有意义,他们可以帮助我。

    结论

    总之,我想点击页面上的图像,这将触发单击下拉列表时执行的相同功能/效果。

    我不确定我是否在问正确的问题所以我会问两个问题:

    1. 如何访问原型中定义的函数对象?
    2. 如何在点击其他元素时执行下拉列表打开功能? (*注意 - 这不会像正常的下拉菜单那样起作用,我知道这很难,如果不是不可能强行打开的话。我想我应该能够执行当点击下拉列表时执行的相同功能。)
    3. 感谢您对此事的耐心和帮助。

1 个答案:

答案 0 :(得分:2)

经过各种测试后,我想出了这个:

$.extend(
  $.DropDown.prototype, {
    open: function() {
      // YOUR CODE HERE
      alert('YYY');
    }
  }
);

您可以直接在您在问题中链接的组件网站(DEMO 4)上的浏览器控制台上试用它:

http://tympanus.net/Development/SimpleDropDownEffects/index4.html

原型方法&#34;打开&#34;延长,当您单击下拉列表时,您会收到警报。 您可以轻松扩展&#34;关闭&#34;方法也一样。

希望这有帮助。

编辑:

通过javascript触发下拉菜单,您只需执行以下操作:

$('.cd-dropdown span').mousedown();