0%

在Linux Mint中好像没有用鼠标创建快捷方式的方法(或许是我没发现)。创建快捷方式可以使用ln命令 使用方法: ln -s 源文件 目标目录 好像必须是完整的路径,不管当前在哪个目录。 如 ln -s /home/fff/Programs/ZendStudio/ZendStudio /home/fff/桌面 即在桌面创建Zend Studio的链接。 加参数-s是创建软链接,相当于Windows下的快捷方式,不加-s是硬链接,就是会复制一个副本到目标位置,但是与复制不同,两个文件,只要修改一个,另一个会跟着改变。

可编辑的表格,指的是,在单元格上单击后,该格数据可以编辑,回车后,通过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使用方法:

$.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);

前文讲到无法解决限定日期内日程循环输出的问题,这里通过结合临时表,解决了。 因为我只要输出最近一周内的日程,所以,不用考虑周循环,和月循环,因为一个周循环的日程,不可能在一周内重复两次,月循环更不可能。这里只需要考虑日循环。 原理:临时生成一个表存储最近七天的日期,与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);

临时表,用于存储查询到的数据,进行进一步筛选. 用法: create temporary table 临时表名 select语句; select * form 临时表名; 因为临时表只对当前连接有效,所以,必须在创建临时表后,马上执行进一步的筛选,刷新页面或另一个页面就是另一个连接了,找不到生成的临时表.

现在在做的项目需要有个日程管理,日程分四种周期,单次,每天,每周,每月,表结构如下图: 涉及到的字段就两个,一个是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日的行程都没有,有高人知道怎么做么?

设置disable属性与其他属性稍有不同:

$("#workend").attr("disabled",true);
$("#workend").attr("disabled",false);

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方法设置

后面会写个范例详细讲解析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");
}

在点提交按钮前,先验证输入是否符合要求,不合要求阻止提交。

    $("#button").click(function(event){
        if(!checkTime())
        {
            event.preventDefault();
            //阻止提交,注意传入的event参数
        }
    });