<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Dev411 Blog: Category ajax</title>
  <subtitle type="html">John Wang on Technology</subtitle>
  <id>tag:www.dev411.com,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  <link href="http://www.dev411.com/blog/xml/atom/category/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="http://www.dev411.com/blog/tag/ajax" rel="alternate" type="text/html"/>
  <updated>2007-06-16T12:30:23-05:00</updated>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:5e313631b8ed2a057be9cc4d29997c60</id>
    <published>2006-07-28T12:14:00-05:00</published>
    <updated>2007-06-16T12:30:23-05:00</updated>
    <title type="html">Online Dojo JavaScript Compressor</title>
    <link href="http://www.dev411.com/blog/2006/07/28/online-dojo-javascript-compressor" rel="alternate" type="text/html"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <category term="scriptaculous" scheme="http://www.dev411.com/blog/tag/scriptaculous" label="scriptaculous"/>
    <category term="prototype" scheme="http://www.dev411.com/blog/tag/prototype" label="prototype"/>
    <summary type="html">&lt;p&gt;I just put together an &lt;a href="/dojo/javascript_compressor"&gt;online JavaScript Compressor&lt;/a&gt; interface to &lt;a href="http://dojotoolkit.org/docs/compressor_system.html"&gt;Dojo Toolkit's JavaScript Compressor&lt;/a&gt;, &lt;span class="fix"&gt;custom_rhino.jar&lt;/span&gt;. The JavaScript Compressor is used in the final stage of the Dojo Toolkit build process so gets a lot of use. Although there is already an online version, &lt;a href="http://alex.dojotoolkit.org/shrinksafe/"&gt;ShrinkSafe&lt;/a&gt;, I put another version together because:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;It would be nice to have a web app that makes custom Dojo builds people don't have to install the JDK and ant to get a custom Dojo build. This is the primary reason and the compressor is a first step in that direction.&lt;/li&gt;
	&lt;li&gt;There have been &lt;a href="http://www.huddletogether.com/forum/comments.php?DiscussionID=160"&gt;some reports&lt;/a&gt; that the JS produced by ShrinkSafe doesn't work (maybe it's using an outdated &lt;span class="fix"&gt;custom_rhino.jar&lt;/span&gt;?). I want an Dojo-based online system to use myself.&lt;/li&gt;
	&lt;li&gt;It's nice to have more Dojo, Prototype and Scriptaculous integration tests. I used the client code from ShrinkSafe which uses Dojo to add additional file and do Drag-and-Drop along with the Lucid theme which relies on Prototype and Scriptaculous. I learned that &lt;span class="fix"&gt;dojo.js&lt;/span&gt; 0.3.1 needs to be loaded before &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; 1.6.1 or Scriptaculous will break Dojo (I updated the &lt;a href="http://www.dev411.com/blog/2006/06/13/dojo-and-prototype-together"&gt;Dojo and Prototype Together&lt;/a&gt; article). My minimal use of the Lucid theme actually doesn't need &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; so I can get away with loading just &lt;span class="fix"&gt;dojo.js&lt;/span&gt; 0.3.1, &lt;span class="fix"&gt;prototype.js&lt;/span&gt; 1.5.0 rc0, &lt;span class="fix"&gt;effects.js&lt;/span&gt; (part of Scriptaculous 1.6.1) and &lt;span class="fix"&gt;lucid.js&lt;/span&gt;. &lt;span class="fix"&gt;lucid.js&lt;/span&gt; is part of the Lucid theme.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The JavaScript compressor eats its own dogfood and uses &lt;span class="fix"&gt;prototype.js&lt;/span&gt;, &lt;span class="fix"&gt;effects.js&lt;/span&gt; and &lt;span class="fix"&gt;lucid.js&lt;/span&gt; compressed into a single-line, single file. Here are the compression sizes and ratios for the files. Generally you save about 30%.&lt;/p&gt;

&lt;table id="article_jscompress"&gt;
&lt;tr&gt;
	&lt;th&gt;script&lt;/th&gt;
	&lt;th&gt;uncompressed&lt;/th&gt;
	&lt;th&gt;compressed&lt;br /&gt;multiline&lt;/th&gt;
	&lt;th&gt;ratio&lt;/th&gt;
	&lt;th&gt;compressed&lt;br /&gt;single line&lt;/th&gt;
	&lt;th&gt;ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;prototype.js&lt;/td&gt;
	&lt;td&gt;55,149&lt;/td&gt;
	&lt;td&gt;38,696&lt;/td&gt;
	&lt;td&gt;70%&lt;/td&gt;
	&lt;td&gt;37,154&lt;/td&gt;
	&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;effects.js&lt;/td&gt;
	&lt;td&gt;32,908&lt;/td&gt;
	&lt;td&gt;23,244&lt;/td&gt;
	&lt;td&gt;71%&lt;/td&gt;
	&lt;td&gt;22,527&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;lucid.js&lt;/td&gt;
	&lt;td&gt;7,253&lt;/td&gt;
	&lt;td&gt;4,917&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
	&lt;td&gt;4,741&lt;/td&gt;
	&lt;td&gt;65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;All files&lt;/td&gt;
	&lt;td&gt;95,310&lt;/td&gt;
	&lt;td&gt;67,570&lt;/td&gt;
	&lt;td&gt;71%&lt;/td&gt;
	&lt;td&gt;65,137&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;A number of people are using &lt;a href="http://www.javascriptcompressor.com"&gt;JavaScriptCompressor.com&lt;/a&gt; which is running &lt;a href="http://dean.edwards.name/download/#packer"&gt;Dean Edwards' .NET JavaScript compression code&lt;/a&gt;. This can be used after Dojo's compressor for even more compression.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I just put together an &lt;a href="/dojo/javascript_compressor"&gt;online JavaScript Compressor&lt;/a&gt; interface to &lt;a href="http://dojotoolkit.org/docs/compressor_system.html"&gt;Dojo Toolkit's JavaScript Compressor&lt;/a&gt;, &lt;span class="fix"&gt;custom_rhino.jar&lt;/span&gt;. The JavaScript Compressor is used in the final stage of the Dojo Toolkit build process so gets a lot of use. Although there is already an online version, &lt;a href="http://alex.dojotoolkit.org/shrinksafe/"&gt;ShrinkSafe&lt;/a&gt;, I put another version together because:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;It would be nice to have a web app that makes custom Dojo builds people don't have to install the JDK and ant to get a custom Dojo build. This is the primary reason and the compressor is a first step in that direction.&lt;/li&gt;
	&lt;li&gt;There have been &lt;a href="http://www.huddletogether.com/forum/comments.php?DiscussionID=160"&gt;some reports&lt;/a&gt; that the JS produced by ShrinkSafe doesn't work (maybe it's using an outdated &lt;span class="fix"&gt;custom_rhino.jar&lt;/span&gt;?). I want an Dojo-based online system to use myself.&lt;/li&gt;
	&lt;li&gt;It's nice to have more Dojo, Prototype and Scriptaculous integration tests. I used the client code from ShrinkSafe which uses Dojo to add additional file and do Drag-and-Drop along with the Lucid theme which relies on Prototype and Scriptaculous. I learned that &lt;span class="fix"&gt;dojo.js&lt;/span&gt; 0.3.1 needs to be loaded before &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; 1.6.1 or Scriptaculous will break Dojo (I updated the &lt;a href="http://www.dev411.com/blog/2006/06/13/dojo-and-prototype-together"&gt;Dojo and Prototype Together&lt;/a&gt; article). My minimal use of the Lucid theme actually doesn't need &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; so I can get away with loading just &lt;span class="fix"&gt;dojo.js&lt;/span&gt; 0.3.1, &lt;span class="fix"&gt;prototype.js&lt;/span&gt; 1.5.0 rc0, &lt;span class="fix"&gt;effects.js&lt;/span&gt; (part of Scriptaculous 1.6.1) and &lt;span class="fix"&gt;lucid.js&lt;/span&gt;. &lt;span class="fix"&gt;lucid.js&lt;/span&gt; is part of the Lucid theme.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The JavaScript compressor eats its own dogfood and uses &lt;span class="fix"&gt;prototype.js&lt;/span&gt;, &lt;span class="fix"&gt;effects.js&lt;/span&gt; and &lt;span class="fix"&gt;lucid.js&lt;/span&gt; compressed into a single-line, single file. Here are the compression sizes and ratios for the files. Generally you save about 30%.&lt;/p&gt;

