PHP strtotime计算月份

今天同事发现了一个php的月份bug,说月份列表里怎么出现了两个3月份,代码是大概是这样的:

$month[]=date('Y年m月',strtotime('today'));
$month[]=date('Y年m月',strtotime('-1 month'));
$month[]=date('Y年m月',strtotime('-2 month'));
$month[]=date('Y年m月',strtotime('-3 month'));
$month[]=date('Y年m月',strtotime('-4 month'));
$month[]=date('Y年m月',strtotime('-5 month'));

利用strtotime来计算最近了六个月份,这个bug之前没有被发现因为只有在每月的29,30,31号才会发作:因为php默认取当前时间来做计算,比如今天7月29号减去5个月应该是2月29号,因为今年的2月份没有29号,所以就到了3月份了。 继续阅读

Jquery ContextMenu插件改造

最近需要在页面的表格上使用的右键弹出菜单,考察了下网络上的几个右键菜单发现都不太符合:需要能够用列表来布局菜单,而不是都放在javascript中控制。Jqueryui 的menu插件采用ul和li来布局,但是菜单项仅仅是个超级链接,不能结合当前被右键单击的元素进行动态传递参数和禁用/启用菜单。于是网上找了个插件自己来改造。

首先增加了几个参数:currentTarget用于保存当前的右键单击事件的对象;actions用于根据菜单id来进行函数绑定;selector用于保存当前应用右键菜单的选择器;options对象用于保存一些其他的扩展参数,比如hover为鼠标滑过菜单的css样式,highlight为当前右键单击元素的css样式。actions对象可以包括多个子对象,每一个子对象可以包含两个函数click和disabled,前者响应用户单击菜单事件,后者则指示是否在当前右键对象上禁用相关菜单。两个函数都将传入两个参数:source和li,source为右键单击的(jquery)对象,li则是当前单击的菜单(jquery)对象。 继续阅读

Javascript 中解析XML

通常在Javascript中做数据交换用的都是json也比较方便,但是这次碰到xml字符串解析。查了下,发现不同浏览器还不一样,解析起来倒也不难。

var txt='<?xml version="1.0"?><note>';
txt=txt+'<to id="to">Tove</to>'
txt=txt+'<from>Jani</from>';
txt=txt+'<heading>Reminder</heading>';
txt=txt+'<body>Don\'t forget me this weekend!</body>';
txt=txt+'</note>';
if (window.DOMParser)
{
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(txt,"text/xml");
}
else // Internet Explorer
{
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async=false;
  xmlDoc.loadXML(txt);
}
//获取to的文本值
var to_text=xmlDoc.getElementsByTagName('to')[0].childNodes[0].nodeValue;
//获取to的属性值
var to_id=xmlDoc.getElementsByTagName('to')[0].getAttribute('id');

如果有用到Jquery的话也可以使用$.parseXML(),然后就可以使用Jquery的选择器和方法了 继续阅读

PHP base64_decode 空格问题

php对一个base64_encode编码后的字符串通过url传递后进行base64_decode发现返回值是false。尝试将url传递后的值打印出来发现+都被换成了空格。上网查了下发现,对于通过application/x-www-form-urlencoded的HTTP传递值,+会被自动替换为空格。所以也有各种对base64编码进行扩充的,比如对+,/等符号进行替换的,以便HTTP传输。在php中需要将+号或空格做退还,比如简单的str_replace(‘ ‘,’+’,$str)或者在传输前做urlencode。
继续阅读

Jquery下清空表单FILE控件的值

有时编辑表单需要清除表单的值,使用Jquery的话就是$(this).val(”)或者$(this).attr(‘value’,”)就可以清空了,但是在ie 8下却不行。在网上找了下说是出于安全性的原因,不能在javascript中对FILE控件操作。解决方法是ie下用在身的克隆来替换掉,代码如下:

      if ($.browser.msie) {
            $('#file').replaceWith($('#file').clone());
      }
      else {
            $('#file').val('');
      }

ie下的安全性有时候很讨厌,比如说自定义FILE控件样式,非得点击在控件上选择文件才行,而不能使用javascript来代替。
继续阅读