<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: ajax</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/ajax.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2013-07-19T17:49:00+00:00</updated><author><name>Simon Willison</name></author><entry><title>Is it probable that one of the major forum software packages will support Ajax soon?</title><link href="https://simonwillison.net/2013/Jul/19/is-it-probable-that/#atom-tag" rel="alternate"/><published>2013-07-19T17:49:00+00:00</published><updated>2013-07-19T17:49:00+00:00</updated><id>https://simonwillison.net/2013/Jul/19/is-it-probable-that/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Is-it-probable-that-one-of-the-major-forum-software-packages-will-support-Ajax-soon/answer/Simon-Willison"&gt;Is it probable that one of the major forum software packages will support Ajax soon?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Those codebases are all terrifyingly ancient. I suggest taking a look at &lt;span&gt;&lt;a href="http://www.discourse.org/"&gt;http://www.discourse.org/&lt;/a&gt;&lt;/span&gt; instead which is a much more modern take on forum software.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/frameworks"&gt;frameworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="frameworks"/><category term="quora"/></entry><entry><title>How does a web page interact with a server to parse a dynamic JSON file?</title><link href="https://simonwillison.net/2013/Jul/6/how-does-a-web/#atom-tag" rel="alternate"/><published>2013-07-06T14:54:00+00:00</published><updated>2013-07-06T14:54:00+00:00</updated><id>https://simonwillison.net/2013/Jul/6/how-does-a-web/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-does-a-web-page-interact-with-a-server-to-parse-a-dynamic-JSON-file/answer/Simon-Willison"&gt;How does a web page interact with a server to parse a dynamic JSON file?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're only dealing with 60 records there's no need to add a full database. I've actually hand coded a 50 record JSON file before and it was fine- use an editor with good JSON support (I like Sublime Text 2) and it's pretty easy to hand write.&lt;/p&gt;

&lt;p&gt;Another option that might work well for this particular situation is to put the data in a Google Docs spreadsheet, which will then be able to produce JSON for you automatically: see &lt;span&gt;&lt;a href="https://developers.google.com/gdata/samples/spreadsheet_sample"&gt;https://developers.google.com/gd...&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/computer-science"&gt;computer-science&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/databases"&gt;databases&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="computer-science"/><category term="databases"/><category term="javascript"/><category term="json"/><category term="quora"/></entry><entry><title>What's the best way to handle logins?</title><link href="https://simonwillison.net/2012/Jul/31/whats-the-best-way/#atom-tag" rel="alternate"/><published>2012-07-31T12:16:00+00:00</published><updated>2012-07-31T12:16:00+00:00</updated><id>https://simonwillison.net/2012/Jul/31/whats-the-best-way/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Whats-the-best-way-to-handle-logins/answer/Simon-Willison"&gt;What&amp;#39;s the best way to handle logins?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;First, make sure you're storing the password as a salted hash, using a deliberately slow hashing algorithm such as bcrypt, scrypt or PBKDF2 - here are some recent articles to get you up to speed:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://throwingfire.com/storing-passwords-securely/"&gt;http://throwingfire.com/storing-...&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.troyhunt.com/2011/06/owasp-top-10-for-net-developers-part-7.html"&gt;http://www.troyhunt.com/2011/06/...&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Here's a recent article on building a password reset function, from the same author:

&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;a href="http://www.troyhunt.com/2012/05/everything-you-ever-wanted-to-know.html"&gt;http://www.troyhunt.com/2012/05/...&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;There are a couple of ways you could deal with keeping people logged in. The first, and probably the most sensible, is to use a session mechanism written by someone else (PHP has this functionality built in, I'm not sure what the state of the art for Perl is). Alternatively you could use a cryptographically signed cookie, but don't do that unless you're certain you understand what that means.

&lt;p&gt;It should go without saying, but don't store the user's ID in a cookie and trust that - cookies can be altered so you can't trust them unless they are signed. Don't store the user's password in the cookie either.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/html"&gt;html&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="html"/><category term="web-development"/><category term="quora"/></entry><entry><title>How do you change page content and URL without reloading the whole page?</title><link href="https://simonwillison.net/2012/Feb/11/how-do-you-change/#atom-tag" rel="alternate"/><published>2012-02-11T13:25:00+00:00</published><updated>2012-02-11T13:25:00+00:00</updated><id>https://simonwillison.net/2012/Feb/11/how-do-you-change/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/How-do-you-change-page-content-and-URL-without-reloading-the-whole-page/answer/Simon-Willison"&gt;How do you change page content and URL without reloading the whole page?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This can only be done using JavaScript. You use XMLHttpRequest to pull in new information from the server (also known as Ajax - most people use a JavaScript library such as jQuery to handle this) and then use the HTML5 history API, in particular the pushState method, to update the URL.&lt;/p&gt;