&lt;table id="article_jscompress"&gt;
&lt;tr&gt;
	&lt;th&gt;script&lt;/th&gt;
	&lt;th&gt;uncompressed&lt;/th&gt;
	&lt;th&gt;compressed&lt;br /&gt;multiline&lt;/th&gt;
	&lt;th&gt;ratio&lt;/th&gt;
	&lt;th&gt;compressed&lt;br /&gt;single line&lt;/th&gt;
	&lt;th&gt;ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;prototype.js&lt;/td&gt;
	&lt;td&gt;55,149&lt;/td&gt;
	&lt;td&gt;38,696&lt;/td&gt;
	&lt;td&gt;70%&lt;/td&gt;
	&lt;td&gt;37,154&lt;/td&gt;
	&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;effects.js&lt;/td&gt;
	&lt;td&gt;32,908&lt;/td&gt;
	&lt;td&gt;23,244&lt;/td&gt;
	&lt;td&gt;71%&lt;/td&gt;
	&lt;td&gt;22,527&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;lucid.js&lt;/td&gt;
	&lt;td&gt;7,253&lt;/td&gt;
	&lt;td&gt;4,917&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
	&lt;td&gt;4,741&lt;/td&gt;
	&lt;td&gt;65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td&gt;All files&lt;/td&gt;
	&lt;td&gt;95,310&lt;/td&gt;
	&lt;td&gt;67,570&lt;/td&gt;
	&lt;td&gt;71%&lt;/td&gt;
	&lt;td&gt;65,137&lt;/td&gt;
	&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;A number of people are using &lt;a href="http://www.javascriptcompressor.com"&gt;JavaScriptCompressor.com&lt;/a&gt; which is running &lt;a href="http://dean.edwards.name/download/#packer"&gt;Dean Edwards' .NET JavaScript compression code&lt;/a&gt;. This can be used after Dojo's compressor for even more compression.&lt;/p&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:885f059fcc2a7604158abbca1b8b8be6</id>
    <published>2006-07-25T10:49:00-05:00</published>
    <updated>2007-06-16T12:30:23-05:00</updated>
    <title type="html">Catalyst - Customizing the view to stop IE from caching JSON</title>
    <link href="http://www.dev411.com/blog/2006/07/25/catalyst-customizing-the-view-stop-ie-from-caching-json" rel="alternate" type="text/html"/>
    <category term="json" scheme="http://www.dev411.com/blog/tag/json" label="json"/>
    <category term="catalyst" scheme="http://www.dev411.com/blog/tag/catalyst" label="catalyst"/>
    <category term="ie" scheme="http://www.dev411.com/blog/tag/ie" label="ie"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <summary type="html">&lt;p&gt;Often times you'll want to customize your response specific to the View being used, e.g. setting extra headers. This can be done directly in your View class by creating a &lt;span class="fix"&gt;process&lt;/span&gt; method. All View base classes have a process method defined in &lt;span class="fix"&gt;Catalyst::View&lt;/span&gt; that gets called at rendering time. By adding a &lt;span class="fix"&gt;process&lt;/span&gt; method in your subclass and redispatching to the parent you can do some preliminary processing.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Often times you'll want to customize your response specific to the View being used, e.g. setting extra headers. This can be done directly in your View class by creating a &lt;span class="fix"&gt;process&lt;/span&gt; method. All View base classes have a process method defined in &lt;span class="fix"&gt;Catalyst::View&lt;/span&gt; that gets called at rendering time. By adding a &lt;span class="fix"&gt;process&lt;/span&gt; method in your subclass and redispatching to the parent you can do some preliminary processing.&lt;/p&gt;

&lt;p&gt;One use is preventing IE from caching JSON responses by setting the Cache-Control and Pragma HTTP response headers. You can do this in the 
application's JSON view as follows:&lt;/p&gt;

&lt;pre&gt;package MyApp::View::JSON;
use strict; use warnings;
use base qw/Catalyst::View::JSON/;

sub process {
  my $self = shift;
  my $c = $_[0];
  $c-&gt;res-&gt;header( 'Cache-Control' =&gt;
    'no-store, no-cache, must-revalidate,'.
    'post-check=0, pre-check=0, max-age=0'
  );
  $c-&gt;res-&gt;header( 'Pragma' =&gt; 'no-cache' );
  $c-&gt;res-&gt;header( 'Expires' =&gt; 'Thu, 01 Jan 1970 00:00:00 GMT' );
  $self-&gt;NEXT::process(@_);
}

1;&lt;/pre&gt;

&lt;p&gt;Your &lt;span class="fix"&gt;process&lt;/span&gt; method will get called, set it's response headers and then use &lt;a href="http://search.cpan.org/~dconway/NEXT-0.60/lib/NEXT.pm" class="fix"&gt;NEXT&lt;/a&gt; to call C::V::JSON's &lt;span class="fix"&gt;process&lt;/span&gt; method.&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:d0a32f2b7c403b46ce07f6dcd8a0d7de</id>
    <published>2006-07-25T03:12:00-05:00</published>
    <updated>2007-11-09T02:09:08-06:00</updated>
    <title type="html">Yahoo! UI (YUI) cheat sheets as wallpaper</title>
    <link href="http://www.dev411.com/blog/2006/07/25/yahoo-ui-yui-cheat-sheets-as-wallpaper" rel="alternate" type="text/html"/>
    <category term="yui" scheme="http://www.dev411.com/blog/tag/yui" label="yui"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <summary type="html">&lt;p&gt;Yahoo! provides a number of &lt;a href="http://developer.yahoo.com/yui/#cheatsheets"&gt;cheat sheets for their YUI library widgets&lt;/a&gt; however these are in PDF format and not usable as wallpaper. PDF is great as a transport format because you can provide one version for everyone, however transforming it makes it more appealing for actual use. I prefer cheat sheets in standard image formats that can used as wallpaper, espcially useful with virtual desktops.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/images/articles/200607/yui-cheat-sheets-0.10.gif" alt="Yahoo UI! Cheat Sheets" /&gt;&lt;/div&gt;

