Archive for September, 2006

Visual jQuery Magazine Issue 1

Saturday, September 23rd, 2006

The first issue of Visual jQuery Magazine is now available from the Visual jQuery website. The website is an excellent reference for the jQuery API. In fact, it hooks right into the comments of the latest jQuery version, formatting everything into a highly readable, visually appealing page. The new monthly magazine extends the Visual jQuery brand to a PDF-format publication.
Visual jQuery Magazine Issue 1
Issue 1 features an interview with jQuery’s developer John Resig, an analysis of what sets jQuery apart from other JavaScript frameworks, a quick look at a few plugins, an introduction to the jQuery Object, and much more.

Editor Yehuda Katz has put a lot of work into releasing a first issue that is both beautiful and informative. Visit Visual jQuery Magazine or download it here (1.7MB PDF). Congratulations, Yehuda. We look forward to many more great issues to come.

Fancy Drop Cap - Part 1

Wednesday, September 20th, 2006

Introduction

Last spring when I implemented a new design for my weblog, I wanted to use a fancy drop cap for the first letter of the first paragraph of the first post of each page. There are all sorts of ways to make a drop cap happen, but since I was reading Jeremy Keith's excellent book DOM Scripting at the time, I thought I'd do it that way. The DOM scripting method that I put together had some important benefits for me at the time:

  • It used an image, so I didn't have to worry about installed fonts on users' machines
  • The HTML source stayed intact, so search engines wouldn't trip over a first word with a missing first letter.
  • It degraded nicely, so if users had JavaScript or images or both turned off, everything would still look fine, just a little less pretty.

Now that I'm learning jQuery, I thought I'd revisit my code and see if I could tidy it up a bit, the jQuery way.

Image Set

AI first put together a set of images, one for each letter of the alphabet, using a font from the Dieter Steffman collection at typOasis. If you don't want to go through the laborious process of converting letters into images, you can download mine (20KB zip). See the letter "A" floating to the right of this paragraph for an example.

Setting up the Code

Instead of putting all of the code in a $(document).ready() function, I created a separate function and just called it inside $(document).ready():

JavaScript:
  1. $(document).ready(function() {
  2.   swap_letter();
  3. });
  4.  
  5. function swap_letter() {
  6.   //all the code goes here
  7. }

Now we can get down to business.

Insert Image Here

The easiest part of the process was inserting the image, because jQuery makes it almost effortless.

(more...)

TextMate Bundle for jQuery

Thursday, September 14th, 2006

JonBob and I have been working on a TextMate bundle for jQuery over the past few weeks. If you're not familiar with TextMate and you own a Mac, you should definitely check it out. It has saved me countless hours of repetitive keystrokes with its bundles, which contain commands, code snippets, templates, and macros that are triggered by pressing special key combinations or clicking menu items.

jquery bundle for textmate

The jQuery bundle that we put together mostly consists of "tab triggers" for various functions, but it also includes context-sensitive help derived from the online documentation and some nice syntax highlighting. After selecting jQuery as your file type in TextMate, you could, for example, type ready and press the Tab key to produce this:

$(document).ready(function() {
  // Stuff to do as soon as the DOM is ready;
});

It'll then select the commented line (line 2 in this example) for you so you can start typing right away, replacing the comment with your code. Hit the Tab key once more and it drops you onto a new line below the closing brackets. If you want to learn more about a function that you've typed in, just click anywhere inside its name and press Control + H. You'll get official documentation on the function.

Get the Bundle

So, how can you get this cool jQuery bundle and speed up your coding? First, you'll need TextMate, of course. If you don't have it yet, download the 30-day trial. Then you'll need to either check out the bundles from the Subversion repository (advanced) or download and install the GetBundles bundle.

Slicker Show and Hide

Monday, September 11th, 2006

Last time I showed you how to make something appear and disappear on a web page. This time I'll show you how to do it with style.

Like we did last time, we'll start with our $(document).ready() and put everything else inside of it.

Adjust the Speed

This time, however, we're going to adjust the speed at which our item shows and hides. To do so, we put a speed indicator — "slow" or "normal" or "fast" or a number of milliseconds (1000 = 1 second) — inside the parentheses:

JavaScript:
  1. $('#slickbox').show('slow');

Note: If you use a speed word, put it inside quotation marks (either single or double); if you use a number, omit the quotation marks: $('#slickbox').show(500);

Attach Effects to Events

The final step here is to attach the effects to events. Last time we attached our effects to the "onclick" event of buttons. This time we'll attach them to links. But here's the rub: Links already have events attached to them. They take the user to whatever URL is indicated in the "href" attribute, usually another page. That means that we not only need to make something happen, but we also need to stop the default thing from happening. We can prevent the default behavior by adding return false;.

