Доступ к подфункции jQuery - PullRequest
3 голосов
/ 11 ноября 2011

я впервые публикую здесь, поэтому, пожалуйста, будьте осторожны, когда обучаете меня: P

У меня есть этот плагин:

(function($) {

        $.fn.slimScroll = function(o)
        {

            var ops = o;
            //do it for every element that matches selector
            this.each(function(){

            var isOverPanel, isOverBar, isDragg, queueHide, barHeight,
                divS = '<div></div>',
                minBarHeight = 30,
                wheelStep = 30,
                o = ops || {},
                cwidth = o.width || 'auto',
                cheight = o.height || '250px',
                size = o.size || '7px',
                color = o.color || '#000',
                position = o.position || 'right',
                opacity = o.opacity || .4,
                alwaysVisible = o.alwaysVisible === true;

                //used in event handlers and for better minification
                var me = $(this);

                //wrap content
                var wrapper = $(divS).css({
                    position: 'relative',
                    overflow: 'hidden',
                    width: cwidth,
                    height: cheight
                }).attr({ 'class': 'slimScrollDiv' });

                //update style for the div
                me.css({
                    overflow: 'hidden',
                    width: cwidth,
                    height: cheight
                });

                //create scrollbar rail
                var rail  = $(divS).css({
                    width: '15px',
                    height: '100%',
                    position: 'absolute',
                    top: 0
                });

                //create scrollbar
                var bar = $(divS).attr({ 
                    'class': 'slimScrollBar ', 
                    style: 'border-radius: ' + size 
                    }).css({
                        background: color,
                        width: size,
                        position: 'absolute',
                        top: 0,
                        opacity: opacity,
                        display: alwaysVisible ? 'block' : 'none',
                        BorderRadius: size,
                        MozBorderRadius: size,
                        WebkitBorderRadius: size,
                        zIndex: 99
                });

                //set position
                var posCss = (position == 'right') ? { right: '1px' } : { left: '1px' };
                rail.css(posCss);
                bar.css(posCss);

                //wrap it
                me.wrap(wrapper);

                //append to parent div
                me.parent().append(bar);
                me.parent().append(rail);

                //make it draggable
                bar.draggable({ 
                    axis: 'y', 
                    containment: 'parent',
                    start: function() { isDragg = true; },
                    stop: function() { isDragg = false; hideBar(); },
                    drag: function(e) 
                    { 
                        //scroll content
                        scrollContent(0, $(this).position().top, false);
                    }
                });

                //on rail over
                rail.hover(function(){
                    showBar();
                }, function(){
                    hideBar();
                });

                //on bar over
                bar.hover(function(){
                    isOverBar = true;
                }, function(){
                    isOverBar = false;
                });

                //show on parent mouseover
                me.hover(function(){
                    isOverPanel = true;
                    showBar();
                    hideBar();
                }, function(){
                    isOverPanel = false;
                    hideBar();
                });

                var _onWheel = function(e)
                {


                    //use mouse wheel only when mouse is over
                    if (!isOverPanel) { return; }

                    var e = e || window.event;

                    var delta = 0;
                    if (e.wheelDelta) { delta = -e.wheelDelta/120; }
                    if (e.detail) { delta = e.detail / 5; }

                    //scroll content
                    scrollContent(0, delta, true);

                    //stop window scroll
                    if (e.preventDefault) { e.preventDefault(); }
                    e.returnValue = false;


                    clearTimeout(queueHide);
                    queueHide = setTimeout(function()
                    {
                        hideBar();

                    }, 1000);

                }


                var scrollContent = function(x, y, isWheel)
                {

                    //ensure bar is visible
                    showBar();

                    var delta = y;

                    if (isWheel)
                    {
                        //move bar with mouse wheel
                        delta = bar.position().top + y * wheelStep;

                        //move bar, make sure it doesn't go out
                        delta = Math.max(delta, 0);
                        var maxTop = me.outerHeight() - bar.outerHeight();
                        delta = Math.min(delta, maxTop);

                        //scroll the scrollbar
                        bar.css({ top: delta + 'px' });

                    }

                    //calculate actual scroll amount
                    percentScroll = parseInt(bar.position().top) / (me.outerHeight() - bar.outerHeight());
                    delta = percentScroll * (me[0].scrollHeight - me.outerHeight());

                    //scroll content

                    me.scrollTop(delta);

                }

                /*
                test = setInterval(function()
                {
                    showBar();

                    delta = $("#inner").prop("scrollHeight");

                    scrollContent(0, delta, true);


                }, 3000);
                */

                var attachWheel = function()
                {
                    if (window.addEventListener)
                    {
                        this.addEventListener('DOMMouseScroll', _onWheel, false );
                        this.addEventListener('mousewheel', _onWheel, false );
                    } 
                    else
                    {
                        document.attachEvent("onmousewheel", _onWheel)

                    }
                }

                //attach scroll events
                attachWheel();

                var getBarHeight = function()
                {
                    //calculate scrollbar height and make sure it is not too small
                    barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);
                    bar.css({ height: barHeight + 'px' });
                }


                //set up initial height
                getBarHeight();


                function define_delta(newdelta)
                {
                    delta = newdelta;               
                }

                var showBar = function()
                {
                    //recalculate bar height
                    getBarHeight();
                    clearTimeout(queueHide);

                    //show only when required
                    if(barHeight >= me.outerHeight()) {
                        return;
                    }
                    bar.fadeIn('fast');
                }

                var hideBar = function()
                {
                    //only hide when options allow it
                    if (!alwaysVisible)
                    {
                        queueHide = setTimeout(function(){
                            if (!isOverBar && !isDragg) { bar.fadeOut('fast'); }
                        }, 1000);
                    }
                }

            });

            //maintain chainability
            return this;
        }


})(jQuery);