&lt;p&gt;Here are the YUI 0.11 cheat sheets converted to PNG images of various sizes. Let me know if any other sizes would be useful.&lt;/p&gt;

&lt;div id="yuicheatsheets"&gt;
&lt;table&gt;&lt;tr&gt;
&lt;th&gt;Animation&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Calendar&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Connection Manager&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Dom Collection&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Drag &amp;amp; Drop&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Event Utility &amp;amp; Custom Event&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Logger&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Slider&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;TreeView&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;</summary>
    <content type="html">&lt;p&gt;Yahoo! provides a number of &lt;a href="http://developer.yahoo.com/yui/#cheatsheets"&gt;cheat sheets for their YUI library widgets&lt;/a&gt; however these are in PDF format and not usable as wallpaper. PDF is great as a transport format because you can provide one version for everyone, however transforming it makes it more appealing for actual use. I prefer cheat sheets in standard image formats that can used as wallpaper, espcially useful with virtual desktops.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/images/articles/200607/yui-cheat-sheets-0.10.gif" alt="Yahoo UI! Cheat Sheets" /&gt;&lt;/div&gt;

&lt;p&gt;Here are the YUI 0.11 cheat sheets converted to PNG images of various sizes. Let me know if any other sizes would be useful.&lt;/p&gt;

&lt;div id="yuicheatsheets"&gt;
&lt;table&gt;&lt;tr&gt;
&lt;th&gt;Animation&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Animation_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Calendar&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Calendar_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Connection Manager&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Connection_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Dom Collection&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Dom_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Drag &amp;amp; Drop&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Drag-and-Drop_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Event Utility &amp;amp; Custom Event&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Event_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Logger&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Logger_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;Slider&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_Slider_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;th&gt;TreeView&lt;/th&gt;
&lt;td&gt;&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1400x1050.png"&gt;1400x1050&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1280x960.png"&gt;1280x960&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1165x900.png"&gt;1165x900&lt;/a&gt;
&lt;a href="/cheatsheets/sheets/YUI_TreeView_0.11_1024x768.png"&gt;1024x768&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:310f8f2393192a4bf6885b036d510d30</id>
    <published>2006-07-24T20:40:00-05:00</published>
    <updated>2007-06-16T12:30:23-05:00</updated>
    <title type="html">JSON XSS exploit: don't use text/html</title>
    <link href="http://www.dev411.com/blog/2006/07/24/json-xss-exploit-dont-use-text-html" rel="alternate" type="text/html"/>
    <category term="json" scheme="http://www.dev411.com/blog/tag/json" label="json"/>
    <category term="catalyst" scheme="http://www.dev411.com/blog/tag/catalyst" label="catalyst"/>
    <category term="xss" scheme="http://www.dev411.com/blog/tag/xss" label="xss"/>
    <category term="security" scheme="http://www.dev411.com/blog/tag/security" label="security"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <summary type="html">&lt;p&gt;&lt;a href="http://jibbering.com/blog/?p=514"&gt;Jim Ley reports&lt;/a&gt; on the &lt;a href="http://ha.ckers.org/blog/20060704/cross-site-scripting-vulnerability-in-google/"&gt;Google JSON XSS exploit&lt;/a&gt; with example code and screen shots of stealing information from the AdSense site. The moral of the story is don't use &lt;span class="fix"&gt;text/html&lt;/span&gt; for the MIME type when returning JSON, use &lt;span class="fix"&gt;application/json&lt;/span&gt; which is an &lt;a href="http://www.rfc-editor.org/rfc/rfc4627.txt"&gt;IETF standard (RFC 4627)&lt;/a&gt; now. Most browsers should handle &lt;span class="fix"&gt;application/json&lt;/span&gt; fine, however Opera may have problems and you may want to use &lt;span class="fix"&gt;application/x-javascript&lt;/span&gt; for that. Something to remember even if your AJAX code/library doesn't care about the MIME type returned by the server, e.g. Dojo.&lt;/p&gt;

&lt;p&gt;If you are using Catalyst and Catalyst::View::JSON, your JSON response will automatically be set to &lt;span class="fix"&gt;application/json&lt;/span&gt; for all user agents except Opera (which gets &lt;span class="fix"&gt;application/x-javascript&lt;/span&gt;) so you're already safe(r).&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;&lt;a href="http://jibbering.com/blog/?p=514"&gt;Jim Ley reports&lt;/a&gt; on the &lt;a href="http://ha.ckers.org/blog/20060704/cross-site-scripting-vulnerability-in-google/"&gt;Google JSON XSS exploit&lt;/a&gt; with example code and screen shots of stealing information from the AdSense site. The moral of the story is don't use &lt;span class="fix"&gt;text/html&lt;/span&gt; for the MIME type when returning JSON, use &lt;span class="fix"&gt;application/json&lt;/span&gt; which is an &lt;a href="http://www.rfc-editor.org/rfc/rfc4627.txt"&gt;IETF standard (RFC 4627)&lt;/a&gt; now. Most browsers should handle &lt;span class="fix"&gt;application/json&lt;/span&gt; fine, however Opera may have problems and you may want to use &lt;span class="fix"&gt;application/x-javascript&lt;/span&gt; for that. Something to remember even if your AJAX code/library doesn't care about the MIME type returned by the server, e.g. Dojo.&lt;/p&gt;

&lt;p&gt;If you are using Catalyst and Catalyst::View::JSON, your JSON response will automatically be set to &lt;span class="fix"&gt;application/json&lt;/span&gt; for all user agents except Opera (which gets &lt;span class="fix"&gt;application/x-javascript&lt;/span&gt;) so you're already safe(r).&lt;/p&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:4affdc8fb3cb2fc9e8b14d8a6252ebe3</id>
    <published>2006-07-20T17:22:00-05:00</published>
    <updated>2007-06-16T12:30:23-05:00</updated>
    <title type="html">Prototype's future in Rails</title>
    <link href="http://www.dev411.com/blog/2006/07/20/prototypes-future-in-rails" rel="alternate" type="text/html"/>
    <category term="rails" scheme="http://www.dev411.com/blog/tag/rails" label="rails"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <category term="scriptaculous" scheme="http://www.dev411.com/blog/tag/scriptaculous" label="scriptaculous"/>
    <category term="prototype" scheme="http://www.dev411.com/blog/tag/prototype" label="prototype"/>
    <summary type="html">&lt;p&gt;The future of Prototype (the JavaScript AJAX library), both as a stand-alone library and as a part of Rails, is being discussed by the community on the &lt;span class="fix"&gt;rails-spinoffs&lt;/span&gt; list. The primary concerns appear to be:&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;The future of Prototype (the JavaScript AJAX library), both as a stand-alone library and as a part of Rails, is being discussed by the community on the &lt;span class="fix"&gt;rails-spinoffs&lt;/span&gt; list. The primary concerns appear to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototype is driven by one person who hasn't been very active on the list. Some patches are integrated but often without communication&lt;/li&gt;
