Jump to content
  • 0

Своя функция


inex
 Share

Question

Добрый день. Помаленьку изучаю jQuery, и вот добрался до создания плагина, но что-то не получается...поэтому прошу помощи...

Вот как было изначально и работает:


jQuery(document).ready(function(){
jQuery(window).scroll(function () {
if (jQuery(this).scrollTop() > 300) {
jQuery('.box').fadeIn();
} else {
jQuery('.box').fadeOut();
}
});
});

а вот пытаюсь переделать в плагин:


jQuery(document).ready(function(){
(function( $ ){
$.fn.myBox = function() {
jQuery(window).scroll(function () {
if (this.scrollTop() > 300) {
this.fadeIn();
} else {
this.fadeOut();
}
});
};
})( jQuery );
});


<script>
jQuery(function(){
jQuery(".box").myBox();
});
</script>

но не работает...помогите пожалуйста разобраться что делаю не так, заранее спасибо!

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

не проверял

(function( $ ) {

var win;

$.fn.myBox = function() {
win = win || $( window ).scroll(function() {
win.trigger( 'my' );
});

win.on( 'my', function() {
var method = win.scrollTop > 300 ? 'fadeIn' : 'fadeOut';
this[ method ]();
}.bind( this ));
};

}( jQuery ));



$(function() {

$( ".box" ).myBox();

});

Edited by nerv
  • Like 1
Link to comment
Share on other sites

  • 0

Первая ошибка - не this, а $(this).

Вторая, когда ты входишь в функцию myBox() $(this) - это ".myBox", а во внутренней функции scroll $(this) - это уже window.

Поэтому первое, что нужно сделать в myBox() - это записать значение this в переменную. var box = $(this); и уже использовать его.


jQuery(document).ready(function(){
(function( $ ){
$.fn.myBox = function() {
var box = $(this);
jQuery(window).scroll(function () {
if (box.scrollTop() > 300) {
box.fadeIn();
} else {
box.fadeOut();
}
});
};
})( jQuery );
});
jQuery(".box").myBox();

  • Like 1
Link to comment
Share on other sites

  • 0

На форуме есть отличная статья которая очень подробно объясняет как писать плагины к jQuery http://forum.htmlboo...showtopic=23096 . Спасибо товарищу Great Rash'у за это.


(function($) {
$.fn.myBox = function(options) {
// Default
var settings = {
scrollTop: 300
};

return this.each(function() {
if (options) {
$.extend(settings, options);
}

var $this = $(this);
$(window).on({
scroll: function() {
if ($(this).scrollTop() > settings.scrollTop) {
$this.fadeIn();
} else {
$this.fadeOut();
}
}
});
});
};
})(jQuery);

Потом уже можно будет вызывать


$(function(){
$('.box').myBox({
scrollTop : 500
});
});

  • Like 1
Link to comment
Share on other sites

  • 0

На форуме есть отличная статья которая очень подробно объясняет как писать плагины к jQuery http://forum.htmlboo...showtopic=23096 . Спасибо товарищу Great Rash'у за это.


(function($){
$.fn.myBox = function(options) {
// Default
var settings = {
scrollTop: 300
};

return this.each(function() {
if (options) {
$.extend(settings, options);
}

var $this = $(this);
$(window).on({
scroll : function(){
if($(this).scrollTop() > settings.scrollTop) {
$this.fadeIn();
}
else {
$this.fadeOut();
}
}
});
});
};
})(jQuery);

Потом уже можно будет вызывать


$(function(){
$('.box').myBox({
scrollTop : 500
});
});

Огромное спасибо за пример и за ссылку! Всё заработало!

Link to comment
Share on other sites

  • 0

Спасибо за помощь, сделал как подсказал Zverushka, но что-то не работает :( Буду разбираться, пока туговато)

Извиняюсь, маленькую ошибку допустила, не "if(box.scrollTop()>300){", а "if($(this).scrollTop()>300){"

http://jsfiddle.net/cJ8MV/7/

Edited by Zverushka
  • Like 1
Link to comment
Share on other sites

  • 0
На форуме есть отличная статья

не читал, но могу сказать несколько комментариев по твоему коду:

$.fn.myBox = function(options) {

// Default

var settings = {

scrollTop: 300

};

1. зачем создавать объект с настройками каждый раз при обращению к плагину?

$(window).on({

2. зачем биндить событие каждый раз при вызове плагина, если можно сделать это один раз для всех вызовов? (в данном случае)

  • Like 1
Link to comment
Share on other sites

  • 0

nerv

1. Потому, что если настройки по-умолчанию вынести за функцию


(function($) {
// Default
var settings = {
scrollTop: 300
};
$.fn.myBox = function(options) {
return this.each(function() {
/* ... */
});
};
})(jQuery);

то первый же вызов плагина с параметрами перепишет этот объект глобально (в рамках контекста) для всех будущих обращений к плагину. Это явно не то что ожидается :)

2. Что нужно было точно вынести из return this.each(), так это extend который переопределяет параметры по-умолчанию:


(function($) {
$.fn.myBox = function(options) {
// Default
var settings = $.extend({
scrollTop: 300
}, options);
return this.each(function() {
/* ... */
});
};
})(jQuery);

Что касается событий... ну в данном конкретном случае теоретически да можно сразу скопом для всех цеплять события. Тут надо сказать вообще весьма странный функционал в этом плагине.

Но! Как правило, коллекция (может состоять из нескольких элементов) к которой привязывается плагин, действовать должны по отдельности каждый элемент коллекции независимо от остальных.

  • Like 1
Link to comment
Share on other sites

  • 0

Я повторюсь, что я пока изучаю jq, поэтому да, не спорю что мой "плагин" это банально :) Просто столкнулся с трудностями, которые не смог решить сам...поэтому большое спасибо, за то что помогли и показали как правильно...т.к. в будущем хочу написать "плагин", "библиотечку" для личного пользования...

Link to comment
Share on other sites

  • 0
то первый же вызов плагина с параметрами перепишет этот объект глобально (в рамках контекста) для всех будущих обращений к плагину. Это явно не то что ожидается

var obj = $.extend({}, obj1, obj2 ); 

Edited by nerv
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy