2013-10-04 3 views
0

Ищете создание моего самого первого JQuery Plugin. В основном вертикально вертикальный div на пустой странице.JQuery Plugin: как изменить размер окна?

(function($){ 
    $.fn.centerdiv = function(options) { 
     var defaults = { 
      ratio : 2 
     }; 
     var options = $.extend(defaults, options); 
     // get some useful variables 
     var $this   = $(this); 
     var $heightDiv  = $this.height(); 
     var $heightWindow = $(window).height(); 
     var $marginTop  = Math.round(($heightWindow - $heightDiv)/options.ratio); 
     var applyMargin  = function() { 
      $this.css('margin-top',$marginTop+'px'); 
      console.log($heightWindow); 
     } 
     $(window).resize(applyMargin); 
     applyMargin(); 
     return $this; 
    }; // fn.centerdiv 
})(jQuery); 

Это работает, но не для «изменения размера окна». Нашел еще один ответ (jQuery $(window).resize not firing within jQuery plugin), но добавление «окна» после $ не решает мою проблему. Как я могу заставить этот плагин работать и с изменением размера окна? Спасибо вам за все!

Отредактировано с ответом ...

ответ

2

Две проблемы здесь

  • , что вы претендуете на CSS к window.
  • эта часть вашего кода после заявления return.

Заменить

return this.each(function() { 
    $(this).css('margin-top',$marginTop+'px'); 
}); // return 
$(window).resize(function() { 
    $(this).css('margin-top',$marginTop+'px'); 
}); 

с

var $this = $(this), f = function(){ 
    $this.css('margin-top',$marginTop+'px'); 
} 
$(window).resize(f); 
f(); 
return $this; 

и положить, что перед return заявление.

+0

Отредактированный код с ответом, но он не изменяет размер с помощью окна. Я сделал еще одну ошибку? Большое спасибо – sineverba

2

this в контексте вашего обработчика событий window.resize относится к window. Вы должны сохранить ссылку на внешний this, так что вы можете использовать его в обработчик события:

... 
var $this = $(this); 
    $(window).resize(function() { 
     $this.css('margin-top',$marginTop+'px'); 
    }); 
... 

Вы также должны разместить return в конце функции, все после того, как он не выполняет.

0

Решено: я не пересчитал высоту окна. Это окончательный код. Как вы думаете, правильно?

(function($){ 
    $.fn.centerdiv = function(options) { 
     var defaults = { 
      ratio : 2 
     }; 
     var options = $.extend(defaults, options); 
     // get some useful variables 
     var $this   = $(this); 
     var calculateMargin = function() { 
      var $heightDiv  = $this.height(); 
      var $heightWindow = $(window).height(); 
      var $marginTop  = Math.round(($heightWindow - $heightDiv)/options.ratio); 
      return $marginTop; 
     } 
     return this.each(function() { 
      var $marginTop = calculateMargin(); 
      $this.css('margin-top',$marginTop+'px'); 
      $(window).resize(function() { 
       var $marginTop = calculateMargin(); 
       $this.css('margin-top',$marginTop+'px'); 
      }); 
     }); 
    }; // fn.centerdiv 
})(jQuery); 
+0

Если это работает, тогда это правильно :) –

+0

Вы делаете больше работы, чем необходимо. Вы кешируете '$ (this)' как '$ this', который может содержать несколько элементов. И тогда вы привязываете обработчик события 'window.resize' для каждого события, но внутри этого обработчика событий вы применяете CSS ко всем элементам объекта' $ this'. Я либо создавал бы переменную '$ this' в цикле' .each() ', либо привязывался бы к' window.resize' только один раз. Кроме того, обычно запуск переменной с '$' в проекте, который использует jQuery, означает, что переменная является объектом jQuery. – Jasper

+0

Thnak вам за отзыв. Я бы узнал, так могли бы вы написать изменения, чтобы улучшить этот микроплагин? спасибо – sineverba

Смежные вопросы