&lt;li&gt;it is difficult for others to contribute&lt;/li&gt;
&lt;li&gt;there is no visibility into the roadmap for prototype&lt;/li&gt;
&lt;li&gt;prototype is "falling behind" relative to other libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one person vs. community aspect of the discussion reminds me of Red Hat rebuilds. When Red Hat stopped distributing free binaries, a number of projects took advantage of GPL and started providing free rebuild binaries. At first, &lt;a href="http://www.whiteboxlinux.org/"&gt;White Box Enterprise Linux (WBEL)&lt;/a&gt; was the most popular and wide-spread rebuild but it was maintained by one person who occasionally got busy. It was eventually overtaken by &lt;a href="http://www.centos.org"&gt;CentOS&lt;/a&gt; which is maintained by a community.&lt;/p&gt;

&lt;p&gt;For now, Prototype will remain popular because it comes bundled with Rails and is the basis for RJS and Scriptaculous. Thomas Fuchs has come out and said, "script.aculo.us will always depend on Prototype". Still, I wonder if community maintenance isn't a better way to go for something that's relied on by so many people. Some are even concerned that Rails itself will become less viable if it continues to attach itself to Prototype and the project management doesn't change.&lt;/p&gt;

&lt;p&gt;You can follow the thread by going to the list &lt;a href="http://wrath.rubyonrails.org/pipermail/rails-spinoffs/2006-July/thread.html"&gt;archives page&lt;/a&gt; and looking for the subject name "Documenting Prototype...". &lt;a href="http://wrath.rubyonrails.org/pipermail/rails-spinoffs/2006-July/005139.html"&gt;Greg Hill's post&lt;/a&gt; seems like a reasonable place to start.&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:6cd5c46165d0c7e0eb3ef4a70efb0344</id>
    <published>2006-07-17T23:15:00-05:00</published>
    <updated>2007-11-09T02:09:53-06:00</updated>
    <title type="html">Autocomplete Survey</title>
    <link href="http://www.dev411.com/blog/2006/07/17/autocomplete-survey" rel="alternate" type="text/html"/>
    <category term="yui" scheme="http://www.dev411.com/blog/tag/yui" label="yui"/>
    <category term="jquery" scheme="http://www.dev411.com/blog/tag/jquery" label="jquery"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="google" scheme="http://www.dev411.com/blog/tag/google" label="google"/>
    <category term="autocomplete" scheme="http://www.dev411.com/blog/tag/autocomplete" label="autocomplete"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <category term="scriptaculous" scheme="http://www.dev411.com/blog/tag/scriptaculous" label="scriptaculous"/>
    <summary type="html">&lt;p&gt;Here are some screen shots of various autocomplete effects in action to show what people are doing. The images and names above the images have links to the relevant sites with the domain name shown. I'll add more screen shots here as I get them. Let me know if there are any other toolkits demos or interesting implementations.&lt;/p&gt;

&lt;p&gt;Here are some observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All of the screen shots and links are for toolkits except for Google which is just shown as an example.&lt;/li&gt;
&lt;li&gt;The jQuery and Scriptaculous demos do not automatically display "autocomplete" text in the input element.&lt;/li&gt;
&lt;li&gt;All of the demos, except Dojo, include text that will end up in the input field as well as extra display text that will not.&lt;/li&gt;
&lt;li&gt;Where both simple and customized demos are available, the customized one is used for the screen shot.&lt;/li&gt;
&lt;li&gt;Del.icio.us also has nice variable horizontal location/width autocomplete for tags that I don't have a screen shot for atm. Gmail also has a nice autocomplete that isn't shown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The observations are just for the particular demos available. The libraries may have the ability to be configured in additional ways.&lt;/p&gt;

&lt;div id="article_ac" style="text-align:center"&gt;
&lt;table class="article_ac"&gt;&lt;tr&gt;
  &lt;td style="vertical-align:top"&gt;
  
&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://download.dojotoolkit.org/release-0.3.0/dojo-0.3.0-widget/tests/widget/test_remote_ComboBox.html"&gt;&lt;strong&gt;Dojo&lt;/strong&gt; (dojotoolkit.org)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://download.dojotoolkit.org/release-0.3.0/dojo-0.3.0-widget/tests/widget/test_remote_ComboBox.html"&gt;&lt;img class="img_wrap" alt="dojo autocomplete" src="/images/articles/200607/autocomplete_dojo_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_dojo.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://proj.jquery.com/discuss/2006-July/003050/"&gt;&lt;strong&gt;jQuery&lt;/strong&gt; (jquery.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://proj.jquery.com/discuss/2006-July/003050/"&gt;&lt;img class="img_wrap" alt="jquery autocomplete" src="/images/articles/200607/autocomplete_jquery_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_jquery_orig.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://developer.yahoo.com/yui/autocomplete/"&gt;&lt;strong&gt;Yahoo UI&lt;/strong&gt; (yahoo.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://developer.yahoo.com/yui/autocomplete/"&gt;&lt;img  class="img_wrap" alt="yahoo ui autocomplete" src="/images/articles/200607/autocomplete_yahooui_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_yahooui.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

  &lt;/td&gt;&lt;td style="vertical-align:top"&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://labs.google.com/suggest/"&gt;&lt;strong&gt;Google&lt;/strong&gt; (google.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://labs.google.com/suggest/"&gt;&lt;img class="img_wrap" alt="google suggest autocomplete" src="/images/articles/200607/autocomplete_google_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_google.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://demo.script.aculo.us/ajax/autocompleter_customized"&gt;&lt;strong&gt;Scriptaculous&lt;/strong&gt; (script.aculo.us)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://demo.script.aculo.us/ajax/autocompleter_customized"&gt;&lt;img class="img_wrap" alt="scriptaculous autocomplete" src="/images/articles/200607/autocomplete_scriptaculous_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_scriptaculous.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;
  
  &lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;NOTE: The jQuery screen shot has been edited to size it better from the demo page: (a) the number of results was reduced and (b) the width has been reduced because there's a lot of blank space in the demo. The &lt;a href="/images/articles/200607/autocomplete_jquery_orig.png"&gt;original jQuery screen shot&lt;/a&gt; is also available.&lt;/p&gt;

