2012年4月21日星期六

【转】Ajax+PHP+jQuery图片截图上传

一、功能分析

用户直接上传图片,点击"上传"按钮之后,在图片预览图内可预览图片,然后进行图片的裁剪前预览,当点击"裁剪"按钮时确定裁剪图片,并在"裁剪结果"区域显示裁剪后的效果

(说明:我是将上传文件保存在"/uploads"文件夹中,而截图结果放在"/avatar"文件夹里)

实现效果预览:

 

 

二、解决方案

1、插件的选择

  • jQuery:这个是必备的一个插件可以到官网上下载

http://docs.jquery.com/Downloading_jQuery

  • imgAreSselect:这个是实现客户端上图片区域选择的

http://odyniec.net/projects/imgareaselect/

  • uploadify:实现文件的上传的功能,支持多文件上传,且可定制性非常强。

http://www.uploadify.com/download/

上面的插件是用在客户端上,其实在我这个程序里写PHP时也用了一些插件。其实我之所以写"图像剪裁上传"的起源是因为我看了《PHP快速开发工具箱》想自己练习一下的。该书是有一个网址(http://www.pluginphp.com/),里面有整本书的代码,而且每个插件都相应的demo,非常不错。下面是用到的PHP插件:

  • PIPHP_UploadFile.php:这是一个文件上传功能的php文件

http://www.pluginphp.com/plug-in11.php

  • PIPHP_ImageCrop.php:这个php文件是具有对图片进行裁剪的功能

http://www.pluginphp.com/plug-in15.php

 

2、客户端与服务器之间的交互图

为了便于理解,我先把交互图放在这里。其中绿色部分是客户端的主要步骤、粉红色是服务器端的主要步骤,服务器与客户端之间的交互通过AJAX完成。可以发现,大部分的操作在客户端进行,服务器端与客户端之间的交流只是简单的JSON数据,因此这样给用户的体验是非常高的。

截图 1 客户端与服务器之间交互图

 

3、客户端文件

展示给用户的是html页面,为了学习并巩固CSS知识,就和DIV+CSS搭建了下面这样一个前台页面,见截图 2

截图 2 前台页面

跟客户端有关的文件主要是一个index.html,而在这个文件里面会引用其他的插件文件,因此可以说,客户端方面只有一个html文件。

另外,由于这里主要讨论客户端与浏览器之间的交互,因此略过CSS方面的内容。这里只列出HTML的代码,首先是<head>部分:

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<link rel="stylesheet" type="text/css" href="/imgareaselect/css/imgareaselect-default.css" />

<link rel="stylesheet" type="text/css" href="layout.css" />

<link href="/uploadify/uploadify.css" type="text/css" rel="stylesheet" />

 

<script type="text/javascript" src="/js/jquery-1.6.2.min.js"></script>

<script type="text/javascript" src="/imgareaselect/scripts/jquery.imgareaselect.pack.js"></script>

<script type="text/javascript" src="/uploadify/swfobject.js"></script>

<script type="text/javascript" src="/uploadify/jquery.uploadify.v2.1.4.min.js"></script>

<title>图片剪切上传</title>

</head>

可以看得出来主要是引用一些插件的文件。上面的文件(包括CSS文件与js文件)都可以从我给的链接里下载到,只是样式表layout.css是我自己写的样式表,大家可以根据自己的CSS知识写出。

接下来是body部分,也许这么看代码比较乱,推荐使用一些带有高亮显示的工具来查看这些代码,比如DreamWeaver等IDE,实在不行,也可以用火狐的"查看源代码"来看。(火狐不仅是一个好浏览器,更是一个极棒的调试器!)

为了方便起见,我去掉诸如"导航条"、页脚版权声明等点缀部分,只给出必要的html代码。

<body class="home">

<form>

    <fieldset>

    <legend>图片上传</legend>

     <div id="queue"></div>

<input type="file" name="file" id="pic_upload"/><br />

<a id='uploadLink' href="javascript:$('#pic_upload').uploadifyUpload();">上传图片 </a>

<div id="uploadInfo"></div>

</fieldset>

</form>

 

    <div id="twoColLayout">

    <div id="primaryContent">

<div >

    <h3>图片预览</h3>

    <div id='oriImage' class="img_v">

      

</div>                    

</div>

 

<div >

裁剪结果:

<div id="cropResult" class="cbb" >

      

</div>

</div>

</div>

 

<div id="sideContent">

裁剪预览:

<div id="preview">

 

</div>

</div>

</div>

</body>

上面我用颜色区分开主要DIV区,这三块分别代表"上传图片区"、"大图展示区"、"截图结果区"与"选择预览区"。其中三个粗体部分是带有ID属性的空DIV,用来放图片用的。(到时时候动态加载图片到这些DIV中),因此这段代码形成的HTML框架如截图 2所示。(蓝色线条是block元素边界,此效果较是由火狐的插件制作而成):

截图 3 页面大体框架

基本的准备工作已经完成,待会儿再继续在这个框架上添加代码。咱们先介绍一下服务器上的PHP是怎么个情况。

 

4、服务器文件

服务器上主要用 到两个PHP文件,一个用来处理上传图片的process.php,另外一个则是处理图片截图用的crop.php。不过,process.php文件包 括插件PIPHP_UploadFile.php,而crop.php中包括PIPHP_ImageCrop.php插件。(这些插件的地址我在上面已经 给出了)

=======

process.php主要接收上传图片,设置限制(比如文件的大小与格式),处理一些上传错误等,最后返回给客户端JSON,里面包含了所上传文件的一些信息(比如路径、大小等);当在客户端点击"上传"按钮的时候,会用异步(AJAX)的方式调用这个php文件。

=======

crop.php主要负责真正裁剪上传的图片,当在客户端返回裁剪的位置后(点击"裁剪"按钮后),以异步方式将数据以JSON的方式传递给服务器,crop.php真正裁剪图片后,将图片另存到网络的目录下,同时返回此图片的存储路径,然后再让客户端显示图片即可

 

三、用到的技术摘要

现在根据上面的交互图继续完善代码。因此我这节会交叉地完善html、js与php代码,并不会单独分开完善,这样在逻辑上会更好理解。

声明:新增的代码部分用粗体表示

 

1、uploadify上传

在html的head部分加入<script>标签,里面开始写主要的处理程序:

<script type="text/javascript" src="/uploadify/swfobject.js"></script>

<script type="text/javascript"  src="/uploadify/jquery.uploadify.v2.1.4.min.js"></script>

    <script type="text/javascript">

  $(document).ready(function(){

        //uploadify设置

            $('#pic_upload').uploadify({

                'uploader' : '/uploadify/uploadify.swf',

                'script' : 'process.php',        

                'cancelImg' : '/uploadify/cancel.png',

            });

  }

    </script>

</head>

上面的代码只是uploadify这一个插件的配置项而已。为了增强用户体验可以详细配置其他选项,这参考这个插件的官方文档:http://www.uploadify.com/documentation/。 上面的'script'选项就是选择服务器的处理脚本,我们这里就使用process.php了。上传文件到服务器后会让服务器自动调用这个程序。那么客 户端怎么知道服务器的process.php调用完了呢?如何获取process.php反馈回来的信息呢?——其实uploadify它提供了一个"触 发"选项onComplete,就是用来处理服务器的反馈信息的,我们稍后再写这个选项的内容,先看看process.php是返回哪些内容的呢。

 

2、process.php反馈上传信息

process.php的任务就是给浏览器返回JSON数据(至于什么是 JSON请参考其它教程,把JSON想像成"键/值"对就可以了,它很方便数据的传输与读取)。在PHP里,一般是先把数据整理成数组的形式,然后使用 json_encode()把数据转换成JSON。那process.php应该给浏览器返回什么样的数据呢?

  • 文件是否成功上传        ->    message
  • 文件的上传状态代码        ->    code
  • 文件上传的存放路径        ->    path
  • 图片的宽度                ->    width
  • 图片的高度                 ->    height
  • 图片的缩放比例            ->    scale
  • 图片的名称                ->    name

其中之所以设置图片的缩放比例scale, 是因为如果用户上传的图片尺寸太大(比如800x800),浏览器中的DIV会被"撑开",布局会被打乱。因此我们限定在浏览器显示图片的时候任何一边长 不能超过400px,否则在显示的时候以等比例缩放。(比如上面的800x800的图上会显示成400x400的,然后浏览器同时设置scale为 0.5)。

    另外,这个php文件是调用了PIPHP_UploadFile.php这个插件,用来将上传的文件进行"鉴别"与"搬移"。

下面是process.php的程序:

<?php

require_once(dirname(__FILE__)."/../PIPHP_UploadFile.php");

    $response=array(

        'message'=>'未知上传错误',

        'path'=>'',

        'code'=>-4, //上传结果代码,0表示成功,-1表示失败

        'width'=>100,

        'height'=>100,

        'scale'=>1,        //比例尺

        'name'=>''

    );

if (!empty($_FILES))

{

    $name='picture';

    $uploadFile='uploads/';

    $maxLen=9*1024*1024;

 

    $result=PIPHP_UploadFile($name,$uploadFile,$maxLen);

    

    

    $response['code']=$result[0];

    //简单汇报成功情况

    if($result[0]==0)

    {

        $response['message']='上传成功!';

        //$response['message']=$result[2];

        $response['path']=$result[1];

        $response['name']=$result[2];

        

        //获取图像的高度与宽度

        $fileName=iconv("utf-8","gb2312",$result[2]);

        list($width,$height)=getimagesize($_SERVER['DOCUMENT_ROOT'].$uploadFile.$fileName);

        $response['width']=$width;

        $response['height']=$height;

    }

    else

    {            

        switch($result[0])

        {

            case -1: $response['message']="上传失败"; break;

            case -2: $response['message']="文件类型错误";break;

            case -3: $response['message']="文件大小超过限制";break;

            default: $response['message']="错误代码:$result[0]";    

        }    

    }

}

else{

     $response['message']="上传文件出现错误!"."<br/>";

}

    $json_str=json_encode($response);

    echo $json_str;

?>

其实这个程序因为有了if判断语句而显示有点大,其实逻辑还是挺简单的。无论如何,这个程序返回的我上面说的有关图片的上传信息(放在$json_str这变量里了)

 

3、继续改进uplodify的配置

从上面知道,process.php返回的是一个$json_str变量,它里面有图像的路径,这样我们就可以在浏览器中显示图片啦!(注意此时显示的图片已经是在服务器上了)

现在添加uploadify的'onComplete'选项,它告诉浏览器当process.php返回数据时应该怎么做。

$('#pic_upload').uploadify({

    'uploader' : '/uploadify/uploadify.swf',

    'script' : 'process.php',        

    'cancelImg' : '/uploadify/cancel.png',

 

  'onComplete': function(event, ID, fileObj, response, data) {

        json_str=JSON.parse(response);

        var maxSize=400;

        var width=json_str.width;

        var height=json_str.height;

        var scale=json_str.scale;

        if(json_str.code == 0)

        {

             $('#uploadInfo').html(json_str.message+'<br/>平均上传速度:'+ data.speed.toFixed(2) + 'Kb/s');

             //对图像进行缩放

             if(json_str.width > maxSize || json_str.height >maxSize){

                if( json_str.width > json_str.height)

                {

                    width = maxSize;

                    height = maxSize / json_str.width * json_str.height;

                    json_str.scale = maxSize / json_str.width;

                }

                else

                {

                    height = maxSize;

                    width = maxSize / json_str.height * json_str.width;

                    json_str.scale = maxSize / json_str.height;

                }

             }

            

             $('#oriImage').html('<img src="/'+json_str.path+'" width=+'+width+' height='+height+' />');            

             //同时插入预览图

             $('#preview').empty().html('<img src="/'+json_str.path+'" width=+'+width+' height='+height+' />').css({

                    overflow:'hidden',

                    width:'150px',

                    height:'150px'

             });                         

        }

        else{

            $('#uploadInfo').html('错误代码['+json_str.code+']:<p>'+json_str.message+'</p>');

        }

  },

});

…    

这里的程序主要 做两件事,首先(第一种颜色标志处)显示上传的图,不过如果图片太大的话就应该显示缩放后的图,同时将缩放的比例保存到scale变量中;然后(第二处颜 色标志处)再初始化裁剪预览图(用jQuery方法),注意这里只是初始化并没有动态显示裁剪预览图,动态显示部分要用imgAreaSelection 这个插件完成。下面就开始讲这个插件吧

 

4、用imgAreaSelection获取截图点坐标

关于imgAreaSelection的使用说明请到官方上查看,这里就不再细讲。

由于图片是动态加载的,所以不能事先将这个插件应用到图像上。我们可以设置一个按钮,当图片上传显示后,我们点击这个"加载裁剪框"按钮,将这个插件绑定到图像上。所以我们先在html上添加一个按钮,我是加载那个"图像预览"的DIV里:

<div >

    <h3>图片预览</h3>

<button id="initCrop">加载裁剪框</button>

                    <div id='oriImage' class="img_v">

      

</div>                    

</div>

然后在head中的<script>标签中写点击事件处理程序:

$(document).ready(function(){

        $('#pic_upload').uploadify({

                …

        });

        //加载裁剪框    

        $('#initCrop').click(function(e){

                ias=$('#oriImage img').imgAreaSelect({instance:true});

                ias.setOptions({ aspectRatio: '1:1', handle:true,

                                 hide:false,

                                 onSelectChange:preview2,

                                 onSelectEnd: function (img, selection) {

                                    json_str.x1=selection.x1;

                                    json_str.y1=selection.y1;

                                    json_str.cropWidth=selection.x2-selection.x1;

                                    json_str.cropHeight=selection.y2-selection.y1;

                                 },

                                });                    

        });

}

</script>

</head>

这里的onSelectChange选项就是当改变裁剪框时所要调用的函数,这里使用preview2函数名作为值,这个函数我是另外写在下面的,当然你也可以使用匿名函数的。我是为了强调这个函数,所以写成实名函数:

//图像预览函数

    function preview2(img, selection) {

        realWidth=json_str.width * json_str.scale;

        realHeight=json_str.height * json_str.scale;

        sizeWidth=150;sizeHeight=150;

        var scaleX = sizeWidth / selection.width ;

        var scaleY = sizeHeight / selection.height ;

    

        $('#preview img').css({

            width: Math.round(scaleX * realWidth) + 'px',

            height: Math.round(scaleY * realHeight) + 'px',

            marginLeft: - Math.round(scaleX * selection.x1) + 'px',

            marginTop: -Math.round(scaleY * selection.y1) + 'px'

        });

    };

这个函数的功能是实现动态显示截图区域图像的,这个区域大小是150x150像素的一个小框,这里它动态加载css,注意要跟上一节中的uploadify中onComplete中预加载此截图框要联系起来。那里它是这么设置的:

//同时插入预览图

             $('#preview').empty().html('<img src="/'+json_str.path+'" width=+'+width+' height='+height+' />').css({

                    overflow:'hidden',

                    width:'150px',

                    height:'150px'

             });                         

        }

注意overflow:hidden的含义是将图像里超过这150x150像素的图像隐藏起来。其实这种方法借鉴自http://odyniec.net/projects/imgareaselect/examples-callback.html

另外的这插件中的onSelectEnd选项配置:当鼠标离开拖选框时,将此裁剪区域的左上角坐标与裁剪区的长、宽存储到json_str变量中,到时候传送给crop.php函数

 

5、将json_str数据传送给crop.php

使用jQuery中的ajax()方法将json_str变量传送给服务器。先在html中添加一个"裁剪"按钮:

<form id="cropData" >

<input type="submit" name="submit" id="crop" value="裁剪" />

</form>

这里我使用了<form>元素,其实没有必要,可以是任何元素,因为我们使用的是强大的jQuery的ajax()方法。

当用户确定要裁剪时,按下此按钮就会调用ajax()方法。我们将处理程序写在head部分的<script>元素中:

//加载裁剪框    

    $('#initCrop').click(function(e){

                …

    });

//裁剪动作,将数据传给服务器,同时ajax返回图片

    $("#crop").click(function(e){

        if(!(typeof json_str == 'undefined'))

        {                    jsondata='data='+JSON.stringify(json_str);

                    $.ajax({

                            type:"POST",

                            url:"crop.php",

                            data:jsondata,//$('#cropData').serialize(),

                            success:function(msg){

                                $("#cropResult").html('<img src="/'+msg+'"/>');//成功之后就清除发表内容

                                //$("#cropResult").html(msg);                                                        

                            }            

                        });

                }

                else

                {

                    alert('please load image first');

                }

                //关闭默认的提交动作    

                return false;

            });

//图像预览函数

    function preview2(img, selection) {…};

上面的代码就等待着crop.php把文件路径传送回来,一旦传送回来,'success'选项所配置的函数就会将图片显示在id为'cropResult'的DIV里面了。

 

6、crop.php对上传图片真正裁剪

这个crop.php文件功能也很简单,通过浏览器返回给的json_str 变量,由于该变量包含截图需要的起点坐标与裁剪的高度、宽度信息,然后调用PIPHP_ImageCrop.php插件,对图像进行真正的裁剪。然后将裁 剪后的图像保存在另外文件夹中(我是将上传文件保存在uploads文件夹中,而截图结果放在avatar文件夹里),并将目标文件夹的路径返回给浏览 器,让浏览器显示裁剪后的图片。

这个程序的源代码:

<?php

require_once('../PIPHP_ImageCrop.php');

    $json_str=json_decode($_POST['data']);

    $x=$json_str->x1;

    $y=$json_str->y1;

    $scale=$json_str->scale;

    $cropWidth=$json_str->cropWidth;

    $cropHeight=$json_str->cropHeight;

    $path=$json_str->path;

    $filename=$json_str->name;

    $tofilename=iconv("utf-8","gb2312",$filename);

    

    $realX=$x/$scale;

    $realY=$y/$scale;

    $realWidth=$cropWidth/$scale;

    $realHeight=$cropHeight/$scale;

    

    $cropedImage=PIPHP_ImageCrop('http://'.$_SERVER['SERVER_NAME'].'/'.$path, $realX, $realY, $realWidth, $realHeight);

    

    $targetDir='avatar/';

    $targetFile=$targetDir.$tofilename;

    

    imagejpeg($cropedImage,$_SERVER['DOCUMENT_ROOT'].$targetFile);

    

    echo $targetDir.$filename.'?'.time();

    ?>

需要注意的,最后返回的数据后加上'?'.time();是为了防止浏览器的缓存,如果不加此句,当用户完成截图后,重要再裁剪图片时,并不会马上更新裁剪得到的图片

好了,至此基本功能已经实现了,至于细节方面可以自己修改。


摘自:http://www.cnblogs.com/boychenney/archive/2011/10/08/2203036.html

2012年4月19日星期四

jQuery获取Select选择的Text和 Value(转)

原文地址:http://blog.chinaunix.net/u3/111819/showart_2197944.html

jQuery获取Select选择的Text和Value:
语法解释:
1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发
2. var checkText=$("#select_id").find("option:selected").text();
//获取Select选择的Text
3. var checkValue=$("#select_id").val(); //获取Select选择的Value
4. var checkIndex=$("#select_id ").get(0).selectedIndex; //获取Select选择的索引值
5. var maxIndex=$("#select_id option:last").attr("index"); //获取Select最大的索引值
jQuery设置Select选择的 Text和Value:
语法解释:
1. $("#select_id ").get(0).selectedIndex=1; //设置Select索引值为1的项选中
2. $("#select_id ").val(4); // 设置Select的Value值为4的项选中
3. $("#select_id option[text='jQuery']").attr("selected", true);
//设置Select的Text值为jQuery的项选中
jQuery添加/删除Select的Option项:
语法解释:
1. $("#select_id").append("<option value='Value'>Text</option>");
//为Select追加一个Option(下拉项)
2. $("#select_id").prepend("<option value='0'>请选择</option>");
//为Select插入一个Option(第一个位置)
3. $("#select_id option:last").remove(); //删除Select中索引值最大Option(最后一个)
4. $("#select_id option[index='0']").remove(); //删除Select中索引值为0的Option(第一个)
5. $("#select_id option[value='3']").remove(); //删除Select中Value='3'的Option
5. $("#select_id option[text='4']").remove(); //删除Select中Text='4'的Option

http://www.cnblogs.com/SAL2928/archive/2008/10/28/1321285.html

jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关
获 取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获 取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;

获取值:

文本框,文本区域:$("#txt").attr("value");
多选框 checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();

控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容

多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾

单选组 radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框 select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option
value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

----------------------------------------------------------------------------------------------------

//遍历option和添加、移除option
function changeShipMethod(shipping){
var len = $("select[@name=ISHIPTYPE] option").length
if(shipping.value != "CA"){
$("select[@name=ISHIPTYPE] option").each(function(){
if($(this).val() == 111){
$(this).remove();
}
});
}else{
$("<option value='111'>UPS
Ground</option>").appendTo($("select[@name=ISHIPTYPE]"));
}
}


//取得下拉��的�取值

$(#testSelect option:selected').text();
或$("#testSelect").find('option:selected').text();
或$("#testSelect").val();
//////////////////////////////////////////////////////////////////
记 性不好的可以收藏下:
1,下拉框:

var cc1 = $(".formc select[@name='country']
option[@selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc select[@name="country"]').val(); //得到下拉菜单的选中项的值
var cc3 = $('.formc select[@name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值
$("#select").empty();//清空下拉框 //$("#select").html('');
$("<option value='1'>1111</option>").appendTo("#select")//添加下拉框的option

稍微解释一下:
1.select[@name='country'] option[@selected] 表示具有name 属性,
并 且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素;
可以看出有@开头的就表示后面跟 的是属性。

2,单选框:
$("input[@type=radio][@checked]").val(); //得到单选框的 选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked');
//设置单选框value=2的为选中状态.(注意中间没有空格)

3,复选框:
$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function() { //由于复选框一般选中的是多个,所以可以循环输出
alert($(this).val());
});

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);// 打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾


当然jquery的选择器是强大的. 还有很多方法.

<script src="jquery-1.2.1.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function(){
$("#selectTest").change(function()
{
//alert("Hello");
//alert($("#selectTest").attr("name"));
//$("a").attr("href","xx.html");
//window.location.href="xx.html";
//alert($("#selectTest").val());
alert($("#selectTest option[@selected]").text());
$("#selectTest").attr("value", "2");

});
});
</script>


<a href="#">aaass</a>

<!--下拉框-->
<select id="selectTest" name="selectTest">
<option value="1">11</option>
<option value="2">22</option>
<option value="3">33</option>
<option value="4">44</option>
<option value="5">55</option>
<option value="6">66</option>
</select>
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关获取一组radio被选中
项的值
var item = $('input[@name=items][@checked]').val();
获取select被选 中项的文本
var item = $("select[@name=items] option[@selected]").text();
select 下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个 元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本 框,文本区域:$("#txt").attr("value");
多选框 checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控 制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');// 填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);// 打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框 select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<optionvalue='1'& gt;1111</option><optionvalue='2'>2222</option&
gt;").appendTo("#sel")//添加下拉框的option
$("#sel").empty();// 清空下拉框

获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当 前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框 checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控 制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');// 填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);// 打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框 select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option
value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();// 清空下拉框

2012年4月12日星期四

[转]js产生随机数

<script>
document.write(parseInt(
10*Math.random()));  //输出0~10之间的随机整数

document.write(Math.floor(Math.random()
*10+1));  //输出1~10之间的随机整数

function RndNum(n){
var rnd="";
for(var i=0;i<n;i++)
rnd
+=Math.floor(Math.random()*10);
return rnd;
}
document.write(RndNum(
4));  //输出指定位数的随机数的随机整数



引用部分:

1. 从1开始 至 任意值
parseInt(Math.random()
*上限+1);

2. 从任意值开始 至 任意值
parseInt(Math.random()
*(上限-下限+1)+下限);
function fRandomBy(under, over){
switch(arguments.length){
case 1: return parseInt(Math.random()*under+1);
case 2: return parseInt(Math.random()*(over-under+1) + under);
default: return 0;
}
}
document.write(fRandomBy(
1,100));  //输出指定范围内的随机数的随机整数
</script>

//给既定文本框按规则付不同的值[引申]
<script>
window.onload
=function(){
var o=document.getElementsByTagName('input');
o[
0].value=fRandomBy(1,10);
o[
1].value=fRandomBy(11,20);
o[
2].value=fRandomBy(1,100);
o[
3].value=fRandomBy(51,100);
}
</script>
1-10: <input type="text" /><br />
11-20: <input type="text" /><br />
1-100: <input type="text" /><br />
51-100: <input type="text" /><br />




<html>
<head>
<title>Math</title>
</head>
<body>
<script language="javascript" type="text/javascript">
total
= 0
for(i=1;i<=5000;i++)
{num
=Math.random();
total
+=num
}
average
= total/5000
average = Math.round(average*1000)/1000
document.write("<h1>平均数:"+average+"</h1>")
</script>
</body>
</html>

摘自:http://www.cnblogs.com/merrick/archive/2010/08/17/1801158.html

2012年4月9日星期一

【转】jquery实现在元素外单击,隐藏此元素

实现的思路是

假如在元素A外单击隐藏A

判断被鼠标按下时的元素 的所有父元素中是否包含了A,没有包含则可以知道鼠标是在A之外单击的,则隐藏。

 

代码如下:

  1. $(document).mouseup(function(event){  
  2.     if($(event.target).parents("A").length==0){  
  3.         $("A").hide();  
  4.     }  
  5. })  
摘自:http://blog.csdn.net/diyle/article/details/6325655

2012年4月1日星期日

[转]SQLite创建触发器 CREATE TRIGGER

CREATE TRIGGER

sql-statement ::= CREATE[TEMP|TEMPORARY]TRIGGERtrigger-name[BEFORE|AFTER]
database-eventON[database-name.]table-name
trigger-action
sql-statement ::= CREATE[TEMP|TEMPORARY]TRIGGERtrigger-nameINSTEAD OF
database-eventON[database-name.]view-name
trigger-action
database-event ::= DELETE|
INSERT
|
UPDATE
|
UPDATE OF
column-list
trigger-action ::= [FOR EACH ROW|FOR EACH STATEMENT][WHENexpression]
BEGIN
    
trigger-step;[trigger-step;]*
END
trigger-step ::= update-statement|insert-statement|
delete-statement|select-statement

CREATE TRIGGER语句用于向数据库schema中添加触发器。触发器是一些在特定的数据库事件(database-event) 发生时自动进行的数据库操作(trigger-action).

触发器可由在特殊表上执行的DELETE, INSERT, UPDATE等语句触发,或UPDATE表中特定的字段时触发。

现在SQLite仅支持FOR EACH ROW触发器,不支持FOR EACH STATEMENT触发。因此可以不用明确说明FOR EACH ROW .FOR EACH ROW的意思是由trigger-steps说明的SQL语句可能在(由WHEN子句决定的)数据库插入,更改或删除的每一行触发trigger.

WHEN子句和trigger-steps可以使用"NEW.column-name"和"OLD.column-name"的引用形式访问正在被插入,更改或 删除的行的元素,column-name是触发器关联的表中的字段名。OLD 和 NEW 引用只在触发器与之相关的trigger-event处可用,例如:

INSERT NEW可用
UPDATE NEW和OLD均可用
DELETE OLD可用

当使用WHEN子句,trigger-steps只在WHEN子句为真的行执行。不使用WHEN时则在所有行执行。

trigger-time决定了trigger-steps执行的时间,它是相对于关联行的插入,删除和修改而言的。

作为的一部分trigger-step的UPDATE 或 INSERT可以使用ON CONFLICT子句。 但若触发trigger的语句使用了ON CONFLICT子句,则覆盖前述的ON CONFLICT子句所定义的冲突处理方法。

关联表被撤销时触发器被自动删除。

不仅在表上,在视图上一样可以创建触发器,在CREATE TRIGGER语句中使用INSTEAD OF即可。 若视图上定义了一个或多个ON INSERT, ON DELETE, ON UPDATE触发器,则相应地对视图执行INSERT,DELETE 或UPDATE语句 不会出错,而会触发关联的触发器。视图关联的表不会被修改。(除了由触发器进行的修改操作)。

Example:

假设"customers"表存储了客户信息,"orders"表存储了订单信息,下面的触发器确保当用户改变地址时所有的 关联订单地址均进行相应改变:

CREATE TRIGGER update_customer_address UPDATE OF address ON customers BEGIN UPDATE orders SET address = new.address WHERE customer_name = old.name; END;

定义了该触发器后执行如下语句:

UPDATE customers SET address = ’1 Main St.’ WHERE name = ’Jack Jones’;

会使下面的语句自动执行:

UPDATE orders SET address = ’1 Main St.’ WHERE customer_name = ’Jack Jones’;

注意,目前在有INTEGER PRIMARY KEY域的表上触发器可能工作不正常。若BEFORE触发器修改了一行的 INTEGER PRIMARY KEY域,而该域将由触发该触发器的语句进行修改,则可能根本不会修改该域。 可以用PRIMARY KEY字段代替INTEGER PRIMARY KEY字段来解决上述问题。

一个特殊的SQL函数RAISE()可用于触发器程序,使用如下语法:

raise-function ::= RAISE ( ABORT,error-message)|
RAISE ( FAIL,
error-message)|
RAISE ( ROLLBACK,
error-message)|
RAISE ( IGNORE )

当触发器程序执行中调用了上述前三个之一的形式时,则执行指定的ON CONFLICT进程(ABORT, FAIL或者ROLLBACK) 且终止当前查询,返回一个SQLITE_CONSTRAINT错误并说明错误信息。

当调用RAISE(IGNORE),当前触发器程序的余下部分,触发该触发器的语句和任何之后的触发器程序被忽略并且 不恢复对数据库的已有改变。 若触发触发器的语句是一个触发器程序本身的一部分,则原触发器程序从下一步起继续执行。

使用DROP TRIGGER删除触发器

摘自:http://hi.baidu.com/%B6%BE%C1%FD/blog/item/d05c8643d6fedd0f72f05dfe.html

[转]sqlite 触发器

::----------SQL触发器-------------------------------------------------
1.删除
    
CREATE TRIGGER [Delete_TopAlexa] ON [dbo].[tb_WebSite] 
    
FOR DELETE 
    
AS
    
BEGIN TRANSACTION
        
delete from tb_alexa where websiteid=(select websiteid from deleted)
        
delete from tb_top100 where websiteid=(select websiteid from deleted)
        
IF (@@ERROR <> 0-- 如果有错误
        BEGIN
            
ROLLBACK TRANSACTION -- 回滚
        END
    
COMMIT TRANSACTION -- 提交事务
2.更新
    
create trigger Test_OK
    
on ok
    
for update
    
as
    
if update(name)
    
begin
        
update sname set sname.s_name=ok.name from ok,sname
        
where sname.n_id=ok.n_id
    
end

::
----------SQLite触发器-------------------------------------------------
1.删除
    
Create  Trigger MAIN.[UserOK_DeleteOK] AFTER DELETE On [UserOK] FOR EACH ROW
    
begin
        
delete from userbak where uid=old.uid ;
    
end;

2.更新
    
Create  Trigger MAIN.[UserOK_Update] AFTER UPDATE On [UserOK] FOR EACH ROW
    
begin
        
update userbak set username=new.username
        
where userbak.uid=old.uid ;
    
end;

摘自:http://blog.csdn.net/jiannye/article/details/6362673