<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jeff Gran &#187; jQuery</title>
	<atom:link href="http://jeffgran.com/tag/jquery/feed" rel="self" type="application/rss+xml" />
	<link>http://jeffgran.com</link>
	<description>Artist, Designer, Developer</description>
	<lastBuildDate>Wed, 09 Nov 2011 15:59:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Web Experiments #1: Ajax Convo</title>
		<link>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo</link>
		<comments>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo#comments</comments>
		<pubDate>Sat, 05 Sep 2009 03:02:05 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Web Experiments]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=239</guid>
		<description><![CDATA[1) I&#8217;m learning object-oriented design, design patterns, object-oriented PHP, and object-oriented JavaScript right now. I wanted to do some experimenting with building systems using these concepts, so I came up with the idea of doing a series of &#8220;Web Experiments&#8221; where I take an idea for some kind of web application and make a demo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-243 alignleft" title="ac" src="http://jeffgran.com/img/ac.jpg" alt="Ajax Convo" width="200" height="200" /></p>
<p>1) I&#8217;m learning object-oriented design, design patterns, object-oriented PHP, and object-oriented JavaScript right now.  I wanted to do some experimenting with building systems using these concepts, so I came up with the idea of doing a series of &#8220;Web Experiments&#8221; where I take an idea for some kind of web application and make a demo of it, for fun and learning.</p>
<p>2) I think ajax is the future of the web.  Somebody somewhere wrote &#8220;full page refreshes are so last year&#8221;, or something to that effect.  I sometimes find myself clicking a link or a tab somewhere out there on the web, mentally crossing my fingers in hopes that it won&#8217;t send me to a new page.  I think more and more people are going to expect slicker interfaces in web sites and web applications, and ajax is the way to get that accomplished.</p>
<p>3) I really like the comment/reply interface on Facebook.  There&#8217;s a series of boxes, each with a comment, and the last box is minimized and says &#8220;Write a comment&#8230;&#8221;.  When you click on it, it expands to look exactly like the other comments, with your picture there, just like it will look once it&#8217;s posted.  You type your brilliant quip, and when you click the button, the comment &#8220;melts&#8221; right into the page, and the next would-be comment appears below..  I think it&#8217;s lovely.</p>
<p>With these three things in mind, I started building my own little &#8220;comment thread&#8221; app. </p>
<p>Features:</p>
<ul>
<li>Add, edit, and remove comments from the &#8220;thread&#8221;.</li>
<li>No page refreshes &#8211; all done with ajax (jQuery)</li>
<li>Comments are stored in a tab-separated text file.</li>
<li>Shift-enter for a line break within a comment.</li>
</ul>
<p>I&#8217;ve also built a class structure that I believe will help me expand the project going forward.  The planned additions/expansions are:</p>
<ul>
<li>MySQL Database support (will be able to switch between text file and MySQL with a single setting)</li>
<li>Rewrite the JavaScript without using jQuery just for fun and practice, and to prove that I can.</li>
<li>Multiple &#8220;threads&#8221; of comments</li>
<li>Only load the latest 10 comments or so, and load more twitter-style.</li>
<li>More to each message, like time/date of post, &#8220;last edited at&#8230;&#8221;, etc.</li>
<li>Maybe a simple user system. I loathe to make people &#8220;sign up&#8221; for things though.</li>
</ul>
<p>If you&#8217;re interested, you can download the files <a title="Ajax Convo Zip File" href="http://jeffgran.com/stuff/ac.zip">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/239/blog/web-experiments-1-ajax-convo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: Tabbed Sidebar Widgets with jQuery</title>
		<link>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery</link>
		<comments>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery#comments</comments>
		<pubDate>Wed, 01 Jul 2009 22:33:13 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=180</guid>
		<description><![CDATA[Tabs are a great way to show more information in less space, assuming the initially-hidden tabs are non-essential information.  Recently a client asked me to put a few Wordpress widgets into a single tabbed container in the sidebar.  Here's how I did it.]]></description>
			<content:encoded><![CDATA[<p>Tabs are a great way to show more information in less space, assuming the initially-hidden tabs are non-essential information.  Recently a client asked me to put a few WordPress widgets into a single tabbed container in the sidebar.  Here&#8217;s how I did it.</p>
<h3>The Problem</h3>
<p>There&#8217;s no reason to re-invent the wheel, and there are already several tabs implementations written as jQuery plugins, including the <a title="jQuery UI Tabs" href="http://jqueryui.com/demos/tabs/">jQuery UI tabs widget</a>. The problem with these is that most (if not all) of them require the markup to be set up in a different way than we have available with our WordPress-outputted sidebar markup.</p>
<p>To illustrate, WordPress by default outputs the sidebar with markup that is structured something like this:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="html4strict" style="color: #ccc;"><span style="color: #009900;">&lt;<span style="color: #ffff00;">div</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-1&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #ffff00;">ul</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-list&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-1&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-1&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">h2</span>&gt;</span>Widget 1 Title<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">h2</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content...<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-2&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-2&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">h2</span>&gt;</span>Widget 2 Title<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">h2</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content2...<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">div</span>&gt;</span></pre></td></tr></table></div>

<p>The various jQuery tabs plugins all require the markup to be strutured like this (notice the titles moved to the additional list at the top, with anchor tags corresponding to the ids of the respective widgets:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="html4strict" style="color: #ccc;"><span style="color: #009900;">&lt;<span style="color: #ffff00;">div</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-1&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #ffff00;">ul</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span>&gt;&lt;<span style="color: #ffff00;">a</span> <span style="color: cyan;">href</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;#widget-1&quot;</span>&gt;</span>Widget 1 Title<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">a</span>&gt;&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span>&gt;&lt;<span style="color: #ffff00;">a</span> <span style="color: cyan;">href</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;#widget-2&quot;</span>&gt;</span>Widget 2 Title<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">a</span>&gt;&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #ffff00;">ul</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;sidebar-list&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-1&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-1&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content...<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #ffff00;">li</span> <span style="color: cyan;">id</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget-2&quot;</span> <span style="color: cyan;">class</span><span style="color: grey;">=</span><span style="color: #ff8080;">&quot;widget widget-class-2&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #ffff00;">p</span>&gt;</span>...content2...<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">p</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">li</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">ul</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: grey;">/</span><span style="color: #ffff00;">div</span>&gt;</span></pre></td></tr></table></div>

<h3>The Solution</h3>
<p>While it would be possible to alter the PHP code to output the list above the widgets (although, I looked into this solution and was not able to find a hook that would allow it without altering the core), we can just use some custom jQuery to dynamically add the list before invoking the tabs plugin.  This method also has the advantage that it makes our tabs more unobtrusive.  If javascript is disabled, the page will look exactly as it would with the standard sidebar widgets, but if javascript is available, we&#8217;ll fix the markup and add the tabs all at once with our jQuery code.</p>
<h3>The Code</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="javascript" style="color: #ccc;">$<span style="color: grey;">&#40;</span>document<span style="color: grey;">&#41;</span>.<span style="color: magenta;">ready</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
   <span style="color: #80ff80">// first, we select the sidebar</span>
   $<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'#sidebar-1 .sidebar-list'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">each</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
      <span style="color: #80ff80">// each child of the sidebar element will be a widget, and will become a tab</span>
      <span style="color: #ffff00;">var</span> widgets <span style="color: grey;">=</span> $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">// we'll build the list of titles, starting with the opening tag</span>
      <span style="color: #ffff00;">var</span> titleList <span style="color: grey;">=</span> <span style="color: #ff8080;">'&lt;ul&gt;'</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">//for each widget in the sidebar:</span>
      widgets.<span style="color: magenta;">each</span><span style="color: grey;">&#40;</span><span style="color: #ffff00;">function</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span> <span style="color: grey;">&#123;</span>
&nbsp;
         <span style="color: #80ff80">// save the title of the widget</span>
         <span style="color: #ffff00;">var</span> widgetTitle <span style="color: grey;">=</span> $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'h2'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">text</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
         <span style="color: #80ff80">// then hide it since it will be displayed in the tab</span>
         $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">children</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'h2'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">hide</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
         <span style="color: #80ff80">// create a new list item for the tab, linking to this widget's id</span>
         <span style="color: #ffff00;">var</span> listItem <span style="color: grey;">=</span> <span style="color: #ff8080;">'&lt;li&gt;&lt;a href=&quot;#'</span><span style="color: grey;">+</span>$<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">attr</span><span style="color: grey;">&#40;</span><span style="color: #ff8080;">'id'</span><span style="color: grey;">&#41;</span><span style="color: grey;">+</span><span style="color: #ff8080;">'&quot;&gt;'</span><span style="color: grey;">+</span>widgetTitle<span style="color: grey;">+</span><span style="color: #ff8080;">'&lt;/a&gt;&lt;/li&gt;'</span><span style="color: grey;">;</span>
         <span style="color: #80ff80">// add the list item to the list we're building</span>
         titleList <span style="color: grey;">+=</span> listItem<span style="color: grey;">;</span>
      <span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
      <span style="color: #80ff80">// close the list now that we're done going through each widget</span>
      titleList <span style="color: grey;">+=</span> <span style="color: #ff8080;">'&lt;/ul&gt;'</span><span style="color: grey;">;</span>
&nbsp;
      <span style="color: #80ff80">// add the title list to the beginning of the sidebar</span>
      $<span style="color: grey;">&#40;</span><span style="color: #4080ff;">this</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">before</span><span style="color: grey;">&#40;</span>titleList<span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
   <span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
&nbsp;
   <span style="color: #80ff80">// apply the tabs plugin</span>
   $<span style="color: grey;">&#40;</span><span style="color: #ff8080;">'#sidebar-1'</span><span style="color: grey;">&#41;</span>.<span style="color: magenta;">tabs</span><span style="color: grey;">&#40;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span>
<span style="color: grey;">&#125;</span><span style="color: grey;">&#41;</span><span style="color: grey;">;</span></pre></td></tr></table></div>

<h3>Explanation</h3>
<p>The comments in the code should make the solution pretty self-explanatory.  This will take all the widgets in the selected sidebar and create tabs for them.</p>
<p>There are some things you&#8217;ll have to be careful about if you use this code.  First, you&#8217;ll have to change the selection for the sidebar div (line 3 above, as well as in the second-to-last line) to match yours.  This assumes you <em>have</em> your sidebar list wrapped in a div (required by the tabs plugin), so if you don&#8217;t, you will need to add that, either in the theme itself or with jQuery( using .wrap() ). Also, in the two places you see &#8216;h2&#8242;, this is assuming that the titles of the widgets are in &lt;h2&gt; tags.  You may need to select a different tag if your theme displays the widget titles differently.</p>
<p>Also note that this will create tabs for <em>all</em> the widgets in the sidebar.  Making it only apply to specific widgets is possible, but a bit more complicated.  Luckily, with WordPress 2.8, the sidebars/widgets interface is much improved.  One solution would be to create multiple &#8216;sidebars&#8217; that stacked on top of each other in the sidebar area of your theme, and apply the above tab-ifying code to one or more of them individually.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/180/blog/wordpress-tabbed-sidebar-widgets-with-jquery/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Book Review: Javascript: The Missing Manual</title>
		<link>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual</link>
		<comments>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual#comments</comments>
		<pubDate>Sat, 13 Jun 2009 01:30:57 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=161</guid>
		<description><![CDATA[In my ongoing efforts to realize my dreams of becoming a true web ninja, I recently read Javascript: The Missing Manual by David Sawyer MacFarland.  I had read his previous book in the Missing Manuals series on CSS, and had both enjoyed it and learned a lot from it. I did find this book interesting [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-166" title="js_mm_cover" src="http://jeffgran.com/img/js_mm_cover.png" alt="js_mm_cover" width="145" height="190" />In my ongoing efforts to realize my dreams of becoming a true web ninja, I recently read <a title="Javascript: The Missing Manual" href="http://www.amazon.com/gp/product/0596515898"><em>Javascript: The Missing Manual</em></a> by <a title="David Sawyer MacFarland" href="http://www.sawmac.com">David Sawyer MacFarland</a>.  I had read his previous book in the Missing Manuals series on CSS, and had both enjoyed it and learned a lot from it.</p>
<p>I did find this book interesting and informative as well, but I say that with caveats, which I&#8217;ll explain.</p>
<p>First, I&#8217;m not sure that I was exactly the intended audience for the book.  I am pretty well-versed in programming concepts in general, and what I was looking for was an introduction to the language of javascript and when and how to use it effectively in my web sites.  In contrast, this book seemed to be geared a little more towards pure designers who are scared of programming. A few times during my reading I had to roll my eyes at another &#8220;If this is making your head hurt, just type it in and know that it works.&#8221;  Personally, I want to know how everything works and I&#8217;m not interested in blindly typing in code to &#8220;make it work.&#8221;  I can do that by searching google and cutting and pasting.  I bought a book because I wanted to get deep, to learn the ins and outs of how it all works behind the scenes.  I wanted a book because I&#8217;m on my way to becoming a full-on pro, and this book at times seemed more geared towards hobbyists, or designers who just wanted to dip their toes into javascript.</p>
<p>Second, this is really a book on jQuery.  I don&#8217;t have a problem with that, but it needs to be said.  The first section of the book goes over the syntax of plain old javascript, including function declarations, string manipulation with built-in functions and regular expressions, math functions and operators, variable typing, etc.  Then the author quickly moves on to the use of libraries to speed development, and specifically to jQuery.  I&#8217;ll say here that I have very ambiguous feelings regarding the need to learn the &#8220;hard way&#8221; of doing things when using a library to do it for you will normally suffice.  That&#8217;s a debate in itself, and I don&#8217;t want to get into all the pros and cons, but again, it should be said that you won&#8217;t be learning the traditional way of working with the DOM here, you&#8217;ll be learning to use jQuery selectors.</p>
<p>Now for the good parts.  Like the CSS book in the series, I found the information to be explained in a very readable and understandable tone.  The book is well-paced &#8212; several times I would have an &#8220;aha &#8211; that&#8217;s cool how that works!&#8221; moment, followed by a &#8220;but wait, what if you wanted to do it this way?&#8221;, and without fail the next paragraph would address my question.  Sometimes it would answer right there, and sometimes it would say &#8220;we&#8217;ll show you how to do this with more flexibility in the next section&#8230;&#8221; so I&#8217;d know it was coming.  This ability to anticipate the reader&#8217;s thinking is probably the best part of these books.</p>
<p>Also, the tutorials were again very helpful and well laid-out.  Another thing I&#8217;d like to point out is that the tutorials are not just re-hashes of the information in the preceding chapter.  There is additional learning value in the tutorials that build on what you learn by reading the chapter.  So you get the explanations of how things are designed to work, and then you get to play with a real-world example and the book shows you how to solve the additional problems that inevitably come up.  Code examples are thoroughly explained (sometimes too thoroughly &#8212; I found myself skipping sections saying to myself, &#8220;yeah, I get it already&#8221; &#8212; but that&#8217;s definitely better than the opposite).</p>
<p>After going through all the basic functionality of jQuery itself, the book unfortunately devolves into several chapters showing how to use specific jQuery plugins for specific purposes: image gallery, slideshow, tabs, etc.  While these are certainly useful, no additional concepts or ideas were presented, just lists of the specific variables and possible values for customizing the plugins.  This part of the book seemed like fluff to me and could have been condensed into a few short pages of charts.  It&#8217;s not that the information wasn&#8217;t useful, just that after learning so many interesting and, to me, revolutionary concepts, reading paragraphs about using &#8220;slow&#8221; if you want it to move slow, and &#8220;fast&#8221; if you want it to move fast seemed like a step backwards.</p>
<p>The last section of the book is dedicated to AJAX.  Here the quality of information improves again, but again with caveats.  You won&#8217;t learn the details of setting up the XMLHTTPRequest object, but you&#8217;ll learn what is and then how jQuery saves you the trouble of knowing.</p>
<p>In one way this final section about AJAX serves as a microcosm to the whole book.  It&#8217;s a great introduction, it gets you familiar with the general concepts and shows you how to get started right away, but it left me hungry for more, deeper knowledge.  And perhaps that&#8217;s the way it should be.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/161/blog/book-review-javascript-the-missing-manual/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Javascript vs. jQuery vs. the DOM</title>
		<link>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom</link>
		<comments>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom#comments</comments>
		<pubDate>Wed, 03 Jun 2009 23:28:40 +0000</pubDate>
		<dc:creator>Jeff Gran</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jeffgran.com/?p=156</guid>
		<description><![CDATA[When I first started learning about Javascript, it took me a little while before I could wrap my head around the distinctions and relationships between Javascript, jQuery and the DOM.  So I thought I would lay out what I've learned so that it might help someone where I was.]]></description>
			<content:encoded><![CDATA[<p>When I first started learning about Javascript, it took me a little while before I could wrap my head around the distinctions and relationships between Javascript, jQuery and the DOM.  So I thought I would lay out what I&#8217;ve learned so that it might help someone where I was.</p>
<h3>Javascript</h3>
<p>Javascript is a programming language.  It comes standard with most modern web browsers.  It is also the same language that is used in Flash (where it&#8217;s called ActionScript), and can be used to write scripts in Photoshop, Illustrator, etc.  In the context of a web browser, it is often used to manipulate the DOM (see below).</p>
<h3>jQuery</h3>
<p>jQuery is a Javascript library, meaning that it is essentially a collection of functions written in Javascript that can be used to make the programmer&#8217;s job easier.  Common tasks that take more lines of code with traditional Javascript can be executed with calls to the jQuery functions.  There are several other Javascript libraries out there that fill the same need.  For one reason or another, jQuery seems to be the most popular library of the day.</p>
<h3>The DOM</h3>
<p>The Document Object Model (DOM), is just that &#8211; a model for representing and interacting with an XML, XHTML, or HTML document.  Our HTML documents are created by typing tags in plain text, and the DOM is a way to access the tags and the structure of the &#8220;tag tree&#8221;.  For example, instead of using regular expressions to find the text that represents a tag with a specific ID attribute, we can ask the DOM which of its tags has that ID.  Javascript is not part of the DOM or vice-versa, but Javascript in the browser does include some intelligence about the DOM &#8211; for example, the getElementById() function.  One of the main advantages of jQuery is the extra intelligence it has regarding the DOM.  With it, you access and create DOM elements (tags) by using the many selectors and traversing operations it offers.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeffgran.com/156/blog/javascript-jquery-vs-the-dom/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