&lt;p&gt;UPDATE: CAPXOUS has an interesting paged autocomplete variation which adds Next and Prev links when applicable. The one minor issue I ran into when using this is that it would switch location (above/below the input) if it was near a browser edge and the number of items changed as shown below. I found this a bit disconcerting. I wonder if there's a way to making it always used the side for the larger list? CAPXOUS can also show info that's searched on but not shown but this was less interesting than the paging. One final note, unlike the other JS libraries listed above which are free open source software (FOSS), CAPXOUS is commecial requires a license fee. Pretty interesting idea.&lt;/p&gt;

&lt;table class="article_ac"&gt;&lt;tr&gt;
  &lt;td style="vertical-align:top;text-align:center"&gt;
  
&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://capxous.com/"&gt;&lt;strong&gt;CAPXOUS&lt;/strong&gt; (capxious.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://capxous.com/"&gt;&lt;img class="img_wrap" alt="capxous autocomplete" src="/images/articles/200607/autocomplete_capxous.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_capxious.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;
  &lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;</summary>
    <content type="html">&lt;p&gt;Here are some screen shots of various autocomplete effects in action to show what people are doing. The images and names above the images have links to the relevant sites with the domain name shown. I'll add more screen shots here as I get them. Let me know if there are any other toolkits demos or interesting implementations.&lt;/p&gt;

&lt;p&gt;Here are some observations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All of the screen shots and links are for toolkits except for Google which is just shown as an example.&lt;/li&gt;
&lt;li&gt;The jQuery and Scriptaculous demos do not automatically display "autocomplete" text in the input element.&lt;/li&gt;
&lt;li&gt;All of the demos, except Dojo, include text that will end up in the input field as well as extra display text that will not.&lt;/li&gt;
&lt;li&gt;Where both simple and customized demos are available, the customized one is used for the screen shot.&lt;/li&gt;
&lt;li&gt;Del.icio.us also has nice variable horizontal location/width autocomplete for tags that I don't have a screen shot for atm. Gmail also has a nice autocomplete that isn't shown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The observations are just for the particular demos available. The libraries may have the ability to be configured in additional ways.&lt;/p&gt;

&lt;div id="article_ac" style="text-align:center"&gt;
&lt;table class="article_ac"&gt;&lt;tr&gt;
  &lt;td style="vertical-align:top"&gt;
  
&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://download.dojotoolkit.org/release-0.3.0/dojo-0.3.0-widget/tests/widget/test_remote_ComboBox.html"&gt;&lt;strong&gt;Dojo&lt;/strong&gt; (dojotoolkit.org)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://download.dojotoolkit.org/release-0.3.0/dojo-0.3.0-widget/tests/widget/test_remote_ComboBox.html"&gt;&lt;img class="img_wrap" alt="dojo autocomplete" src="/images/articles/200607/autocomplete_dojo_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_dojo.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://proj.jquery.com/discuss/2006-July/003050/"&gt;&lt;strong&gt;jQuery&lt;/strong&gt; (jquery.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://proj.jquery.com/discuss/2006-July/003050/"&gt;&lt;img class="img_wrap" alt="jquery autocomplete" src="/images/articles/200607/autocomplete_jquery_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_jquery_orig.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://developer.yahoo.com/yui/autocomplete/"&gt;&lt;strong&gt;Yahoo UI&lt;/strong&gt; (yahoo.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://developer.yahoo.com/yui/autocomplete/"&gt;&lt;img  class="img_wrap" alt="yahoo ui autocomplete" src="/images/articles/200607/autocomplete_yahooui_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_yahooui.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

  &lt;/td&gt;&lt;td style="vertical-align:top"&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://labs.google.com/suggest/"&gt;&lt;strong&gt;Google&lt;/strong&gt; (google.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://labs.google.com/suggest/"&gt;&lt;img class="img_wrap" alt="google suggest autocomplete" src="/images/articles/200607/autocomplete_google_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_google.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;

&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://demo.script.aculo.us/ajax/autocompleter_customized"&gt;&lt;strong&gt;Scriptaculous&lt;/strong&gt; (script.aculo.us)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://demo.script.aculo.us/ajax/autocompleter_customized"&gt;&lt;img class="img_wrap" alt="scriptaculous autocomplete" src="/images/articles/200607/autocomplete_scriptaculous_200.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_scriptaculous.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;
  
  &lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;

&lt;p&gt;NOTE: The jQuery screen shot has been edited to size it better from the demo page: (a) the number of results was reduced and (b) the width has been reduced because there's a lot of blank space in the demo. The &lt;a href="/images/articles/200607/autocomplete_jquery_orig.png"&gt;original jQuery screen shot&lt;/a&gt; is also available.&lt;/p&gt;

&lt;p&gt;UPDATE: CAPXOUS has an interesting paged autocomplete variation which adds Next and Prev links when applicable. The one minor issue I ran into when using this is that it would switch location (above/below the input) if it was near a browser edge and the number of items changed as shown below. I found this a bit disconcerting. I wonder if there's a way to making it always used the side for the larger list? CAPXOUS can also show info that's searched on but not shown but this was less interesting than the paging. One final note, unlike the other JS libraries listed above which are free open source software (FOSS), CAPXOUS is commecial requires a license fee. Pretty interesting idea.&lt;/p&gt;

&lt;table class="article_ac"&gt;&lt;tr&gt;
  &lt;td style="vertical-align:top;text-align:center"&gt;
  
&lt;div class="ac_img_wrap"&gt;
&lt;a href="http://capxous.com/"&gt;&lt;strong&gt;CAPXOUS&lt;/strong&gt; (capxious.com)&lt;/a&gt;
&lt;br /&gt;
&lt;a href="http://capxous.com/"&gt;&lt;img class="img_wrap" alt="capxous autocomplete" src="/images/articles/200607/autocomplete_capxous.png" /&gt;&lt;/a&gt;
&lt;br /&gt;
(&lt;a href="/images/articles/200607/autocomplete_capxious.png"&gt;fullsize screen shot&lt;/a&gt;)
&lt;/div&gt;
  &lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:deba160b8a004e21d9039900d708702f</id>
    <published>2006-07-13T23:57:00-05:00</published>
    <updated>2007-06-16T12:30:23-05:00</updated>
    <title type="html">Dojo - dojo.addOnLoad vs. body onload and window.onload</title>
    <link href="http://www.dev411.com/blog/2006/07/13/dojo-dojo-addonload-vs-body-onload-and-window-onload" rel="alternate" type="text/html"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <summary type="html">&lt;p&gt;When using Dojo Toolkit, you should avoid using &lt;span class="fix"&gt;&amp;lt;body onload="..."&amp;gt;&lt;/span&gt; or &lt;span class="fix"&gt;window.onload&lt;/span&gt; (make sure to check external scripts you use as well). This is because Dojo does it's own &lt;span class="fix"&gt;window.onload&lt;/span&gt; and doing it yourself can interfere with Dojo's initialization routines (including DOM rewriting). Dojo has provided &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; for this which allows you to load functions after Dojo has finished its own initilization.&lt;/p&gt;