Что делает этот плагин, это делает полосу прокрутки похожей натот в Facebook, где вы можете прокрутить переполненный div с помощью мыши или перетаскивая div "scroll".

Я хочу сделать функцию, которая позволит мне сообщить плагину положение полосы прокрутки ипозиция переполненного div извне функции.

Пример:

Я называю плагин так:

$('#inner').slimScroll({ height: '515px' });

И я иногда хотел бы добавить это:

$('#inner').slimScroll().define_delta(1500);

Для этого я создал подфункцию внутри плагина, которая изменяет положение дельта-переменной, которую скрипт использует для позиционирования полосы прокрутки и содержимого.Но я не могу вызвать функцию.Я попробовал несколько способов.

Один из методов на странице примера jQuery, но из одного метода я не могу получить доступ к другим переменным метода и изменить их ...

Я попробовал все и искалздесь и везде, но мои знания программирования и язык очень ограничены, так что это своего рода последняя попытка.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Когда вы начнете узнавать о создании плагина, вы увидите, что есть публичные и частные функции.Публичные функции легче доступны извне плагина.Кроме того, вот хороший шаблонный плагин .

Итак, я не вижу никаких открытых функций в этом плагине, но я думаю, что самый простой метод / обходной путь был быдобавить метод привязки / триггера.В основном это делается так.Где-нибудь в коде добавьте эту функцию:

me.bind('scrollContent', function(e,y){
    scrollContent(0,y,true);
});

me относится к элементу, к которому был вызван плагин.Функция scrollContent - это функция, которая прокручивает содержимое и перемещает панель.0 - это горизонтальное положение окна, но, как ни странно, на него даже не ссылаются внутри функции, поэтому я просто установил его на ноль в качестве заполнителя.y - это вертикальное положение, но оно используется только при вычислениях колесика мыши внутри функции.true - это флаг, сообщающий функции, что она вызывается функцией mousewheel.Я установил для этого флага значение true, потому что y используется не для позиционирования окна, а для вычисления дельты в колесе мыши для перемещения окна вниз.В противном случае дельта определяется фактической позицией окна.

Теперь, чтобы использовать этот метод, просто запустите событие с именем scrollContent для элемента

$('#slimScroll').trigger('scrollContent', [1] );

Кажется, что расстояние равнофактически количество wheelStep значений для прокрутки вниз (по умолчанию 30).Поэтому можно установить меньшее значение в верхней части плагина или изменить его внутри функции bind, поскольку это глобальная переменная внутри плагина.Но учтите, что это также повлияет на функционирование колесика мыши.Да, и обратите внимание, что все значения внутри функции триггера должны быть в квадратных скобках (превращены в массив).

Кроме того, я сделал демо :)

0 голосов
/ 11 ноября 2011

вы не можете получить доступ к неэкспонированным функциям в замыкании, вы должны предоставить их, например, добавив их в $.fn или, возможно, как собственную коллекцию методов.

...