&lt;p&gt;Sadly pushState isn't supported by IE versions older than IE10 - it's up to you if you resort to fragment identifier URL hacks to support that browser or (my preferred approach) just leave IE users with full page refreshes. Sadly most versions of the Android browser don't support pushState either, and performance constraints on mobile means they are harder to ignore than IE.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="javascript"/><category term="jquery"/><category term="web-development"/><category term="quora"/></entry><entry><title>Going Postel</title><link href="https://simonwillison.net/2011/Feb/9/adactio/#atom-tag" rel="alternate"/><published>2011-02-09T02:18:00+00:00</published><updated>2011-02-09T02:18:00+00:00</updated><id>https://simonwillison.net/2011/Feb/9/adactio/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://adactio.com/journal/4346/"&gt;Going Postel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Jeremy points out that one of the many disadvantages of publishing JavaScript dependent content on the Web is that a single typo can render your entire site unusable.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/urls"&gt;urls&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gawker"&gt;gawker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hashbanghell"&gt;hashbanghell&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="jeremy-keith"/><category term="urls"/><category term="recovered"/><category term="gawker"/><category term="hashbanghell"/></entry><entry><title>Breaking the Web with hash-bangs</title><link href="https://simonwillison.net/2011/Feb/9/isolani/#atom-tag" rel="alternate"/><published>2011-02-09T02:17:00+00:00</published><updated>2011-02-09T02:17:00+00:00</updated><id>https://simonwillison.net/2011/Feb/9/isolani/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://isolani.co.uk/blog/javascript/BreakingTheWebWithHashBangs"&gt;Breaking the Web with hash-bangs&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Mike Davies explains why Gawker’s new Ajax fragment-tastic redesign is a web architecture error of colossal proportions.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/urls"&gt;urls&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gawker"&gt;gawker&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hashbanghell"&gt;hashbanghell&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mike-davies"&gt;mike-davies&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="urls"/><category term="recovered"/><category term="gawker"/><category term="hashbanghell"/><category term="mike-davies"/></entry><entry><title>Why do websites contain multiple webpages when they could use AJAX?</title><link href="https://simonwillison.net/2011/Feb/4/why-do-websites-contain/#atom-tag" rel="alternate"/><published>2011-02-04T09:46:00+00:00</published><updated>2011-02-04T09:46:00+00:00</updated><id>https://simonwillison.net/2011/Feb/4/why-do-websites-contain/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Why-do-websites-contain-multiple-webpages-when-they-could-use-AJAX/answer/Simon-Willison"&gt;Why do websites contain multiple webpages when they could use AJAX?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because it shouldn't require a full-blown JavaScript interpreter just to access content on the Web.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/computer-science"&gt;computer-science&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="computer-science"/><category term="web-development"/><category term="quora"/></entry><entry><title>Why do browsers allow cross-domain JavaScript to execute but not XMLHttpRequests?</title><link href="https://simonwillison.net/2010/Dec/7/why-do-browsers-allow/#atom-tag" rel="alternate"/><published>2010-12-07T13:37:00+00:00</published><updated>2010-12-07T13:37:00+00:00</updated><id>https://simonwillison.net/2010/Dec/7/why-do-browsers-allow/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/Why-do-browsers-allow-cross-domain-JavaScript-to-execute-but-not-XMLHttpRequests/answer/Simon-Willison"&gt;Why do browsers allow cross-domain JavaScript to execute but not XMLHttpRequests?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's called the Same Origin Policy, and it's principally about intranets. Imagine you have a URL &lt;span&gt;&lt;a href="http://intranet.corp/top-secret-document.pdf"&gt;http://intranet.corp/top-secret-...&lt;/a&gt;&lt;/span&gt; - and you then visit &lt;span&gt;&lt;a href="http://evil.example.com/"&gt;http://evil.example.com/&lt;/a&gt;&lt;/span&gt; . If cross domain XHR was allowed the evil site could suck that secret document off your intranet without you realising.&lt;/p&gt;