&lt;p&gt;To use &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; you need to pass a function which can be in either of the following formats:&lt;/p&gt;

&lt;pre&gt;dojo.addOnLoad( myinit );&lt;/pre&gt;
&lt;pre&gt;dojo.addOnLoad( function() { myinit(); });&lt;/pre&gt;

&lt;p&gt;You cannot, however, use a function call like the following since Dojo is expecting an object, not a function call.&lt;/p&gt;

&lt;pre&gt;dojo.addOnLoad( myinit() );&lt;/pre&gt;

&lt;p&gt;I discussed using &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; in a previous entry about &lt;a href="/blog/2006/06/14/dojo-setting-the-combobox-default-value"&gt;setting Dojo's combobox default value&lt;/a&gt; but thought it worthwhile to have a separate entry since this issue continues to come up.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;When using Dojo Toolkit, you should avoid using &lt;span class="fix"&gt;&amp;lt;body onload="..."&amp;gt;&lt;/span&gt; or &lt;span class="fix"&gt;window.onload&lt;/span&gt; (make sure to check external scripts you use as well). This is because Dojo does it's own &lt;span class="fix"&gt;window.onload&lt;/span&gt; and doing it yourself can interfere with Dojo's initialization routines (including DOM rewriting). Dojo has provided &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; for this which allows you to load functions after Dojo has finished its own initilization.&lt;/p&gt;

&lt;p&gt;To use &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; you need to pass a function which can be in either of the following formats:&lt;/p&gt;

&lt;pre&gt;dojo.addOnLoad( myinit );&lt;/pre&gt;
&lt;pre&gt;dojo.addOnLoad( function() { myinit(); });&lt;/pre&gt;

&lt;p&gt;You cannot, however, use a function call like the following since Dojo is expecting an object, not a function call.&lt;/p&gt;

&lt;pre&gt;dojo.addOnLoad( myinit() );&lt;/pre&gt;

&lt;p&gt;I discussed using &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt; in a previous entry about &lt;a href="/blog/2006/06/14/dojo-setting-the-combobox-default-value"&gt;setting Dojo's combobox default value&lt;/a&gt; but thought it worthwhile to have a separate entry since this issue continues to come up.&lt;/p&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:fce7d6761254476fab563de4285e7fd6</id>
    <published>2006-06-30T12:49:00-05:00</published>
    <updated>2007-06-16T12:30:22-05:00</updated>
    <title type="html">Should there be a standard X-Ajax-Engine request header?</title>
    <link href="http://www.dev411.com/blog/2006/06/30/should-there-be-a-xmlhttprequest-user-agent" rel="alternate" type="text/html"/>
    <category term="mochikit" scheme="http://www.dev411.com/blog/tag/mochikit" label="mochikit"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <category term="prototype" scheme="http://www.dev411.com/blog/tag/prototype" label="prototype"/>
    <summary type="html">&lt;p&gt;A little while ago &lt;a href="/blog/2006/05/31/prototype-json-and-catalyst"&gt;I was looking at JSON and Catalyst::View::JSON&lt;/a&gt; (a server-side library to provide some JSON repsonse magic for &lt;a href="http://www.catalystframework.org"&gt;Catalyst&lt;/a&gt;) and I discovered that AJAX libraries auto-eval JSON differently, Dojo looks in the response body and Prototype looks in the X-JSON header (read about &lt;a href="/blog/2006/06/01/prototype-x-json-fails-on-long-value-in-ie"&gt;X-JSON problems with IE 6&lt;/a&gt;). This got me thinking that there's no standard way for the server to tell what kind of AJAX library is making the request. Prototype sets the &lt;span class="fix"&gt;X-Requested-With&lt;/span&gt; and &lt;span class="fix"&gt;X-Prototype-Version&lt;/span&gt; as:&lt;/p&gt;

