Any objections, Mike? If not, I'll post it for you.

thanks,
Karl


___________________
Karl Swedberg
www.englishrules.com
www.learningjquery.com

On Nov 7, 2006, at 11:15 AM, Brandon Aaron wrote:

> This excellent explanation should probably be on learningjquery.com.
>
> On 11/6/06, Michael Geary <[EMAIL PROTECTED]> wrote:
>>> From: Simon Corless
>>> Thanks for the help Mike, it's starting to come together.
>>> I've been testing it just now.
>>>
>>> If I do use return this.each() then how do I reference the
>>> jQuery methods? without this.hover() etc? Obviously as this
>>> is no longer what I am expecting this.hover (as you say)
>>> fails. So do I use my 'self' variable or another way?
>>
>> If you are calling each(), that means your plugin may operate on  
>> more than
>> one element, right? If you do "var self = this;" outside the each 
>> () call,
>> that is a reference to the entire jQuery object - an array of all  
>> the DOM
>> elements. The reason you would call each() is to operate on those  
>> elements
>> one by one. So in most cases that 'self' isn't what you want  
>> inside the
>> each() inner function.
>>
>> In that inner function 'this' is the individual DOM element, so if  
>> you want
>> a jQuery object for that element, use $(this).
>>
>> Let's try some more descriptive names instead of "self" and "this":
>>
>>     (function( $ ) {
>>         $.fn.twiddle = function() {
>>             var $all = this;
>>             $all.each( function() {
>>                 var element = this, $element = $(element);
>>                 // Now we have:
>>                 //   $all - jQuery obect for all matching elements
>>                 //   $element - jQuery obect for a single element
>>                 //   element - a single element itself
>>             });
>>         };
>>     })( jQuery );
>>
>> Now you can write the entire plugin using meaningful names. In  
>> practice, I
>> tend to use shorter names like e and $e instead of element and  
>> $element, but
>> I used the longer ones here to make it more descriptive.
>>
>> Remember that if the plugin doesn't need to work on the individual  
>> DOM
>> elements but only uses jQuery methods on the whole collection,  
>> then you
>> don't need an each() loop at all.
>>
>> Contrast a plugin that sets all matching elements to the same  
>> random color:
>>
>>     (function( $ ) {
>>         $.fn.twiddle = function() {
>>             var $all = this;
>>             $all.background( randomColor() );
>>         };
>>     })( jQuery );
>>
>> vs. a plugin that sets each matching element to a different random  
>> color:
>>
>>     (function( $ ) {
>>         $.fn.twiddle = function() {
>>             $all.each( function() {
>>                 var element = this, $element = $(element);
>>                 $element.background( randomColor() );
>>             });
>>         };
>>     })( jQuery );
>>
>> Note the use of the $ prefix to indicate that a variable is a  
>> jQuery object,
>> and the use of matching names with and without the $ when you have  
>> both a
>> DOM element and a matching jQuery object for that element only. A  
>> similar
>> use of this pattern is:
>>
>>     var $foo = $('.foo'), foo = $foo[0];
>>
>> This is for typical non-plugin code where you're starting with a  
>> query.
>> Instead of writing code like this:
>>
>>     $('.foo').zip();
>>     // more code
>>     $('.foo').zoom();
>>     // more code
>>     $('.foo').fly();
>>
>> You'd write:
>>
>>     var $foo = $('.foo');
>>     $foo.zip();
>>     // more code
>>     $foo.zoom();
>>     // more code
>>     $foo.fly();
>>
>> In this case we're not using any DOM methods, so we only use $foo  
>> and not
>> foo.
>>
>>> I thought I saw someone just using
>>> .hover() (without any prefix) but this just fails.
>>
>> You probably saw code like:
>>
>>     $('.foo')
>>         .zip()
>>         .zoom()
>>         .fly();
>>
>> That's a single line of code split into multiple lines. It's the  
>> same as:
>>
>>     $('.foo').zip().zoom().fly();
>>
>>> I don't fully understand the difference, currently I don't
>>> use any dom methods I just use jQuery (I partly thought
>>> that was the point of it? - Although I realise sometimes
>>> you need to go deeper).
>>
>> jQuery doesn't try to provide its own equivalent of every possible  
>> DOM
>> property and method, so it's pretty handy to be able to mix and  
>> match when
>> you need to.
>>
>>> Basically I have 3 internal functions defined in two ways as:
>>>
>>> nextItem = function ()
>>> or
>>> function pause()
>>>
>>> Am I right in thinking that nextItem() could be called
>>> through a jQuery chain and that pause() can only be called
>>> internally from my plugin? Or are they both the same just
>>> written differently?
>>
>> Those are just different ways of writing functions - they have  
>> little or
>> nothing to do with how a function can be used.
>>
>> For example, these are essentially identical, creating functions  
>> in the
>> current scope:
>>
>>    var foo = function(){};
>>
>>    function foo(){}
>>
>> If I left off the "var", the first one would create a global  
>> function:
>>
>>    foo = function(){};
>>
>> That is usually a mistake, as it is in your code - your nextItem  
>> should be
>> either:
>>
>>    var nextItem = function()...
>>
>> or:
>>
>>    function nextItem()...
>>
>> The latter would be more consistent with the rest of your code, so  
>> that's
>> what I'd use.
>>
>> Another coding tip or two...
>>
>> You have several places with code like this:
>>
>>    settings['blank']
>>
>> That's OK, but you can substitute the simpler:
>>
>>    settings.blank
>>
>> I would change this code:
>>
>>     if (items[i]['link']) {
>>         self.html("<a href=\"\">" + items[i]['item'] + "</a>");
>>     } else {
>>         self.html(items[i]['item']);
>>     }
>>
>> to:
>>
>>     var item = items[i];
>>     if (item.link) {
>>         self.html('<a href="">' + item.item + '</a>');
>>     } else {
>>         self.html(item.item);
>>     }
>>
>> Or, even better:
>>
>>     var item = items[i];
>>     self.html( item.link ? '<a href="">' + item.item + '</a>' :  
>> item.item );
>>
>> -Mike
>>
>>
>> _______________________________________________
>> jQuery mailing list
>> [email protected]
>> http://jquery.com/discuss/
>>
>
> _______________________________________________
> jQuery mailing list
> [email protected]
> http://jquery.com/discuss/


_______________________________________________
jQuery mailing list
[email protected]
http://jquery.com/discuss/

Reply via email to