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

<channel>
	<title>Barryvan &#187; browsers</title>
	<atom:link href="http://www.barryvan.com.au/tag/browsers/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.barryvan.com.au</link>
	<description>Music, Programming, Design</description>
	<lastBuildDate>Mon, 23 Aug 2010 04:12:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CSS Columns</title>
		<link>http://www.barryvan.com.au/2009/10/css-columns/</link>
		<comments>http://www.barryvan.com.au/2009/10/css-columns/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 13:01:09 +0000</pubDate>
		<dc:creator>Barry van Oudtshoorn</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.barryvan.com.au/?p=295</guid>
		<description><![CDATA[In this post, I will walk through the new columns specification that arrived in CSS 3. I will show you the current implementation state of columns in the four major rendering engines: Gecko (Firefox), Webkit (Safari &#038; Chrome), Trident (Internet Explorer), and Presto (Opera). Before we get on to platform-specific issues and workarounds, though, we&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>In this post, I will walk through the new columns specification that arrived in CSS 3. I will show you the current implementation state of columns in the four major rendering engines: Gecko (Firefox), Webkit (Safari &#038; Chrome), Trident (Internet Explorer), and Presto (Opera).</p>
<p>Before we get on to platform-specific issues and workarounds, though, we&#8217;ll look at the various CSS properties available for working with columns.</p>
<p>For more in-depth information on columns, you should check out the <a href="http://www.w3.org/TR/css3-multicol/">W3C working draft</a> and Mozilla&#8217;s <a href="https://developer.mozilla.org/en/CSS3_Columns">MDC page on columns</a>. The Webkit blog <a href="http://webkit.org/blog/88/css3-multi-column-support/">also has an article</a>, but it&#8217;s not particularly informative.</p>
<h2>Contents</h2>
<ul>
<li>
		<a href="#capabilities">Browser capabilities</a>
	</li>
<li>
		<a href="#bugs">Browser bugs</a></p>
<ul>
<li><a href="#gecko-bugs">Gecko</a></li>
<li><a href="#webkit-bugs">Webkit</a></li>
</ul>
</li>
<li>
		<a href="#properties">Properties</a></p>
<ul>
<li><a href="#column-count">column-count</a></li>
<li><a href="#column-width">column-width</a></li>
<li><a href="#columns">columns</a></li>
<li><a href="#column-gap">column-gap</a></li>
<li><a href="#column-rule-color">column-rule-color</a></li>
<li><a href="#column-rule-style">column-rule-style</a></li>
<li><a href="#column-rule-width">column-rule-width</a></li>
<li><a href="#column-rule">column-rule</a></li>
<li><a href="#column-span">column-span</a></li>
<li><a href="#column-fill">column-fill</a></li>
</ul>
</li>
</ul>
<p>I will add more to this entry as I discover more about columns &#8212; the goal is to make it an easy-to-understand reference.</p>
<h2><a name="capabilities" href="#capabilities">Browser capabilities</a></h2>
<table class="capabilities" cellspacing="0" cellpadding="0">
<thead>
<tr>
<td>Property</td>
<td>Gecko</td>
<td>Webkit</td>
<td>Trident</td>
<td>Presto</td>
</tr>
</thead>
<tbody>
<tr>
<td class="property"><a href="#column-count">column-count</a></td>
<td class="full">-moz-column-count</td>
<td class="full">-webkit-column-count</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-width">column-width</a></td>
<td class="full">-moz-column-width</td>
<td class="full">-webkit-column-width</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#columns">columns</a></td>
<td class="none">&#10007;</td>
<td class="full">-webkit-columns</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-gap">column-gap</a></td>
<td class="full">-moz-column-gap</td>
<td class="full">-webkit-column-gap</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-rule-color">column-rule-color</a></td>
<td class="partial"><a href="#gecko-bugs">-moz-column-rule-color</a></td>
<td class="full">-webkit-column-rule-color</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-rule-style">column-rule-style</a></td>
<td class="partial"><a href="#gecko-bugs">-moz-column-rule-style</a></td>
<td class="full">-webkit-column-rule-style</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-rule-width">column-rule-width</a></td>
<td class="partial"><a href="#gecko-bugs">-moz-column-rule-width</a></td>
<td class="full">-webkit-column-rule-width</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-rule">column-rule</a></td>
<td class="partial"><a href="#gecko-bugs">-moz-column-rule</a></td>
<td class="full">column-rule</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-span">column-span</a></td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property"><a href="#column-fill">column-fill</a></td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property">break-before</a></td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
<tr>
<td class="property">break-inside</a></td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
<td class="none">&#10007;</td>
</tr>
</tbody>
</table>
<p>Browsers used for testing: Firefox 3.5.4 (Windows), Safari 4.0.2 (Windows), Internet Explorer 8.0.6001, Opera 10.00 (Windows)</p>
<p>Please let me know if this table is inaccurate, and I will update it.</p>
<h2><a name="bugs" href="#bugs">Browser bugs</a></h2>
<p>These are the bugs that I have encountered using CSS columns &#8212; if you know of more, please let me know, and I&#8217;ll add them to these lists.</p>
<h3><a name="gecko-bugs" href="#gecko-bugs">Gecko bugs</a></h3>
<ul>
<li>Specifying an &#8220;overflow&#8221; (or &#8220;overflow-x&#8221; or &#8220;overflow-y&#8221;) property on an element with columns prevents the column rule from being rendered at all.</li>
<li>Column rules occasionally don&#8217;t render, regardless of the &#8220;overflow&#8221; property.</li>
<li>There is no way to break columns.</li>
</ul>
<h3><a name="webkit-bugs" href="#webkit-bugs">Webkit bugs</a></h3>
<ul>
<li>Pixel creep: Pixels from a later column can creep back to the bottom of the previous column. This can happen with plain text, but it is much more noticeable when you use a non-layout altering effect like text-shadow or box-shadow.</li>
<li>Text that overflows the column horizontally is chopped off</li>
<li>There is no way to break columns.</li>
</ul>
<h2><a name="properties" href="#properties">Properties</a></h2>
<h3><a name="column-count" href="#column-count">column-count</a></h3>
<p><strong>Value:</strong> <integer> | auto<br />
<strong>Initial value:</strong> auto</p>
<p>If you don&#8217;t set the <a href="#column-width">column-width</a> property, <a href="#column-count">column-count</a> specifies the number of columns into which the content should be flowed.</p>
<p>If you specify <a href="#column-width">column-width</a>, <a href="#column-count">column-count</a> imposes a limit on the maximum number of columns to be rendered if you supply a numeric value.</p>
<h3><a name="column-width" href="#column-width">column-width</a></h3>
<p><strong>Value:</strong> <length> | auto<br />
<strong>Initial value:</strong> auto</p>
<p>This property indicates the <em>optimal</em> column width &#8212; columns may be rendered narrower or wider by the UA, according to the available space.</p>
<p>If <a href="#column-width">column-width</a> has the value &#8220;auto&#8221;, then the width of the columns is determined by other means (for example, <a href="#column-count">column-count</a>).</p>
<h3><a name="columns" href="#columns">columns</a></h3>
<p><strong>Value:</strong> <a href="#column-width">column-width</a> &#038;&#038; <a href="#column-count">column-count</a></p>
<p>The <a href="#columns">columns</a> property is a short-hand property, used to set both <a href="#column-width">column-width</a> and <a href="#column-count">column-count</a> simultaneously.</p>
<h3><a name="column-gap" href="#column-gap">column-gap</a></h3>
<p><strong>Value:</strong> <length> | normal<br />
<strong>Initial value:</strong> normal</p>
<p>Use <a href="#column-gap">column-gap</a> to specify the size of the gutter that lies between columns. Most UAs will render &#8220;normal&#8221; as 1em.</p>
<h3><a name="column-rule-color" href="#column-rule-color">column-rule-color</a></h3>
<p><strong>Value:</strong><br />
<color>
<p>When a <a href="#column-rule">column-rule</a> is specified, you may use <a href="#column-rule-color">column-rule-color</a> to set the colour for the line drawn between columns. This property is approximately equivalent to the various border-(?)-color properties.</p>
<h3><a name="column-rule-style" href="#column-rule-style">column-rule-style</a></h3>
<p><strong>Value:</strong> <border-style></p>
<p>By using <a href="#column-rule-style">column-rule-style</a>, you may determine how the line between columns is to be rendered, if at all. Similar to border-(?)-style.</p>
<h3><a name="column-rule-width" href="#column-rule-width">column-rule-width</a></h3>
<p><strong>Value:</strong> <border-width><br />
<strong>Initial value:</strong> medium</p>
<p><a href="#column-rule-width">column-rule-width</a> sets the width of the line rendered in the gutter between columns. Basically, it&#8217;s the same as the border-(?)-width properties.</p>
<h3><a name="column-rule" href="#column-rule">column-rule</a></h3>
<p><strong>Value:</strong> <a href="#column-rule-width">column-rule-width</a> &#038;&#038; <a href="#column-rule-style">column-rule-style</a> &#038; &#038; <a href="#column-rule-color">column-rule-color</a></p>
<p>Shorthand for setting all three column-rule properties.</p>
<h3><a name="column-span" href="#column-span">column-span</a></h3>
<p><strong>Value:</strong> 1 | all<br />
<strong>Initial value:</strong> 1</p>
<p>By using <a href="#column-span">column-span</a>, you can allow an element to span either the entire set of columns, or none at all.</p>
<p>Note that you cannot set an arbitrary number of columns to span &#8212; this property essentially &#8216;interrupts&#8217; the column flow and restarts it below the spanned element.</p>
<h3><a name="column-fill" href="#column-fill">column-fill</a></h3>
<p><strong>Value:</strong> auto | balance<br />
<strong>Initial value:</strong> balance</p>
<p>If you have set a height for your columnified element, setting <a href="#column-fill">column-fill</a> to &#8216;auto&#8217; will cause the columns to be &#8216;filled&#8217; in turn, rather than have the content balanced equally between them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barryvan.com.au/2009/10/css-columns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internet Explorer DOMDocument &amp; XPath</title>
		<link>http://www.barryvan.com.au/2009/04/internet-explorer-domdocument-xpath/</link>
		<comments>http://www.barryvan.com.au/2009/04/internet-explorer-domdocument-xpath/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 04:10:38 +0000</pubDate>
		<dc:creator>Barry van Oudtshoorn</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xpath]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.barryvan.com.au/?p=144</guid>
		<description><![CDATA[I discovered a couple of interesting things about Internet Explorer&#8217;s MSXML2.DOMDocument object. It turns out that there are essentially two &#8220;production-quality&#8221; versions of it available: 3.0 and 6.0. Version 6.0 is much the better version, but it&#8217;s quite new, and not available on all systems. This means that in IE7 and IE8, instantiating a new [...]]]></description>
			<content:encoded><![CDATA[<p>I discovered a couple of interesting things about Internet Explorer&#8217;s MSXML2.DOMDocument object. It turns out that there are essentially two &#8220;production-quality&#8221; versions of it available: 3.0 and 6.0. Version 6.0 is much the better version, but it&#8217;s quite new, and not available on all systems. This means that in IE7 and IE8, instantiating a new MSXML2.DOMDocument object gives you version 3.0.</p>
<p>Now most of the time, this isn&#8217;t a problem. Today, though, I was constructing an XPath expression that used the substring() function; something like this:</p>
<pre class="brush: xml">//Element[substring(Child, 1, 3)=&#039;abc&#039;]</pre>
<p>This will pull all Elements with a Child element whose value&#8217;s first three characters are &#8220;abc&#8221;. Not particularly complex. It turns out, though, that version 3.0 or the DOMDocument doesn&#8217;t actually use XPath as its default language: it uses a bastardised version of XPath called &#8220;XSLPatterns&#8221;, which just so happens to not support the substring() function at all.</p>
<p>So how do we deal with this situation? One way is to always instantiate version 6.0 of the DOMDocument:</p>
<pre class="brush: javascript">xd = new ActiveXObject(&#039;msxml2.DOMDocument.6.0&#039;)</pre>
<p>The problem with this approach is that, like I mentioned earlier, you can&#8217;t always be guaranteed that your users will have version 6.0 installed (even though it&#8217;s a free download). The safer way to deal with this problem is to switch the expression language to XPath in your 3.0 object:</p>
<pre class="brush: javascript">xd = new ActiveXObject(&#039;msxml2.DOMDocument&#039;);
xd.setProperty(&quot;SelectionLanguage&quot;, &quot;XPath&quot;);</pre>
<p>The advantage of this approach is that you&#8217;re not specifying a version, so when MS eventually changes the default to 7.0 (or whatever), your code will work without a problem.</p>
<p>For more information on this, check out  <a title="Microsoft XML Team's WebLog: Using the right version of MSXML in Internet Explorer" href="http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx">this blog post</a> from Microsoft&#8217;s XML team, which goes into a little bit more detail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barryvan.com.au/2009/04/internet-explorer-domdocument-xpath/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript-generated tables and rowspan</title>
		<link>http://www.barryvan.com.au/2009/04/javascript-generated-tables-and-rowspan/</link>
		<comments>http://www.barryvan.com.au/2009/04/javascript-generated-tables-and-rowspan/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 10:24:43 +0000</pubDate>
		<dc:creator>Barry van Oudtshoorn</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.barryvan.com.au/?p=130</guid>
		<description><![CDATA[At work, I&#8217;ve recently been putting together a nice little calendar-like utility using Javascript. Basically, it has to generate a table consisting of cells which may span multiple rows. Surely the solution is simple enough: just set the rowspan on each td as we create it. Unfortunately, that doesn&#8217;t work, at least not in Firefox. [...]]]></description>
			<content:encoded><![CDATA[<p>At work, I&#8217;ve recently been putting together a nice little calendar-like utility using Javascript. Basically, it has to generate a table consisting of cells which may span multiple rows. Surely the solution is simple enough: just set the <em>rowspan</em> on each <em>td</em> as we create it. Unfortunately, that doesn&#8217;t work, at least not in Firefox.</p>
<p>It appears that in Firefox, if you create a <em>td</em> and set its <em>rowspan</em> to some value <strong>when there are no rows for it to expand into</strong>, the attribute will be completely ignored, <strong>even if you add rows afterwards</strong>! Needless to say, this is very annoying. The solution? Build your table backwards.</p>
<p>The code I have now is something like this (note that I&#8217;m developing using the Mootools framework):</p>
<pre class="brush: javascript">var tbl = new Element(&#039;table&#039;);
var trs = new Array();

for (var i = 0; i &lt; 4; i++) {
  var tr = new Element(&#039;tr&#039;);
  tr.grab(new Element(&#039;td&#039;, {
    &#039;html&#039;: &#039;Cell &#039; + i
  }));
  if (i % 2 == 0) {
    tr.grab(new Element(&#039;td&#039;, {
      &#039;rowspan&#039;: 2,
      &#039;html&#039;: &#039;Span &#039; + (i / 2)
    }));
  }
  trs.push(tr);
}

for (var i = trs.length - 1; i &gt;= 0; i--) {
  tbl.grab(trs[i], &#039;top&#039;);
}</pre>
<p>What does this code do? Well basically, we&#8217;re creating a table with ten rows and two columns; the cells in the right-hand column each occupy two rows. The result will be something like this:</p>
<table style="border:solid 1px blue;width:50%;">
<tr>
<td style="border:solid 1px black;">Cell 1</td>
<td rowspan="2" style="border:solid 1px red;">Span 1</td>
</tr>
<tr>
<td style="border:solid 1px black;">Cell 2</td>
</tr>
<tr>
<td style="border:solid 1px black;">Cell 3</td>
<td rowspan="2" style="border:solid 1px red;">Span 2</td>
</tr>
<tr>
<td style="border:solid 1px black;">Cell 4</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.barryvan.com.au/2009/04/javascript-generated-tables-and-rowspan/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web developer tools</title>
		<link>http://www.barryvan.com.au/2009/01/web-developer-tools/</link>
		<comments>http://www.barryvan.com.au/2009/01/web-developer-tools/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 19:10:52 +0000</pubDate>
		<dc:creator>Barry van Oudtshoorn</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web design]]></category>
		<category><![CDATA[browsers]]></category>

		<guid isPermaLink="false">http://www.barryvan.com.au/?p=89</guid>
		<description><![CDATA[In this post, I&#8217;ll outline some of the web developer tools available in the major browsers: Firefox, Internet Explorer, Opera and Safari. This is a wholly subjective post, based on my experience as one of two developers on a very large AJAX application at Saron Education. Firefox Firefox has arguably got the best web development [...]]]></description>
			<content:encoded><![CDATA[<p>In this post, I&#8217;ll outline some of the web developer tools available in the major browsers: Firefox, Internet Explorer, Opera and Safari. This is a wholly subjective post, based on my experience as one of two developers on a very large AJAX application at <a title="Saron Education" href="http://www.saroneducation.com/">Saron Education</a>.</p>
<h2>Firefox</h2>
<p>Firefox has arguably got the best web development tools available, all of which can be downloaded from the <a title="Firefox Addons" href="https://addons.mozilla.org/en-US/firefox/">Firefox Addons</a> site. The two which I find most useful are the <a title="Firefox Addon: Web developer toolbar" href="https://addons.mozilla.org/en-US/firefox/addon/60">Web Developer Toolbar</a>, by <a title="Chris Pederick" href="http://chrispederick.com/work/web-developer/">Chris Pederick</a>, and the often-copied <a title="Firefox Addon: Firebug" href="https://addons.mozilla.org/en-US/firefox/addon/1843">Firebug</a> (<a href="http://www.getfirebug.com">official website</a>), which itself sports a variety of addons.</p>
<h3>Web Developer Toolbar</h3>
<p>The web developer toolbar is useful for quickly enabling and disabling features of your site, checking CSS, emulating mobile browser rendering, and controlling Firefox more precisely. Personally, I find its most useful features are the ability to:</p>
<ul>
<li>Disable the browser cache entirely, which removes the need for Control-Refresh or cache-clearing;</li>
<li>Outline deprecated elements, or any particular set of elements in a variety of fashions, which is very useful for updating old sites;</li>
<li>Extract colour information from the current website; and</li>
<li>View the cookie information for the current site.</li>
</ul>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/60">Download the Web Developer Toolbar</a></p>
<h3>Firebug</h3>
<p>I sometimes wonder how I ever managed to develop web applications without Firebug. Firebug allows you to alter CSS styles on the fly, edit the HTML contents of the page on the fly, visually watch the DOM being changed by your scripts, debug your scripts, type and run JavaScript straight from the browser, visualise network activity, inspect XMLHttpRequests, and much much more besides. Firebug is, in my experience, the most mature, stable, and efficient of all the tools in this survey.</p>
<p>The features of Firebug which I find most useful are:</p>
<ul>
<li>The ability to &#8216;inspect&#8217; the DOM visually (by clicking on elements within the page), then alter their attributes, styles, and even their content dynamically;</li>
<li>The ability to watch the effects of DOM alterations by running scripts;</li>
<li>The console, with which you can craft and run JavaScript which is run as though it were part of the page itself;</li>
<li>The network monitor, which allows you to view all the POSTs and GETs your XMLHttpRequests create.</li>
</ul>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/1843">Download Firebug</a></p>
<h2>Internet Explorer</h2>
<p>Until IE 8, the tools available to developers in IE were woeful at best. Fortunately, however, Microsoft has got their act together, and mimicked Firebug for version 8. The features made available in this tool include</p>
<ul>
<li>The ability to interrogate the DOM to view style information about elements (changing attributes and styles hardly ever seems to work in the latest Beta, so viewing them is all you can really achieve);</li>
<li>A console, with which you can craft and run Javascript as though it were embedded in the page;</li>
<li>Javascript debugging.</li>
</ul>
<p>Unfortunately, these tools are still very much in beta, and are very buggy. As I mentioned, altering element attributes and styles hardly has any effect. Also, the CSS inspection system is poorly laid out and often just plain wrong. The console is well-implemented. The entire system is definitely a step in the right direction, but it suffers from bugs and lack of innovation. Also, it seems to slow down and destabilise the entire browser.</p>
<p>Internet Explorer 8&#8242;s developer tools are built in; access them with the F12 key.</p>
<h2>Opera</h2>
<p>Opera&#8217;s developer tools, codenamed &#8216;Dragonfly&#8217;, sit between Firebug and IE in terms of functionality and facility. The DOM inspection and manipulation tools work really well (as well as Firebug), and are more immediately configurable, thanks to a variety of toolbar buttons. Dragonfly doesn&#8217;t have a console; rather, it uses a &#8216;command line&#8217; interface. The difference is that where the console in Firebug and IE has seperate areas for input and output (what you type and what it does), the command line mixes these two together, much like a Unix shell or DOS. Personally, I prefer the console paradigm, but it&#8217;s much of a muchness.</p>
<p>Opera&#8217;s Dragonfly is built in; access it by going to Tools -&gt; Advanced -&gt; Developer tools.</p>
<h2>Safari</h2>
<p>As with most Apple products, the developer tools in Safari are very pretty. There is a console akin to that in Firebug and IE, and you can inspect and manipulate the DOM. Unfortunately, however, the tools are quite buggy, and often fall down. Whilst the tools are very pretty, they don&#8217;t seem to be as stable even as IE 8&#8242;s.</p>
<p>Safari&#8217;s web developer tools are built in; access them enabling the develop menu from the Advanced tab of the config, then choosing the appropriate menu item from the Develop menu.</p>
<h2>Conclusions</h2>
<p>Whilst Firebug is still by far the best tool available for web developers, the widespread development of tools by browser developers means that cross-browser debugging and development is becoming ever easier. Hopefully the tools will foster competition, so that feature sets and stability improve in all the tools.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.barryvan.com.au/2009/01/web-developer-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