&lt;pre&gt;var requestHeaders =
  ['X-Requested-With', XMLHttpRequest',
   'X-Prototype-Version', Prototype.Version,&lt;/pre&gt;

&lt;p&gt;For Dojo, some people are manually sending a request header along the lines of &lt;span class="fix"&gt;isDojo:true&lt;/span&gt;. MochiKit doesn't currently send an identifier.&lt;/p&gt;

&lt;p&gt;I tend to prefer a bit more information such as the library version. Does it make sense for AJAX libraries to send a standard User-Agent along the lines of &lt;span class="fix"&gt;X-XMLHttpRequest-User-Agent&lt;/span&gt; (&lt;span class="fix"&gt;X-AJAX-User-Agent&lt;/span&gt; is shorter but may not be as correct; subsequent to the initial post, a discussion with Alex Russell generated the &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; name which has been incorporated below). Something shorter is preferable but this is just an initial proposal. It would also remove the need for Prototype's separate &lt;span class="fix"&gt;X-Requested-With&lt;/span&gt; header since having &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; set at all would indicate &lt;span class="fix"&gt;XMLHttpRequest&lt;/span&gt;. The format could follow the one established for &lt;a href="http://en.wikipedia.org/wiki/User_agent"&gt;User-Agent&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;X-Ajax-Engine: &amp;lt;library_name&amp;gt;/&amp;lt;library_version&amp;gt;&lt;/pre&gt;

&lt;p&gt;This can be done manually with Dojo, MochiKit and Prototype as follows:&lt;/p&gt;

&lt;pre&gt;// in a Dojo.io.bind call:
headers: {
 'X-Ajax-Engine':'Dojo/'+dojo.version
}&lt;/pre&gt;

&lt;pre&gt;// for MochiKit:
req.setRequestHeader(
  'X-Ajax-Engine',
  'MochiKit/'+MochiKit.Async.VERSION
)&lt;/pre&gt;

&lt;pre&gt;// in a Prototype AJAX.Request call:
requestHeaders: [
  'X-Ajax-Engine',
  'Prototype/'+Prototype.Version
]&lt;/pre&gt;

&lt;p&gt;Optional information could be added in parenthesis afterwards, e.g. Dojo Toolkit could include the edition name or something along the lines of "Custom Build" like (I'm not sure if other libraries have a reason to do this):&lt;/p&gt;

&lt;pre&gt;X-Ajax-Engine: Dojo/0.3.1 (BrowserIO)&lt;/pre&gt;

&lt;p&gt;If client libraries started using this or something similar, server-side identification could start (attempting to) depend on something that was standardized. Standardization can even be proposed as an addition to the &lt;a href="http://www.w3.org/TR/XMLHttpRequest/"&gt;W3C's XMLHttpRequest efforts&lt;/a&gt;. I think standardization would be great because it will probably happen eventually and for now it would make server-side identification more reliable.&lt;/p&gt;

&lt;p&gt;UPDATE 1: Less than a week after I posted this, a related issue came up on the &lt;a href="http://groups.google.com/group/mochikit/browse_thread/thread/9f88a002d7a2be5f/c340d191d18a89bf"&gt;MochiKit Google Group&lt;/a&gt; involving adding a &lt;span class="fix"&gt;X-MochiKit-Version&lt;/span&gt; header to mimic &lt;span class="fix"&gt;X-Prototype-Version&lt;/span&gt;. I put in a word for standardization and after discussing this with Alex Russell (see below) posted back to the group. Seems like we may get a defacto standardization on &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; which would be nice.&lt;/p&gt;

&lt;p&gt;UPDATE 2: I spoke to Alex Russell of Dojo Toolkit about this and he thought this is a good idea. Apparently if you set &lt;span class="fix"&gt;sendTransport&lt;/span&gt; in dojo.io.bind, an identifier (but not version number) will get sent, however it seems not many people know about this. We discussed shorter names and Alex came up with &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt;. He mentioned he could bring this up at the &lt;a href="http://www.openajaxalliance.org/"&gt;OpenAjax Alliance&lt;/a&gt;.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;A little while ago &lt;a href="/blog/2006/05/31/prototype-json-and-catalyst"&gt;I was looking at JSON and Catalyst::View::JSON&lt;/a&gt; (a server-side library to provide some JSON repsonse magic for &lt;a href="http://www.catalystframework.org"&gt;Catalyst&lt;/a&gt;) and I discovered that AJAX libraries auto-eval JSON differently, Dojo looks in the response body and Prototype looks in the X-JSON header (read about &lt;a href="/blog/2006/06/01/prototype-x-json-fails-on-long-value-in-ie"&gt;X-JSON problems with IE 6&lt;/a&gt;). This got me thinking that there's no standard way for the server to tell what kind of AJAX library is making the request. Prototype sets the &lt;span class="fix"&gt;X-Requested-With&lt;/span&gt; and &lt;span class="fix"&gt;X-Prototype-Version&lt;/span&gt; as:&lt;/p&gt;

&lt;pre&gt;var requestHeaders =
  ['X-Requested-With', XMLHttpRequest',
   'X-Prototype-Version', Prototype.Version,&lt;/pre&gt;

&lt;p&gt;For Dojo, some people are manually sending a request header along the lines of &lt;span class="fix"&gt;isDojo:true&lt;/span&gt;. MochiKit doesn't currently send an identifier.&lt;/p&gt;

&lt;p&gt;I tend to prefer a bit more information such as the library version. Does it make sense for AJAX libraries to send a standard User-Agent along the lines of &lt;span class="fix"&gt;X-XMLHttpRequest-User-Agent&lt;/span&gt; (&lt;span class="fix"&gt;X-AJAX-User-Agent&lt;/span&gt; is shorter but may not be as correct; subsequent to the initial post, a discussion with Alex Russell generated the &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; name which has been incorporated below). Something shorter is preferable but this is just an initial proposal. It would also remove the need for Prototype's separate &lt;span class="fix"&gt;X-Requested-With&lt;/span&gt; header since having &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; set at all would indicate &lt;span class="fix"&gt;XMLHttpRequest&lt;/span&gt;. The format could follow the one established for &lt;a href="http://en.wikipedia.org/wiki/User_agent"&gt;User-Agent&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;X-Ajax-Engine: &amp;lt;library_name&amp;gt;/&amp;lt;library_version&amp;gt;&lt;/pre&gt;

&lt;p&gt;This can be done manually with Dojo, MochiKit and Prototype as follows:&lt;/p&gt;

&lt;pre&gt;// in a Dojo.io.bind call:
headers: {
 'X-Ajax-Engine':'Dojo/'+dojo.version
}&lt;/pre&gt;

&lt;pre&gt;// for MochiKit:
req.setRequestHeader(
  'X-Ajax-Engine',
  'MochiKit/'+MochiKit.Async.VERSION
)&lt;/pre&gt;

&lt;pre&gt;// in a Prototype AJAX.Request call:
requestHeaders: [
  'X-Ajax-Engine',
  'Prototype/'+Prototype.Version
]&lt;/pre&gt;

&lt;p&gt;Optional information could be added in parenthesis afterwards, e.g. Dojo Toolkit could include the edition name or something along the lines of "Custom Build" like (I'm not sure if other libraries have a reason to do this):&lt;/p&gt;

&lt;pre&gt;X-Ajax-Engine: Dojo/0.3.1 (BrowserIO)&lt;/pre&gt;

&lt;p&gt;If client libraries started using this or something similar, server-side identification could start (attempting to) depend on something that was standardized. Standardization can even be proposed as an addition to the &lt;a href="http://www.w3.org/TR/XMLHttpRequest/"&gt;W3C's XMLHttpRequest efforts&lt;/a&gt;. I think standardization would be great because it will probably happen eventually and for now it would make server-side identification more reliable.&lt;/p&gt;

&lt;p&gt;UPDATE 1: Less than a week after I posted this, a related issue came up on the &lt;a href="http://groups.google.com/group/mochikit/browse_thread/thread/9f88a002d7a2be5f/c340d191d18a89bf"&gt;MochiKit Google Group&lt;/a&gt; involving adding a &lt;span class="fix"&gt;X-MochiKit-Version&lt;/span&gt; header to mimic &lt;span class="fix"&gt;X-Prototype-Version&lt;/span&gt;. I put in a word for standardization and after discussing this with Alex Russell (see below) posted back to the group. Seems like we may get a defacto standardization on &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt; which would be nice.&lt;/p&gt;

&lt;p&gt;UPDATE 2: I spoke to Alex Russell of Dojo Toolkit about this and he thought this is a good idea. Apparently if you set &lt;span class="fix"&gt;sendTransport&lt;/span&gt; in dojo.io.bind, an identifier (but not version number) will get sent, however it seems not many people know about this. We discussed shorter names and Alex came up with &lt;span class="fix"&gt;X-Ajax-Engine&lt;/span&gt;. He mentioned he could bring this up at the &lt;a href="http://www.openajaxalliance.org/"&gt;OpenAjax Alliance&lt;/a&gt;.&lt;/p&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:94ca060750f9ad4a1917a0c832cb0454</id>
    <published>2006-06-14T03:39:00-05:00</published>
    <updated>2007-06-16T12:30:22-05:00</updated>
    <title type="html">Dojo - Setting the ComboBox Default Value</title>
    <link href="http://www.dev411.com/blog/2006/06/14/dojo-setting-the-combobox-default-value" rel="alternate" type="text/html"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="autocomplete" scheme="http://www.dev411.com/blog/tag/autocomplete" label="autocomplete"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <summary type="html">&lt;p&gt;Dojo Toolkit's ComboBox doesn't take a default value but one can be written in using JavaScript. The default value in the ComboBox dojoType is lost during onLoad when the dojoType widget is rendered. To get around this we can use JavaScript to fill in the value during &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt;. Here's the relevant JavaScript:&lt;/p&gt;

&lt;pre&gt;function init() {
  var mycombobox = dojo.widget.byId('mycombobox');
  mycombobox.textInputNode.value = 'Seattle';
}

// method 1
dojo.addOnLoad( init );

// method 2
dojo.addOnLoad( function() {
  init()
} )&lt;/pre&gt;

&lt;pre&gt;// won't work b/c you want to send an object
// not call a function
dojo.addOnLoad( init() );&lt;/pre&gt;
&lt;p&gt;The HTML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;input dojoType="ComboBox"
  id="mycombobox"
  value="this should never be seen - it is replaced!"
  dataUrl="comboBoxData.js" style="width: 300px;" name="foo.bar"
  onValueChanged="setVal2"
&amp;gt;&lt;/pre&gt;

&lt;p&gt;A more detailed example of this technique is available on the wiki at &lt;a href="http://www.dev411.com/wiki/Dojo_Toolkit:_Setting_the_ComboBox_Default_Value"&gt;Dojo Toolkit: Setting the Combobox Default Value&lt;/a&gt;.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;Dojo Toolkit's ComboBox doesn't take a default value but one can be written in using JavaScript. The default value in the ComboBox dojoType is lost during onLoad when the dojoType widget is rendered. To get around this we can use JavaScript to fill in the value during &lt;span class="fix"&gt;dojo.addOnLoad&lt;/span&gt;. Here's the relevant JavaScript:&lt;/p&gt;

&lt;pre&gt;function init() {
  var mycombobox = dojo.widget.byId('mycombobox');
  mycombobox.textInputNode.value = 'Seattle';
}

// method 1
dojo.addOnLoad( init );

// method 2
dojo.addOnLoad( function() {
  init()
} )&lt;/pre&gt;

&lt;pre&gt;// won't work b/c you want to send an object
// not call a function
dojo.addOnLoad( init() );&lt;/pre&gt;
&lt;p&gt;The HTML:&lt;/p&gt;
&lt;pre&gt;&amp;lt;input dojoType="ComboBox"
  id="mycombobox"
  value="this should never be seen - it is replaced!"
  dataUrl="comboBoxData.js" style="width: 300px;" name="foo.bar"
  onValueChanged="setVal2"
&amp;gt;&lt;/pre&gt;

&lt;p&gt;A more detailed example of this technique is available on the wiki at &lt;a href="http://www.dev411.com/wiki/Dojo_Toolkit:_Setting_the_ComboBox_Default_Value"&gt;Dojo Toolkit: Setting the Combobox Default Value&lt;/a&gt;.&lt;/p&gt;

</content>
  </entry>
  <entry>
    <author>
      <name>John Wang</name>
    </author>
    <id>urn:uuid:38c104ddc9167cbf60448098739c9316</id>
    <published>2006-06-13T21:31:00-05:00</published>
    <updated>2007-06-16T12:30:22-05:00</updated>
    <title type="html">Dojo and Prototype Together</title>
    <link href="http://www.dev411.com/blog/2006/06/13/dojo-and-prototype-together" rel="alternate" type="text/html"/>
    <category term="dojo" scheme="http://www.dev411.com/blog/tag/dojo" label="dojo"/>
    <category term="autocomplete" scheme="http://www.dev411.com/blog/tag/autocomplete" label="autocomplete"/>
    <category term="ajax" scheme="http://www.dev411.com/blog/tag/ajax" label="ajax"/>
    <category term="scriptaculous" scheme="http://www.dev411.com/blog/tag/scriptaculous" label="scriptaculous"/>
    <category term="prototype" scheme="http://www.dev411.com/blog/tag/prototype" label="prototype"/>
    <summary type="html">&lt;p&gt;I just wanted to report and let everyone know with &lt;a href="http://prototype.conio.net"&gt;Prototype&lt;/a&gt; 1.5.x, &lt;a href="http://www.dojotoolkit.org"&gt;Dojo Toolkit&lt;/a&gt; and Prototype should now be interoperable. Earlier versions of prototype.js extended the JavaScript Object prototype that would break third-party JavaScript but this is no longer being done. A few people, including myself, have been using them together without any problems. The prototype website still offers 1.4.0 as the current version, however 1.5.0 rc0 is included with &lt;a href="http://script.aculo.us"&gt;Scriptaculous&lt;/a&gt; 1.6.1. I'm currently using prototype 1.5.0 rc0 with Dojo 0.3.1 and Scriptaculous 1.5 rc4. Although Scriptaculous 1.6.1 is available, it breaks autocomplete for me and I haven't had time to track down what changed yet. Hopefully soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; The Scriptaculous 1.6.1 issue has been reported to RoR as &lt;a href="http://dev.rubyonrails.org/ticket/5673"&gt;ticket #5673&lt;/a&gt;. This has since been fixed with Scriptaculous 1.6.2. I'm now using Dojo 0.3.1, Prototype 1.5.0 rc0 and Scriptaculous 1.6.2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE 2:&lt;/strong&gt; When running &lt;span class="fix"&gt;dojo.js&lt;/span&gt; and &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; together, make sure you load &lt;span class="fix"&gt;dojo.js&lt;/span&gt; first. Loading &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; first will cause Dojo to fail.&lt;/p&gt;</summary>
    <content type="html">&lt;p&gt;I just wanted to report and let everyone know with &lt;a href="http://prototype.conio.net"&gt;Prototype&lt;/a&gt; 1.5.x, &lt;a href="http://www.dojotoolkit.org"&gt;Dojo Toolkit&lt;/a&gt; and Prototype should now be interoperable. Earlier versions of prototype.js extended the JavaScript Object prototype that would break third-party JavaScript but this is no longer being done. A few people, including myself, have been using them together without any problems. The prototype website still offers 1.4.0 as the current version, however 1.5.0 rc0 is included with &lt;a href="http://script.aculo.us"&gt;Scriptaculous&lt;/a&gt; 1.6.1. I'm currently using prototype 1.5.0 rc0 with Dojo 0.3.1 and Scriptaculous 1.5 rc4. Although Scriptaculous 1.6.1 is available, it breaks autocomplete for me and I haven't had time to track down what changed yet. Hopefully soon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; The Scriptaculous 1.6.1 issue has been reported to RoR as &lt;a href="http://dev.rubyonrails.org/ticket/5673"&gt;ticket #5673&lt;/a&gt;. This has since been fixed with Scriptaculous 1.6.2. I'm now using Dojo 0.3.1, Prototype 1.5.0 rc0 and Scriptaculous 1.6.2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE 2:&lt;/strong&gt; When running &lt;span class="fix"&gt;dojo.js&lt;/span&gt; and &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; together, make sure you load &lt;span class="fix"&gt;dojo.js&lt;/span&gt; first. Loading &lt;span class="fix"&gt;scriptaculous.js&lt;/span&gt; first will cause Dojo to fail.&lt;/p&gt;

</content>
  </entry>
</feed>

