Функция jQuery завершает работу при вызове другой функции jQuery - PullRequest
1 голос
/ 09 сентября 2009

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

Проблема в том, что когда я запускаю другую функцию, а именно fancybox (), на панорамном миниатюре в теле страницы и пытаюсь прокрутить, моя первоначальная функция "scroll-fix" перестает работать.

Кто-нибудь знает, почему это так?

////////////////////
Демонстрационная страница
////////////////////


////////////////////////////////////
Функция «Scroll-Fix»

 $(document).ready(function(){

  var element = $("#sidebar");
  var window_height = $(window).height();
  var element_height = element.height();

  $(window).ready(function() { 
    if (window_height > element_height) {
      if (($(document).scrollTop() + element.height()) > ($(document).height() - $("#footer").height() - 9)) {
        element.css("position","absolute");
        element.css("top", "auto");
        element.css("bottom","-60px");
      }
      else if ($(document).scrollTop() > 220) {
        element.css("position","fixed");
        element.css("top","9px");
        element.css("padding-top","0");
        element.css("bottom","auto");
      }
      else {
        element.css("position","relative");
        element.css("top","auto");
        element.css("padding-top","57px");
        element.css("bottom","auto");    
      }
    }
    else {
      element.css("position","relative");
      element.css("top","auto");
      element.css("padding-top","57px");
        element.css("bottom","auto");
    }
  });


  $(window).scroll(function() { 
    if (window_height > element_height) {
      if (($(document).scrollTop() + element.height()) > ($(document).height() - $("#footer").height() - 9)) {
        element.css("position","absolute");
        element.css("top", "auto");
        element.css("bottom","-60px");
      }
      else if ($(document).scrollTop() > 220) {
        element.css("position","fixed");
        element.css("top","9px");
        element.css("padding-top","0");
        element.css("bottom","auto");
      }
      else {
        element.css("position","relative");
        element.css("top","auto");
        element.css("padding-top","57px");
        element.css("bottom","auto");    
      }
    }
    else {
      element.css("position","relative");
      element.css("top","auto");
      element.css("padding-top","57px");
        element.css("bottom","auto");
    }
  });

  $(window).resize(function(){
    window_height = $(window).height();
    if (window_height > element_height) {
      if (($(document).scrollTop() + element.height()) > ($(document).height() - $("#footer").height() - 9)) {
        element.css("position","absolute");
        element.css("top", "auto");
        element.css("bottom","-60px");
      }
      else if ($(document).scrollTop() > 220) {
        element.css("position","fixed");
        element.css("top","9px");
        element.css("padding-top","0");
        element.css("bottom","auto");
      }
      else {
        element.css("position","relative");
        element.css("top","auto");
        element.css("padding-top","57px"); 
        element.css("bottom","auto");     
      }
    }
    else {
      element.css("position","relative");
      element.css("top","auto");
      element.css("padding-top","57px");
        element.css("bottom","auto");
    }
  });

});

Ответы [ 3 ]

3 голосов
/ 18 октября 2010

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

$(window).unbind('scroll', $.prettyPhoto.close);

Жирная часть , $ .prettyPhoto.close - это то, что я добавил.

Надеюсь, это поможет любому, кто столкнулся с проблемой закрытия свитка с prettyPhoto.

0 голосов
/ 10 сентября 2009

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

(function($) {
    $.fn.myScrollFix = function(options) {

        options = $.extend({
            footer:  "footer",
            pthis: this,
            doc: $(document),
            win: $(window)
        }, options || {});

        options.footer = $(options.footer);
        options.accion = function() {

            var element = options.pthis,
                doc_scroll_top = options.doc.scrollTop(),
                doc_height  = options.doc.height(),
                window_height = options.win.height(),
                element_height = options.pthis.height(),
                footer_height = options.footer.height();

            if (window_height > element_height) {
                if ((doc_scroll_top + element_height) > (doc_height - footer_height - 9)) {
                    element
                        .css("position","absolute")
                        .css("top", "auto")
                        .css("bottom","-60px");
                }
                else if (doc_scroll_top > 220) {
                    element
                        .css("position","fixed")
                        .css("top","9px")
                        .css("padding-top","0")
                        .css("bottom","auto");
                }
                else {
                    element
                        .css("position","relative")
                        .css("top","auto")
                        .css("padding-top","57px")
                        .css("bottom","auto");    
                }
            }
            else {
                element
                    .css("position","relative")
                    .css("top","auto")
                    .css("padding-top","57px")
                    .css("bottom","auto");
            }
        };

        $(window).bind("scroll", options.accion);
        $(window).bind("resize", options.accion);

        options.accion();
    };
})(jQuery);
$(document).ready(function(){
    $("#sidebar").myScrollFix();
});

тогда вы можете изменить эти строки в FancyBox

строка 432

$(window).unbind("resize scroll", $.fn.fancybox.scrollBox);

строка 439

$(window).unbind("resize scroll", $.fn.fancybox.scrollBox);
0 голосов
/ 10 сентября 2009

Проблема решена.

Оказывается, в FancyBox.js есть строка, которая в основном гласит: когда вы закрываете необычную коробку ...

if (opts.centerOnScroll) {
  $(window).unbind("resize scroll");
}

Отмена привязки окна также приводит к отмене привязки моего решения с прокруткой.

Простое комментирование этой строки (которое происходит дважды в этой функции закрытия fancybox) решает эту проблему.

if (opts.centerOnScroll) {
//  $(window).unbind("resize scroll");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...