<?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>刘钢的博客 - 我是UED &#187; 时间判断</title>
	<atom:link href="http://www.iamued.com/tag/%e6%97%b6%e9%97%b4%e5%88%a4%e6%96%ad/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>表单验证中时间起止判断的递归处理</title>
		<link>http://www.iamued.com/qianduan/771.html</link>
		<comments>http://www.iamued.com/qianduan/771.html#comments</comments>
		<pubDate>Wed, 16 Dec 2009 12:21:43 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[时间判断]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=771</guid>
		<description><![CDATA[在最近一个项目中，表单验证需要对时间的起止范围进行判断：结束时间需大于或等于开始时间。即：结束年须大于起始年；如果相等，则比较起始月与结束月；如果起止月也相等，则比较日期。那么，对于每一次验证，可以用下面这个函数来进行比较。 这样，在验证的时候，只要结果返回真就表示通过。如： 将上面的起止月份和起止日期修改一下。如： 执行结果，依次显示”月”，”天”，”false”；实际上，当起止月份不正确的时候，我们没必要对日期进行验证；月份验证的前提条件是年验证通过；天验证的前提是月份验证通过。仔细分析之后，我决定将上面函数的三个参数用单体模式存储起来，即： 但是，我又不想定义函数的参数，函数能否根据传递的参数自动进行验证了？答案是肯定的。在函数的开始，先判断参数的个数，如果大于1，则含有递归处理。如何做到递归处理呢？我在函数内部作了如下处理： 对于arguments，我们不能直接调用Array.shift()方法。虽然arguments有length属性，但毕竟不是数组，所以用Array.slice()方法将其转换成数组。关于arguments，在网上可以了解到更多的信息，这里不在赘述。为什么只有在len大于1时才进行处理呢？因为参数为1时，就不需要进行下一步验证了。递归处理在什么时候进行呢？仔细想想，只有在初始值与结束值相等时才需要，明白了这些，我们就很容易构建我们的验证函数了。 上面的代码中，arguments.callee是函数自身，关于apply的用法可以在web查找相关资料。 完整代码如下： 到此验证函数已经完成，但需要注意的是： 虽然没有确定参数的个数，但参数的顺序还是重要的，因为前一个参数的验证结果决定了下一个参数的验证是否继续； parseInt()函数的第二个参数10不要忽略。如果忽略，当遇到以0开始的数值（如07、08）时将会按八进制进行处理。 到此已经结束，看看示例。有时候，我们不想以alert的方式显示错误信息，我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始，取得处理函数，如：   原文：http://www.denisdeng.com/?p=631]]></description>
			<content:encoded><![CDATA[<p style="TEXT-INDENT: 2em">在最近一个项目中，表单验证需要对时间的起止范围进行判断：结束时间需大于或等于开始时间。即：结束年须大于起始年；如果相等，则比较起始月与结束月；如果起止月也相等，则比较日期。那么，对于每一次验证，可以用下面这个函数来进行比较。</p>
<p><span id="more-771"></span></p>
<pre class="brush: jscript; title: ; notranslate">
function compare(begin,end,error){
    var begin = parseInt(begin,10);
    var end = parseInt(end,10);
    var diff = end - begin;
    if(diff &lt; 0){
        alert(error);
    }else{
        return true;
    }
}
</pre>
<p>这样，在验证的时候，只要结果返回真就表示通过。如：</p>
<pre class="brush: jscript; title: ; notranslate">
var year = compare(2001,2003,'年');
var month = compare(1,2,'月');
var day = compare(12,13,'天');
alert(year &amp;&amp; month &amp;&amp; day); //结果为真------&quot;true&quot;
</pre>
<p>将上面的起止月份和起止日期修改一下。如：</p>
<pre class="brush: jscript; title: ; notranslate">
var year = compare(2001,2003,'年');
var month = compare(3,2,'月');
var day = compare(24,13,'天');
alert(year &amp;&amp; month &amp;&amp; day); /结果为假------&quot;false&quot;
</pre>
<p>执行结果，依次显示”月”，”天”，”false”；实际上，当起止月份不正确的时候，我们没必要对日期进行验证；月份验证的前提条件是年验证通过；天验证的前提是月份验证通过。仔细分析之后，我决定将上面函数的三个参数用单体模式存储起来，即：</p>
<pre class="brush: jscript; title: ; notranslate">
{
    begin:2001,
    end:2003,
    error:&quot;结束年限须大于起始年限&quot;
}
</pre>
<p>但是，我又不想定义函数的参数，函数能否根据传递的参数自动进行验证了？答案是肯定的。在函数的开始，先判断参数的个数，如果大于1，则含有递归处理。如何做到递归处理呢？我在函数内部作了如下处理：</p>
<pre class="brush: jscript; title: ; notranslate">
var len = arguments.length;
if(len &gt; 1){
    var args = Array.prototype.slice.call(arguments);
    args.shift(); //将第一个参数移除，余下的用作递归处理的参数
}
</pre>
<p>对于arguments，我们不能直接调用Array.shift()方法。虽然arguments有length属性，但毕竟不是数组，所以用Array.slice()方法将其转换成数组。关于arguments，在网上可以了解到更多的信息，这里不在赘述。为什么只有在len大于1时才进行处理呢？因为参数为1时，就不需要进行下一步验证了。递归处理在什么时候进行呢？仔细想想，只有在初始值与结束值相等时才需要，明白了这些，我们就很容易构建我们的验证函数了。</p>
<pre class="brush: jscript; title: ; notranslate">
var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
if(diff &lt;0 ){
    alert(arguments[0].error);
    return false;
}else if(diff == 0){
    return len &gt; 1 ? arguments.callee.apply(this,args) : true;
}else{
    return true;
}
</pre>
<p>上面的代码中，arguments.callee是函数自身，关于apply的用法可以在web查找相关资料。</p>
<p>完整代码如下：</p>
<pre class="brush: jscript; title: ; notranslate">
function compare(){
    var len = arguments.length;
    if(len &gt; 1){
        var args = Array.prototype.slice.call(arguments);
        args.shift(); //将第一个参数移除，余下的用作递归处理的参数

    }
    var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
    if(diff &lt;0 ){
        alert(arguments[0].error);
        return false;
    }else if(diff == 0){
        return len &gt; 1 ? arguments.callee.apply(this,args) : true;
    }else{
        return true;
    }
}
</pre>
<p>到此验证函数已经完成，但需要注意的是：</p>
<ol>
<li>虽然没有确定参数的个数，但参数的顺序还是重要的，因为前一个参数的验证结果决定了下一个参数的验证是否继续；</li>
<li>parseInt()函数的第二个参数10不要忽略。如果忽略，当遇到以0开始的数值（如07、08）时将会按八进制进行处理。</li>
</ol>
<p>到此已经结束，看看<a href="http://www.iamued.com/demo/validate-range.html" target="_blank">示例</a>。有时候，我们不想以alert的方式显示错误信息，我们可以自定义处理函数将其作为最后一个参数传入其中。那么在函数的开始，取得处理函数，如：</p>
<pre class="brush: jscript; title: ; notranslate">
var func = arguments[len - 1];
if(typeof  func  ==  'function'){
func(arguments[0]);
}
</pre>
<p> </p>
<pre class="brush: jscript; title: ; notranslate">
function compare(){
    var len = arguments.length;
    var func = arguments[len - 1];
    if(len &gt; 1){
        var args = Array.prototype.slice.call(arguments);
        args.shift(); //将第一个参数移除，余下的用作递归处理的参数
    }
    var diff = parseInt(arguments[0].end,10) - parseInt(arguments[0].begin,10);
    if(diff &lt;0 ){
        (typeof  func  ==  'function') ? func(arguments[0].error) : alert(arguments[0].error);
        return false;
    }else if(diff == 0){
        return len &gt; 1 ? arguments.callee.apply(this,args) : true;
    }else{
        return true;
    }
}
</pre>
<p>原文：<a href="http://www.denisdeng.com/?p=631" target="_blank">http://www.denisdeng.com/?p=631</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/771.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

