<?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>Architecting Life &#187; Firefox</title>
	<atom:link href="http://xujiwei.com/blog/tags/firefox/feed/" rel="self" type="application/rss+xml" />
	<link>http://xujiwei.com/blog</link>
	<description>Just do it</description>
	<lastBuildDate>Wed, 28 Dec 2011 02:06:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Firefox与IE兼容性：getAttribute的返回值类型</title>
		<link>http://xujiwei.com/blog/return-value-of-getattribute/</link>
		<comments>http://xujiwei.com/blog/return-value-of-getattribute/#comments</comments>
		<pubDate>Tue, 15 May 2007 15:00:25 +0000</pubDate>
		<dc:creator>Xu Jiwei</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.xujiwei.com/blog/?p=206</guid>
		<description><![CDATA[<a href="http://xujiwei.com/blog/return-value-of-getattribute/" title="Firefox与IE兼容性：getAttribute的返回值类型"></a>在改AJAXRequest的过程中，碰到了个问题，应该算是Firefox和IE之间的兼容性问题。 提交表单时，往往需要先对表单进行验证，而这个验证的过程一般是放在form标签的onsubmit属性中。 onsubmit一般是由浏览器在form的submit动作发生时自动触发，但是如果表单由我们自己来提交，比如在AJAX应用中，就是由我们自己写程序将表单转换成请求字符串，再通过XMLHttpRequest发送到服务器，那么如果在此同时不丢掉表单验证的话，就需要我们自己来获取onsubmit属性，并去处理它。 在获取属性时，为了保证兼容性，我用getAttribute来获取标签的属性值，但是发获取了onsubmit属性之后，发现在Firefox和IE中使用getAttribute(&#8220;onsubmit&#8221;)所返回的返回值类型是不同的。 测试代码如下： // code by xujiwei from www.xujiwei.cn&#60;br /&#62;&#60;br /&#62; // Firefox中提示框内容为string，IE中为function&#60;br /&#62;&#60;br /&#62; &#60;form id=&#8221;test&#8221; onsubmit=&#8221;return validform();&#8221;&#62;&#60;br /&#62;     Name: &#60;input type=&#8221;text&#8221; id=&#8221;name&#8221; /&#62;&#60;br /&#62;&#60;br /&#62;     &#60;input type=&#8221;button&#8221; onclick=&#8221;validate();&#8221; value=&#8221;Validate&#8221; /&#62;&#60;br /&#62; &#60;/form&#62;&#60;br /&#62; &#60;script type=&#8221;text/javascript&#8221;&#62;&#60;br /&#62; &#60;!&#8211;&#60;br /&#62;     function validform() {&#60;br /&#62;         return (document.getElementById(&#8220;name&#8221;).value!=&#8221;");&#60;br /&#62;     }&#60;br /&#62;     alert(typeof(document.getElementById(&#8220;test&#8221;).getAttribute(&#8220;onsubmit&#8221;)));&#60;br /&#62; //&#8211;&#62;&#60;br /&#62; &#60;/script&#62; [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行] 在Firefox中使用getAttribute(&#8220;onsubmit&#8221;)返回值的是一个字符串，而在IE中的返回值类型则是function，也就是一个函数，因此如果在IE中处理onsubmit，我们可以直接调用这个函数： // code by xujiwei from www.xujiwei.cn&#60;br /&#62;&#60;br /&#62; // 注意，下面这段代码只能在IE中正常运行&#60;br /&#62;&#60;br /&#62; &#8230;<p class="read-more"><a href="http://xujiwei.com/blog/return-value-of-getattribute/">Read more &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://xujiwei.com/blog/return-value-of-getattribute/" title="Firefox与IE兼容性：getAttribute的返回值类型"></a><p>在改AJAXRequest的过程中，碰到了个问题，应该算是Firefox和IE之间的兼容性问题。</p>

<p>提交表单时，往往需要先对表单进行验证，而这个验证的过程一般是放在form标签的onsubmit属性中。</p>

<p>onsubmit一般是由浏览器在form的submit动作发生时自动触发，但是如果表单由我们自己来提交，比如在AJAX应用中，就是由我们自己写程序将表单转换成请求字符串，再通过XMLHttpRequest发送到服务器，那么如果在此同时不丢掉表单验证的话，就需要我们自己来获取onsubmit属性，并去处理它。</p>

<p>在获取属性时，为了保证兼容性，我用getAttribute来获取标签的属性值，但是发获取了onsubmit属性之后，发现在Firefox和IE中使用getAttribute(&#8220;onsubmit&#8221;)所返回的返回值类型是不同的。</p>

<p>测试代码如下：</p>

<p><textarea id="HTML_7235" class="textbox" style="width: 90%;" cols="50" rows="8">// code by xujiwei from www.xujiwei.cn&lt;br /&gt;&lt;br /&gt; // Firefox中提示框内容为string，IE中为function&lt;br /&gt;&lt;br /&gt; &lt;form id=&#8221;test&#8221; onsubmit=&#8221;return validform();&#8221;&gt;&lt;br /&gt;     Name: &lt;input type=&#8221;text&#8221; id=&#8221;name&#8221; /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;input type=&#8221;button&#8221; onclick=&#8221;validate();&#8221; value=&#8221;Validate&#8221; /&gt;&lt;br /&gt; &lt;/form&gt;&lt;br /&gt; &lt;script type=&#8221;text/javascript&#8221;&gt;&lt;br /&gt; &lt;!&#8211;&lt;br /&gt;     function validform() {&lt;br /&gt;         return (document.getElementById(&#8220;name&#8221;).value!=&#8221;");&lt;br /&gt;     }&lt;br /&gt;     alert(typeof(document.getElementById(&#8220;test&#8221;).getAttribute(&#8220;onsubmit&#8221;)));&lt;br /&gt; //&#8211;&gt;&lt;br /&gt; &lt;/script&gt;</textarea></p>

<p><input class="button" onclick="runCode('HTML_7235');" type="button" value="运行代码" /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>

<p>在Firefox中使用getAttribute(&#8220;onsubmit&#8221;)返回值的是一个字符串，而在IE中的返回值类型则是function，也就是一个函数，因此如果在IE中处理onsubmit，我们可以直接调用这个函数：</p>

<p><textarea id="HTML_6048" class="textbox" style="width: 90%;" cols="50" rows="8">// code by xujiwei from www.xujiwei.cn&lt;br /&gt;&lt;br /&gt; // 注意，下面这段代码只能在IE中正常运行&lt;br /&gt;&lt;br /&gt; &lt;form id=&#8221;test&#8221; onsubmit=&#8221;return validform();&#8221;&gt;&lt;br /&gt;     Name: &lt;input type=&#8221;text&#8221; id=&#8221;name&#8221; /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;input type=&#8221;button&#8221; onclick=&#8221;validate();&#8221; value=&#8221;Validate&#8221; /&gt;&lt;br /&gt; &lt;/form&gt;&lt;br /&gt; &lt;script type=&#8221;text/javascript&#8221;&gt;&lt;br /&gt; &lt;!&#8211;&lt;br /&gt;     function validform() {&lt;br /&gt;         return (document.getElementById(&#8220;name&#8221;).value!=&#8221;");&lt;br /&gt;     }&lt;br /&gt;     function validate() {&lt;br /&gt;         var vaf=document.getElementById(&#8220;test&#8221;).getAttribute(&#8220;onsubmit&#8221;);&lt;br /&gt;         if(vaf())&lt;br /&gt;             alert(&#8220;OK&#8221;);&lt;br /&gt;         else&lt;br /&gt;             alert(&#8220;Error&#8221;);&lt;br /&gt;     }&lt;br /&gt; //&#8211;&gt;&lt;br /&gt; &lt;/script&gt;</textarea></p>

<p><input class="button" onclick="runCode('HTML_6048');" type="button" value="运行代码" /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>

<p>但是，在Firefox中，使用getAttribute(&#8220;onsubmit&#8221;)返回的是一个字符串，因此就不能直接这样使用了，而应该将字符串转换成函数再去调用：</p>

<p><textarea id="HTML_5123" class="textbox" style="width: 90%;" cols="50" rows="8">// code by xujiwei from www.xujiwei.cn&lt;br /&gt;&lt;br /&gt; // 注意，下面这段代码只能在Firefox中正常运行&lt;br /&gt;&lt;br /&gt; &lt;form id=&#8221;test&#8221; onsubmit=&#8221;return validform();&#8221;&gt;&lt;br /&gt;     Name: &lt;input type=&#8221;text&#8221; id=&#8221;name&#8221; /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;input type=&#8221;button&#8221; onclick=&#8221;validate();&#8221; value=&#8221;Validate&#8221; /&gt;&lt;br /&gt; &lt;/form&gt;&lt;br /&gt; &lt;script type=&#8221;text/javascript&#8221;&gt;&lt;br /&gt; &lt;!&#8211;&lt;br /&gt;     function validform() {&lt;br /&gt;         return (document.getElementById(&#8220;name&#8221;).value!=&#8221;");&lt;br /&gt;     }&lt;br /&gt;     function validate() {&lt;br /&gt;         // 使用new Function将字符串转换成函数&lt;br /&gt;         var vaf=new Function(document.getElementById(&#8220;test&#8221;).getAttribute(&#8220;onsubmit&#8221;));&lt;br /&gt;         if(vaf())&lt;br /&gt;             alert(&#8220;OK&#8221;);&lt;br /&gt;         else&lt;br /&gt;             alert(&#8220;Error&#8221;);&lt;br /&gt;     }&lt;br /&gt; //&#8211;&gt;&lt;br /&gt; &lt;/script&gt;</textarea></p>

<p><input class="button" onclick="runCode('HTML_5123');" type="button" value="运行代码" /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>

<p>如果把上面这段代码在IE中运行，那么会发现无论是否在输入框中输入值，都会显示“Error”。</p>

<p>因此，如果要解决这个问题，可以在使用getAttribute获取onsubmit属性值之后，判断返回值类型是否为字符串，如果是字符串就使用new Function将它转换成函数：</p>

<p><textarea id="HTML_2858" class="textbox" style="width: 90%;" cols="50" rows="8">// code by xujiwei from www.xujiwei.cn&lt;br /&gt;&lt;br /&gt; // 注意，下面这段代码在Firefox和IE中均能正常运行&lt;br /&gt;&lt;br /&gt; &lt;form id=&#8221;test&#8221; onsubmit=&#8221;return validform();&#8221;&gt;&lt;br /&gt;     Name: &lt;input type=&#8221;text&#8221; id=&#8221;name&#8221; /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;input type=&#8221;button&#8221; onclick=&#8221;validate();&#8221; value=&#8221;Validate&#8221; /&gt;&lt;br /&gt; &lt;/form&gt;&lt;br /&gt; &lt;script type=&#8221;text/javascript&#8221;&gt;&lt;br /&gt; &lt;!&#8211;&lt;br /&gt;     function validform() {&lt;br /&gt;         return (document.getElementById(&#8220;name&#8221;).value!=&#8221;");&lt;br /&gt;     }&lt;br /&gt;     function validate() {&lt;br /&gt;         var vaf=document.getElementById(&#8220;test&#8221;).getAttribute(&#8220;onsubmit&#8221;);&lt;br /&gt;         vaf=typeof(vaf)==&#8221;string&#8221;?new Function(vaf):vaf;&lt;br /&gt;         if(vaf())&lt;br /&gt;             alert(&#8220;OK&#8221;);&lt;br /&gt;         else&lt;br /&gt;             alert(&#8220;Error&#8221;);&lt;br /&gt;     }&lt;br /&gt; //&#8211;&gt;&lt;br /&gt; &lt;/script&gt;</textarea></p>

<p><input class="button" onclick="runCode('HTML_2858');" type="button" value="运行代码" /> [Ctrl+A 全部选择 提示：你可先修改部分代码，再按运行]</p>

<p>这样，就解决了使用getAttribute(&#8220;onsubmit&#8221;)返回值类型不一样的问题，对于其他回调函数如onclick也可以这样处理。当然，如果大家有什么更好的解决方案也可以提出来分享一下:)</p>
]]></content:encoded>
			<wfw:commentRss>http://xujiwei.com/blog/return-value-of-getattribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

