在Linux Mint中好像没有用鼠标创建快捷方式的方法(或许是我没发现)。创建快捷方式可以使用ln命令 使用方法: ln -s 源文件 目标目录 好像必须是完整的路径,不管当前在哪个目录。 如 ln -s /home/fff/Programs/ZendStudio/ZendStudio /home/fff/桌面 即在桌面创建Zend Studio的链接。 加参数-s是创建软链接,相当于Windows下的快捷方式,不加-s是硬链接,就是会复制一个副本到目标位置,但是与复制不同,两个文件,只要修改一个,另一个会跟着改变。
jQuery 可编辑的表格实现
可编辑的表格,指的是,在单元格上单击后,该格数据可以编辑,回车后,通过ajax保存,实现无刷新编辑。 原理:在点击单元格后,把该格内容替换成一个input标签,当用户编辑完按回车后,再通过ajax把编辑后的内容发送给服务器,把单元格内容换成编辑后的内容。 html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript" src="../js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="../js/music/my.js"></script>
</head>
<body>
<table width="622" border="1" cellspacing="0" cellpadding="0">
<tr>
<td width="129">歌名</td>
<td width="127">歌手</td>
<td width="152">排序</td>
<td width="165">删除</td>
</tr>
<tr id="content" musicId="2">
<td>那些年</td>
<td>胡夏ff</td>
<td>1</td>
<td><button class="del">删除</button></td>
</tr>
</table>
</body>
</html>
my.js:
$(function(){
$("#content td").click(function(){
//id为content的元素的td子元素被点击时执行
var musicId = $(this).parent().attr("musicId");
//读取musicId
var td = $(this);
if ((td.children("input").length > 0) || td.index() == 3) {//如果已经是input,或者是删除那一格,不执行操作
return;
}
var input = $("");
//定义一个input标签
var text = td.html();
//保存原先值
td.html("");
//清空
input.val(text).css("border", "none").width(td.width()).css("font-size", "16px").appendTo(td);
//设置默认值为原先的值,无边框,与td同宽,字体大小16px,加到td里
input.trigger("focus").trigger("select");
//获取焦点,并选中
var argName = "";
switch (td.index()) {
//index方法最出当前被点中被几列
case 0:
argName = "musicName";
break;
case 1:
argName = "singer";
break;
case 2:
argName = "sort";
}
//根据点第几列,确定参数名
input.keyup(function(event){
var keycode = event.which;
//取键值,回车为13,esc为27
if (keycode == 27) {
td.html(text);
//设回原来的值
}
if (keycode == 13) {
var newValue = $(this).val();
//取出经编辑的值
if (td.index() == 2) {
if (!isInteger(newValue)) {
alert("排序必须是整数");
$(this).val(text);
return false;
}
}
td.html(newValue);
var arg = {};
arg[argName] = newValue;
arg['musicId'] = musicId;
$.post("edit_ajax.php", arg);
//ajax发送更新指令
}
});
});
$("button.del").click(function(){
//class为del的button点击时执行
var musicId = $(this).parent().parent().attr("musicId");
$(this).parent().parent().remove();
//移除该行
var arg = {};
arg["action"] = "del";
arg['musicId'] = musicId;
$.post("edit_ajax.php", arg);
//ajax发送删除指令
});
});
function isInteger(str){
//判断是否为整数
var regu = /^[-]{0,1}[0-9]{1,}$/;
return regu.test(str);
}
jQuery post使用变量作参数名
jQuery Post使用方法:
$.post("test.php", { name: "John", time: "2pm" } );
如上,参数名不是字符串,所以不可以直接在这里用使用变量,因为jQuery会把变量名当成参数名.但是我们发现,其实后面的参数就是一个key/value的数组。所以,解决方法很简单:
var arg = {};
var arg1="name";
var arg2="time";
var value1="John";
var value2="2pm";
arg[arg1]=value1;
arg[arg2]=value2;
$.post("test.php", arg);
Mysql临时表使用实例
前文讲到无法解决限定日期内日程循环输出的问题,这里通过结合临时表,解决了。 因为我只要输出最近一周内的日程,所以,不用考虑周循环,和月循环,因为一个周循环的日程,不可能在一周内重复两次,月循环更不可能。这里只需要考虑日循环。 原理:临时生成一个表存储最近七天的日期,与route_data表一起查询,where条件为 ,临时表里的日期与日程下一次执行日期相同,如果是日循环的日程,直接与临时表里的日期自己对比,因为日循环的话,不用判断,每天都会执行。 完整的SQL:
create temporary table temp select date(now()) as newdate;
insert into temp (newdate) value (date_add(date(now()),interval 1 day));
insert into temp (newdate) value (date_add(date(now()),interval 2 day));
insert into temp (newdate) value (date_add(date(now()),interval 3 day));
insert into temp (newdate) value (date_add(date(now()),interval 4 day));
insert into temp (newdate) value (date_add(date(now()),interval 5 day));
insert into temp (newdate) value (date_add(date(now()),interval 6 day));
select * from temp t,route_data r where if(period=2,ADDDATE(CURDATE(),
-WEEKDAY(CURDATE())+if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),
if(period=0,data,if(period=1,newdate,if(DAYOFMONTH(CURDATE())<=data,
if(ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),
ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH),-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH ),
-DAYOFMONTH(CURDATE())+data)))))=newdate and if(period=2,ADDDATE(CURDATE(),
-WEEKDAY(CURDATE())+ if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),if(period=0,data,if(period=1,CURDATE(),
if(DAYOFMONTH(CURDATE())<=data,if(ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),ADDDATE(DATE_ADD(CURDATE(),
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(),
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data)))))<date_add(date(now()),interval 6 day);
Mysql 临时表的使用
临时表,用于存储查询到的数据,进行进一步筛选. 用法: create temporary table 临时表名 select语句; select * form 临时表名; 因为临时表只对当前连接有效,所以,必须在创建临时表后,马上执行进一步的筛选,刷新页面或另一个页面就是另一个连接了,找不到生成的临时表.
Mysql 日期函数以及IF条件语句的使用
现在在做的项目需要有个日程管理,日程分四种周期,单次,每天,每周,每月,表结构如下图:
涉及到的字段就两个,一个是period,存储周期类型,值为0-4,0单次,1每天,2每周,3每月. 另一个是data,存储周期对应的数据,如果是单次,这里就是具体日期,如果是每天,这里为空,如果是每周,值为1-7,如果是每月,值为1-31. 我现在的问题是,要把最近几天的行程从数据库读出来,然后按日期排序,因为是循环的日程,所以除了单次日程外,不可能在数据库中存储具体日期,只能根据周期类型以及周期的数据,再根据今天的日期来计算该行程下次执行的时间。因为要根据日期排序,所以除非把数据库所有记录都读出来,否则不可能用PHP来排序,但是把所有记录读出来,明显不现实。 下面就是用Mysql自带的函数计算每个行程的下一次执行日期,返回再排序.
select if(period=2,ADDDATE(CURDATE(),-WEEKDAY(CURDATE())+ if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),
if(period=0,data,if(period=1,CURDATE(),if(DAYOFMONTH(CURDATE())<=data,if(ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH ),
-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(),
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data))))) as date,id,routeId,data,period from route_data order by date
这行语句花费我整整半天的时间,是我写过的最复杂的SQL语句,如果您有优化简短的写法,请留言。 主要用到了IF判断,日期计算,几个函数的用法自己搜索一下吧,还是蛮简单的。 上面的代码还有一个小问题,在计算月周期的时候,如果今天是1月31号,而保存的周期数据是30,上面的代码计算方法是月份加1,就是2月30日,明显不存在2月30日,而DATE_ADD函数会自动调整了2月的最后一天,2月28日,或2月29日,我们设定的是每个月的30日触发,所以返回的结果不符合。但这个问题不影响,因为我要的结果仅仅是最近1周的行程,如果有需要,可以参考上面lasy_day函数的用法,判断该月最后一天,再用if语句。上用的lasy_day判断,因为一个小月后,跟着肯定是大月,所以如果计算出的日期比当月最后一天晚,这个月肯定是小月,月份加1即可,不用再判断。 上面的语句没有where,不能限定查询的结果在最近几天内,因为where语句优先级高于select,而date字段其实是在select时生成的,所以不能直接where date<’2012-05-01’这样写,必须在where中也计算日期,做对比。
select if(period=2,ADDDATE(CURDATE(),-WEEKDAY(CURDATE())+ if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),
if(period=0,data,if(period=1,CURDATE(),if(DAYOFMONTH(CURDATE())<=data,if(ADDDATE(CURDATE(),
-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH ),
-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)), ADDDATE(DATE_ADD(CURDATE(),
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data))))) as date,id,routeId,data,period from route_data where (if(period=2,ADDDATE(CURDATE(),
-WEEKDAY(CURDATE())+ if(WEEKDAY(CURDATE())>data-1,data+6,data-1)),if(period=0,data,if(period=1,CURDATE(),
if(DAYOFMONTH(CURDATE())<=data,if(ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)>last_day(curdate()),ADDDATE(DATE_ADD(CURDATE(),
INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data),ADDDATE(CURDATE(),-DAYOFMONTH(CURDATE())+data)),
ADDDATE(DATE_ADD(CURDATE(), INTERVAL 1 MONTH ),-DAYOFMONTH(CURDATE())+data))))))<'2012-05-01'
限定日期在5.1前,还有个问题,暂时找不到方法解决。就是如果该日程的下下一个执行时间也在限定日期内,如何返回?比如说,每天都执行的日程,上面的方法虽然限定在5.1前,但只会返回今天的行程,27,28,29,30日的行程都没有,有高人知道怎么做么?
jQuery 设置disabled属性
设置disable属性与其他属性稍有不同:
$("#workend").attr("disabled",true);
$("#workend").attr("disabled",false);
jQuery修改UEditor内容
UEditor初始化内容是通过Javascript设置的,如:
<script type="text/plain" id="myEditor"> 初始化内容</script>
但是,如果直接用jQuery的html方法,修改内容后,会发现,编辑器不见了,只显示一段文本。 其实UEditor带了一个setContent方法,可以直接设置内容。
var editor = new baidu.editor.ui.Editor({
textarea:'introduction'
});
editor.render("myEditor");
editor.setContent("内容");
同样可以在用jQuery取到内容后用setContent方法设置
jQuery解析xml,QName的处理
后面会写个范例详细讲解析xml,这里只介绍QName的处理方法。 什么是QName?QName指的是元素名前带命名空间的元素名,如:
<db:attribute name="isbn10">7543639130</db:attribute>
db:attribute就是QName. 如果直接用$(xml).find(“db:attribute”),是找不到元素的,这里需要对冒号转义一下,写成$(xml).find(“db\:attribute”) 还有一点需要注意,上面的代码在WebKit浏览器不能运行(Chrome等),在这类浏览器中需要用$(xml).find(“attribute”),所以,需要先判断一下.
/**
* 判断是否WebKit浏览器
*/
function isWebKit()
{
var ua=navigator.userAgent.toLowerCase();
if(ua.indexOf("webkit")>0)
{
return true;
}
return false;
}
var attribute;
if(isWebKit())
{
attribute=$(xml).find("attribute");
}else{
attribute= $(xml).find("db\\:attribute");
}
jQuery阻止表单提交
在点提交按钮前,先验证输入是否符合要求,不合要求阻止提交。
$("#button").click(function(event){
if(!checkTime())
{
event.preventDefault();
//阻止提交,注意传入的event参数
}
});