&lt;p&gt;JavaScript should really have the same restrictions (I shouldn't be able to load &lt;span&gt;&lt;a href="http://intranet.corp/top-secret-javascript.js"&gt;http://intranet.corp/top-secret-...&lt;/a&gt;&lt;/span&gt; ) but as I understand it no one spotted the problem until the entire Internet economy was already dependent on externally hosted scripts as a business model.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="javascript"/><category term="security"/><category term="web-development"/><category term="quora"/></entry><entry><title>If I have data that loads using  json / JavaScript will it get indexed by Google?</title><link href="https://simonwillison.net/2010/Oct/29/if-i-have-data/#atom-tag" rel="alternate"/><published>2010-10-29T15:30:00+00:00</published><updated>2010-10-29T15:30:00+00:00</updated><id>https://simonwillison.net/2010/Oct/29/if-i-have-data/#atom-tag</id><summary type="html">
    &lt;p&gt;&lt;em&gt;My answer to &lt;a href="https://www.quora.com/If-I-have-data-that-loads-using-json-JavaScript-will-it-get-indexed-by-Google/answer/Simon-Willison"&gt;If I have data that loads using  json / JavaScript will it get indexed by Google?&lt;/a&gt; on Quora&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No. Personally I dislike sites with content that is only accessible through JavaScript, but if you absolutely insist on doing this you should look in to implementing the Google Ajax Crawling mechanism: &lt;span&gt;&lt;a href="http://code.google.com/web/ajaxcrawling/"&gt;http://code.google.com/web/ajaxc...&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/seo"&gt;seo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-development"&gt;web-development&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/quora"&gt;quora&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="ajax"/><category term="jquery"/><category term="json"/><category term="seo"/><category term="web-development"/><category term="quora"/></entry><entry><title>Side-Channel Leaks in Web Applications</title><link href="https://simonwillison.net/2010/Mar/23/sidechannel/#atom-tag" rel="alternate"/><published>2010-03-23T16:24:02+00:00</published><updated>2010-03-23T16:24:02+00:00</updated><id>https://simonwillison.net/2010/Mar/23/sidechannel/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.freedom-to-tinker.com/blog/felten/side-channel-leaks-web-applications"&gt;Side-Channel Leaks in Web Applications&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Interesting new security research. SSL web connections encrypt the content but an attacker can still see the size of the HTTP requests going back and forward—which can be enough to extract significant pieces of information, especially in applications that make a lot of Ajax requests.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sidechannel"&gt;sidechannel&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ssl"&gt;ssl&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="http"/><category term="security"/><category term="sidechannel"/><category term="ssl"/></entry><entry><title>flXHR</title><link href="https://simonwillison.net/2009/Nov/26/flxhr/#atom-tag" rel="alternate"/><published>2009-11-26T12:52:16+00:00</published><updated>2009-11-26T12:52:16+00:00</updated><id>https://simonwillison.net/2009/Nov/26/flxhr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://flxhr.flensed.com/"&gt;flXHR&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I was looking for something like this recently, glad to see it exists. flXHR is a drop-in replacement for regular XMLHttpRequest which uses an invisible Flash shim to allow cross-domain calls to be made, taking advantage of the Flash crossdomain.xml security model.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flash"&gt;flash&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flxhr"&gt;flxhr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/swf"&gt;swf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xhr"&gt;xhr&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="crossdomain"/><category term="flash"/><category term="flxhr"/><category term="javascript"/><category term="swf"/><category term="xhr"/></entry><entry><title>Deep Tracing of Internet Explorer</title><link href="https://simonwillison.net/2009/Nov/18/tracing/#atom-tag" rel="alternate"/><published>2009-11-18T08:06:47+00:00</published><updated>2009-11-18T08:06:47+00:00</updated><id>https://simonwillison.net/2009/Nov/18/tracing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://ejohn.org/blog/deep-tracing-of-internet-explorer/"&gt;Deep Tracing of Internet Explorer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
dynaTrace Ajax looks like an awesome tool. For once, Internet Explorer has a development tool that other browsers can be jealous of.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/debugging"&gt;debugging&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dynatraceajax"&gt;dynatraceajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/john-resig"&gt;john-resig&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="debugging"/><category term="dynatraceajax"/><category term="internet-explorer"/><category term="javascript"/><category term="john-resig"/></entry><entry><title>Official Google Webmaster Blog: A proposal for making AJAX crawlable</title><link href="https://simonwillison.net/2009/Oct/8/horrible/#atom-tag" rel="alternate"/><published>2009-10-08T17:52:31+00:00</published><updated>2009-10-08T17:52:31+00:00</updated><id>https://simonwillison.net/2009/Oct/8/horrible/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googlewebmastercentral.blogspot.com/2009/10/proposal-for-making-ajax-crawlable.html"&gt;Official Google Webmaster Blog: A proposal for making AJAX crawlable&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
It's horrible! The Google crawler would map &lt;code&gt;url#!state&lt;/code&gt; to &lt;code&gt;url?_escaped_fragment_=state&lt;/code&gt;, then expect your site to provide rendered HTML that reflects that state (they even go as far as to suggest running a headless browser within your web server to do this). Just stick to progressive enhancement instead, it's far less hideous. It looks like the proposal may have originated with the GWT team.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crawling"&gt;crawling&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gwt"&gt;gwt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/progressive-enhancement"&gt;progressive-enhancement&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/search-engines"&gt;search-engines&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/seo"&gt;seo&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="crawling"/><category term="google"/><category term="gwt"/><category term="javascript"/><category term="progressive-enhancement"/><category term="search-engines"/><category term="seo"/></entry><entry><title>breaking links</title><link href="https://simonwillison.net/2009/Oct/8/breaking/#atom-tag" rel="alternate"/><published>2009-10-08T08:26:08+00:00</published><updated>2009-10-08T08:26:08+00:00</updated><id>https://simonwillison.net/2009/Oct/8/breaking/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://mike.teczno.com/notes/breaking-links.html"&gt;breaking links&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Mike complains about sites such as Twitter and WordPress.com which mess around with Ajax and links and hence breaks the ability to command-click to open a new tab in Safari (and Chrome). I just realised that I’ve subconsciously retrained myself to right click and select “open in new tab” to avoid that exact issue.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/broken"&gt;broken&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/links"&gt;links&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/michal-migurski"&gt;michal-migurski&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/usability"&gt;usability&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="broken"/><category term="javascript"/><category term="links"/><category term="michal-migurski"/><category term="usability"/></entry><entry><title>Quoting Iain Lamb</title><link href="https://simonwillison.net/2009/Aug/18/performance/#atom-tag" rel="alternate"/><published>2009-08-18T12:27:31+00:00</published><updated>2009-08-18T12:27:31+00:00</updated><id>https://simonwillison.net/2009/Aug/18/performance/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/#comment-59531"&gt;&lt;p&gt;rather baffling finding: POST requests, made via the XMLHTTP object, send header and body data in separate tcp/ip packets [and therefore,] xmlhttp GET performs better when sending small amounts of data than an xmlhttp POST&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/#comment-59531"&gt;Iain Lamb&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/get"&gt;get&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/http"&gt;http&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/iainlamb"&gt;iainlamb&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/post"&gt;post&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="get"/><category term="http"/><category term="iainlamb"/><category term="performance"/><category term="post"/><category term="xmlhttprequest"/></entry><entry><title>Announcing Alice and Wonderland</title><link href="https://simonwillison.net/2009/Jul/17/rabbits/#atom-tag" rel="alternate"/><published>2009-07-17T09:12:45+00:00</published><updated>2009-07-17T09:12:45+00:00</updated><id>https://simonwillison.net/2009/Jul/17/rabbits/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://willcodeforfoo.com/2009/07/13/announcing-alice/"&gt;Announcing Alice and Wonderland&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Continuing the RabbitMQ “stuff to do with rabbits” naming convention, Alice is a RESTful interface to RabbitMQ which exposes information about vhosts/queues/users/exchanges/etc as JSON. Wonderland is a web UI for RabbitMQ implemented as a pure Ajax application which calls Alice.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/alice"&gt;alice&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/aliceinwonderland"&gt;aliceinwonderland&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/message-queues"&gt;message-queues&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/queues"&gt;queues&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rabbitmq"&gt;rabbitmq&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rest"&gt;rest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wonderland"&gt;wonderland&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="alice"/><category term="aliceinwonderland"/><category term="javascript"/><category term="json"/><category term="message-queues"/><category term="queues"/><category term="rabbitmq"/><category term="rest"/><category term="wonderland"/></entry><entry><title>Building Fast Client-side Searches</title><link href="https://simonwillison.net/2009/Mar/19/boselecta/#atom-tag" rel="alternate"/><published>2009-03-19T15:35:03+00:00</published><updated>2009-03-19T15:35:03+00:00</updated><id>https://simonwillison.net/2009/Mar/19/boselecta/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.flickr.com/blog/2009/03/18/building-fast-client-side-searches/"&gt;Building Fast Client-side Searches&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Flickr now lazily loads your entire contact list in to memory for auto-completion. Extensive benchmarking found that a control character delimited string was the fastest option for shipping thousands of contacts around as quickly as possible.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/autocomplete"&gt;autocomplete&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/flickr"&gt;flickr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="autocomplete"/><category term="flickr"/><category term="javascript"/><category term="json"/></entry><entry><title>AJAX APIs Playground</title><link href="https://simonwillison.net/2009/Jan/22/ajax/#atom-tag" rel="alternate"/><published>2009-01-22T18:38:56+00:00</published><updated>2009-01-22T18:38:56+00:00</updated><id>https://simonwillison.net/2009/Jan/22/ajax/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/apis/ajax/playground/"&gt;AJAX APIs Playground&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Ferociously useful collection of executable and editable example code for all(?) of Google’s JavaScript APIs, including Google Maps and the increasingly interesting Visualization API.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/googlevisualization"&gt;googlevisualization&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="google"/><category term="google-maps"/><category term="googlevisualization"/><category term="javascript"/></entry><entry><title>Sloppy - the slow proxy</title><link href="https://simonwillison.net/2009/Jan/13/sloppy/#atom-tag" rel="alternate"/><published>2009-01-13T16:17:41+00:00</published><updated>2009-01-13T16:17:41+00:00</updated><id>https://simonwillison.net/2009/Jan/13/sloppy/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.dallaway.com/sloppy/"&gt;Sloppy - the slow proxy&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Java Web Start GUI application which runs a proxy to the site of your choice simulating lower connection speeds—great for testing how well your ajax holds up under poor network conditions.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/java"&gt;java&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javawebstart"&gt;javawebstart&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/performance"&gt;performance&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/proxies"&gt;proxies&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/richard-dallaway"&gt;richard-dallaway&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sloppy"&gt;sloppy&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="java"/><category term="javascript"/><category term="javawebstart"/><category term="performance"/><category term="proxies"/><category term="richard-dallaway"/><category term="sloppy"/></entry><entry><title>A Snapshot of The Yahoo! Photos Beta (from 2006)</title><link href="https://simonwillison.net/2009/Jan/12/snapshot/#atom-tag" rel="alternate"/><published>2009-01-12T22:21:16+00:00</published><updated>2009-01-12T22:21:16+00:00</updated><id>https://simonwillison.net/2009/Jan/12/snapshot/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.schillmania.com/content/entries/2009/yahoo-photos-frontend-thoughts/"&gt;A Snapshot of The Yahoo! Photos Beta (from 2006)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Scott Schiller shares an internal retrospective on the Yahoo! Photos interface from 2006, which was years ahead of its time (they started building it before the term Ajax had even been coined). The material on memory management and event delegation is particularly interesting.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/eventdelegation"&gt;eventdelegation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scott-schiller"&gt;scott-schiller&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo"&gt;yahoo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo-photos"&gt;yahoo-photos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yui"&gt;yui&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="eventdelegation"/><category term="javascript"/><category term="scott-schiller"/><category term="yahoo"/><category term="yahoo-photos"/><category term="yui"/></entry><entry><title>jQuery history plugin</title><link href="https://simonwillison.net/2008/Nov/7/plugins/#atom-tag" rel="alternate"/><published>2008-11-07T17:32:48+00:00</published><updated>2008-11-07T17:32:48+00:00</updated><id>https://simonwillison.net/2008/Nov/7/plugins/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://plugins.jquery.com/project/history"&gt;jQuery history plugin&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I used this plugin to add back button support to a small Ajax app today, with great results. I tried it a while ago and it didn’t work in Safari, but someone has updated it since and now it works perfectly.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/backbutton"&gt;backbutton&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/history"&gt;history&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="backbutton"/><category term="history"/><category term="javascript"/><category term="jquery"/><category term="plugins"/></entry><entry><title>CSSHttpRequest</title><link href="https://simonwillison.net/2008/Oct/23/csshttprequest/#atom-tag" rel="alternate"/><published>2008-10-23T18:25:43+00:00</published><updated>2008-10-23T18:25:43+00:00</updated><id>https://simonwillison.net/2008/Oct/23/csshttprequest/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nb.io/hacks/csshttprequest/"&gt;CSSHttpRequest&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Devious cross-domain Ajax hack that uses CSS for transport (@import rules with data URIs, but it still works in IE). Similar to JSONP but safer, since JSONP can cause arbitrary JavaScript to execute.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://mike.teczno.com/snippets.html"&gt;Mike Migurski&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atimport"&gt;atimport&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/crossdomain"&gt;crossdomain&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/css"&gt;css&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csshttprequest"&gt;csshttprequest&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jsonp"&gt;jsonp&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="atimport"/><category term="crossdomain"/><category term="css"/><category term="csshttprequest"/><category term="javascript"/><category term="json"/><category term="jsonp"/></entry><entry><title>When Ajax Attacks! Web application security fundamentals</title><link href="https://simonwillison.net/2008/Sep/20/when/#atom-tag" rel="alternate"/><published>2008-09-20T16:16:13+00:00</published><updated>2008-09-20T16:16:13+00:00</updated><id>https://simonwillison.net/2008/Sep/20/when/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://simonwillison.net/2008/talks/amajax-security/"&gt;When Ajax Attacks! Web application security fundamentals&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Slides and notes from my talk on web application security at @media Ajax last Tuesday.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atmediaajax"&gt;atmediaajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atmediaajax2008"&gt;atmediaajax2008&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/slides"&gt;slides&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xss"&gt;xss&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="atmediaajax"/><category term="atmediaajax2008"/><category term="csrf"/><category term="javascript"/><category term="security"/><category term="slides"/><category term="speaking"/><category term="my-talks"/><category term="xss"/></entry><entry><title>When Ajax Attacks! Web application security fundamentals</title><link href="https://simonwillison.net/2008/Sep/17/security/#atom-tag" rel="alternate"/><published>2008-09-17T23:18:00+00:00</published><updated>2008-09-17T23:18:00+00:00</updated><id>https://simonwillison.net/2008/Sep/17/security/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://simonwillison.net/2008/talks/amajax-security/"&gt;When Ajax Attacks! Web application security fundamentals&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Slides and (other people’s) notes from my presentation at @media Ajax on Tuesday.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atmediaajax"&gt;atmediaajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/atmediaajax08"&gt;atmediaajax08&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/speaking"&gt;speaking&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/my-talks"&gt;my-talks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xss"&gt;xss&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/recovered"&gt;recovered&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="atmediaajax"/><category term="atmediaajax08"/><category term="csrf"/><category term="javascript"/><category term="security"/><category term="speaking"/><category term="my-talks"/><category term="xss"/><category term="recovered"/></entry><entry><title>Quoting Dion Almaer</title><link href="https://simonwillison.net/2008/May/27/ajaxian/#atom-tag" rel="alternate"/><published>2008-05-27T17:58:18+00:00</published><updated>2008-05-27T17:58:18+00:00</updated><id>https://simonwillison.net/2008/May/27/ajaxian/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure"&gt;&lt;p&gt;If we see good usage, we can work with browser vendors to automatically ship these libraries. Then, if they see the URLs that we use, they could auto load the libraries, even special JIT'd ones, from their local system. Thus, no network hit at all!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure"&gt;Dion Almaer&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dion-almaer"&gt;dion-almaer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/libraries"&gt;libraries&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="browsers"/><category term="dion-almaer"/><category term="google"/><category term="libraries"/></entry><entry><title>Google AJAX Libraries API</title><link href="https://simonwillison.net/2008/May/27/ajax/#atom-tag" rel="alternate"/><published>2008-05-27T17:56:47+00:00</published><updated>2008-05-27T17:56:47+00:00</updated><id>https://simonwillison.net/2008/May/27/ajax/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google AJAX Libraries API&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Google are hosting copies of jQuery, Prototype, mooTools and Dojo on their CDN, with a promise to permanently host different versions and an optional JavaScript API to dynamically load the most recent version of a library. I wish they’d stop capitalising Ajax though.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://ajaxian.com/archives/announcing-ajax-libraries-api-speed-up-your-ajax-apps-with-googles-infrastructure"&gt;Ajaxian&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cdn"&gt;cdn&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dojo"&gt;dojo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jquery"&gt;jquery&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/libraries"&gt;libraries&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mootools"&gt;mootools&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prototype-js"&gt;prototype-js&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="cdn"/><category term="dojo"/><category term="google"/><category term="jquery"/><category term="libraries"/><category term="mootools"/><category term="prototype-js"/></entry><entry><title>Google Maps now shows photos and Wikipedia articles</title><link href="https://simonwillison.net/2008/May/14/google/#atom-tag" rel="alternate"/><published>2008-05-14T19:10:47+00:00</published><updated>2008-05-14T19:10:47+00:00</updated><id>https://simonwillison.net/2008/May/14/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://maps.google.com/"&gt;Google Maps now shows photos and Wikipedia articles&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Click the “More...” button. My first thought was “how do they get so many photo markers on the map?”—Firebug shows that they’re generating tiles on the server containing multiple photo markers, then when you click on one an Ajax call checks which photo is in that particular spot.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-maps"&gt;google-maps&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/wikipedia"&gt;wikipedia&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="google-maps"/><category term="javascript"/><category term="wikipedia"/></entry><entry><title>Google AJAX Search API: Flash and Server Side Access</title><link href="https://simonwillison.net/2008/Apr/22/google/#atom-tag" rel="alternate"/><published>2008-04-22T19:16:50+00:00</published><updated>2008-04-22T19:16:50+00:00</updated><id>https://simonwillison.net/2008/Apr/22/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googleajaxsearchapi.blogspot.com/2008/04/flash-and-server-side-access.html"&gt;Google AJAX Search API: Flash and Server Side Access&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Over a year after Google shot down their SOAP Search API, they’ve quietly released a JSON based one under the guise of supporting “Flash and other non JavaScript environments”. Comes with the strange requirement that an HTTP referer be sent with every request; the API key is optional.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/json"&gt;json&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/search"&gt;search&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/soap"&gt;soap&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/web-services"&gt;web-services&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="apis"/><category term="google"/><category term="json"/><category term="search"/><category term="soap"/><category term="web-services"/></entry><entry><title>Reading binary files using Ajax</title><link href="https://simonwillison.net/2008/Apr/22/reading/#atom-tag" rel="alternate"/><published>2008-04-22T19:02:02+00:00</published><updated>2008-04-22T19:02:02+00:00</updated><id>https://simonwillison.net/2008/Apr/22/reading/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nagoon97.wordpress.com/2008/04/06/reading-binary-files-using-ajax/"&gt;Reading binary files using Ajax&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
There’s a simple trick for Firefox, and (amazingly) you can get IE to play along using a function written in VBScript.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/binary"&gt;binary&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firefox"&gt;firefox&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/internet-explorer"&gt;internet-explorer&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vbscript"&gt;vbscript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xmlhttprequest"&gt;xmlhttprequest&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="binary"/><category term="firefox"/><category term="internet-explorer"/><category term="javascript"/><category term="vbscript"/><category term="xmlhttprequest"/></entry><entry><title>Mibbit</title><link href="https://simonwillison.net/2008/Apr/19/mibbit/#atom-tag" rel="alternate"/><published>2008-04-19T15:53:49+00:00</published><updated>2008-04-19T15:53:49+00:00</updated><id>https://simonwillison.net/2008/Apr/19/mibbit/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.mibbit.com/"&gt;Mibbit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Excellent web-based IRC client, should be great for when pesky firewalls get in the way. Also a good candidate for use with a site-specific browser.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://twitter.com/Natbat/statuses/792499743"&gt;Nat&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ajax"&gt;ajax&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/irc"&gt;irc&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mibbit"&gt;mibbit&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sitespecificbrowsers"&gt;sitespecificbrowsers&lt;/a&gt;&lt;/p&gt;



</summary><category term="ajax"/><category term="irc"/><category term="mibbit"/><category term="sitespecificbrowsers"/></entry></feed>