So let's take a look at how we would tie the "onclick" event of one link with an ID of "slick-show" to the "show" effect. Here, show() will display a DIV with an ID of "slickbox":

JavaScript:
  1. // shows the slickbox DIV on clicking the link with an ID of "slick-show"
  2.   $('a#slick-show').click(function() {
  3.     $('#slickbox').show('slow');
  4.     return false;
  5.   });

Notice that we attach ".click()" to "a#slick-show". In jQuery, events will often have anonymous, or lambda, functions inside them. That's why inside the parentheses of ".click()" you see function() { ... }. By the way, it's called an anonymous function because it has no name associated with it. I don't know why it's also called a lambda function. Can someone enlighten me?

Here is the final code for three effects — show(), hide(), and toggle(). I've added $('#slidebox').hide() as the first line after $(document).ready() to hide that DIV when the page loads.

JavaScript:
  1. $(document).ready(function() {
  2.  // hides the slickbox as soon as the DOM is ready
  3.  // (a little sooner than page load)
  4.   $('#slickbox').hide();
  5.  
  6.  // shows the slickbox on clicking the noted link 
  7.   $('a#slick-show').click(function() {
  8.     $('#slickbox').show('slow');
  9.     return false;
  10.   });
  11.  
  12.  // hides the slickbox on clicking the noted link 
  13.   $('a#slick-hide').click(function() {
  14.     $('#slickbox').hide('fast');
  15.     return false;
  16.   });
  17.  
  18.  // toggles the slickbox on clicking the noted link 
  19.   $('a#slick-toggle').click(function() {
  20.     $('#slickbox').toggle(400);
  21.     return false;
  22.   });
  23.  
  24. });

Look closely at the code and you'll see that our slickbox will show at a slow speed, hide at a fast speed, and toggle somewhere in between (in 400 milliseconds).

Demo 1

Try it out for yourself. Just click on the three following links:

Show the box  Hide the box  Toggle the box

This is the box that will be shown and hidden and toggled at your whim. :)

Newbie Tip

For those of you brand new to JavaScript as well as jQuery, the lines of code that begin with two slashes ( // ) are comment lines that have no effect on the code whatsoever. You can also create multi-line comments by enclosing them in /* and */

Other Effects

Other simple jQuery effects for showing or hiding elements include:

  • slideUp()
  • slideDown()
  • slideToggle()
  • fadeIn()
  • fadeOut()

Demo 2

Try the slide effects to see how they differ from show/hide:
Slide the box down  Slide the box up  Slide toggle the box

Bonus

For more sophisticated effects, check out Stefan Petre's Interface plugin

UPDATE

If this type of showing and hiding isn't exactly what you're looking for, please check out my other entries and Jörn Zaefferer's accordion menu plugin:

Documentation now linked

Friday, September 8th, 2006

A new feature has been implemented; all jQuery code snippets we post will now be linked to the appropriate part of the documentation. So, for example, when we post:

JavaScript:
  1. $('div.foo').find('a').hide().end();

You can click on the function names "find," "hide" and "end" for more information on the functions. These definitions are culled from the same XML file that powers the official API documentation.

Basic Show and Hide

Wednesday, September 6th, 2006

As promised in my last entry, I'll be showing you a simple effect that you can do using jQuery: showing or hiding something, or a group of things, on the page. The two functions that let us do this are, not surprisingly, show() and hide().
jQuery also comes with another function called toggle(), which will make matching elements visible if they are hidden or hidden if they are visible.

So, let's get down to business. We're going to start with our $(document).ready() function.

JavaScript:
  1. $(document).ready(function() {
  2.   // we'll put our code here
  3. });

Next, we'll choose what we want to show or hide. Hmm, let's see. How about the site's title? Excellent! Now, whenever we refer to an element in jQuery, we start with the dollar sign, $, and we put any CSS or XPATH selector in parentheses right after it: $('css-selector')

Since the site's title is wrapped in an <h1> tag, we'll refer to it this way: $('h1'). We could just as easily refer to all DIVs with a class of "treacle" — $('div.treacle') — or any paragraph that is a chlid of a DIV with an ID of "bonespur" — $('#bonespur > p').

Now for the magic. To make the site's title disappear, we just connect $('h1') and hide() with a dot (.) and stick it all inside the $(document).ready() like so:

JavaScript:
  1. $(document).ready(function() {
  2.   $('h1').hide();
  3. });

The code above will make the site's title hide when the DOM / page loads, which isn't ideal for our purposes here, so I'm going to attach the the hide() event to the first button below instead. The second and third buttons will handle show() and toggle() respectively.

Just for kicks, we'll show and hide this sentence, which is wrapped in a div with class="showhide", too.

How did I attach the hiding and showing to those buttons? I'll show you that in my next entry.