1.递归法
  递归是指在函数中显式的调用它自身。
  利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢(在树的分支/层次较多的情况下尤其明显)。适用与写入数据量大,树的结构复杂的情况下。
  数据结构(以mysql为例)

PHP_两个日期之间的比较 不指定

jed , 2006-10-3 10:28 , 代码编程 , 评论(0) , 阅读(2720) , Via 本站原创
根据一位朋友在BLOG上的回复研究了一下两个日期比价的方法
在网上找了一下,有一些很经典的例子

就这两个时间进行比较

/*日期比较*/
$Date_1="2007-07-12";
$Date_2="2007-06-27";

/*
直接相减是不正确的,你需要这样来做:

**得到目前的日期和时间  

在Unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为UNIX 时间戳(Unix Epoch)。  
如果我们有这样一段的代码:
主要的论点是集中在SELECT something FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) < = 5; 上,我试验了半天,结果还是出错,今天看了MYSQL的函数,终于出来了结果,不敢独享,贴出来供大家研究,(虽然技术含量不高,别扔我柿子就行,呵呵)

MYSQL的TO_DAYS(DATE)函数是这样说明的:
传回DATE到公元1年的总日数,我测试了一下

(1)date
用法:
date(格式,[时间]);
如果没有时间参数,则使用当前时间.
格式是一个字符串,其中以下字符有特殊意义:
U 替换成从一个起始时间(好象是1970年1月1日)以来的秒数
Y 替换成4位的年号.
y 替换成2位的年号.

mysql常用日期函数 不指定

jed , 2006-10-3 10:04 , 数据库技术 , 评论(0) , 阅读(2790) , Via 本站原创
这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:  

mysql> SELECT something FROM table  
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;  

DAYOFWEEK(date)  
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。  
mysql> select DAYOFWEEK(’1998-02-03’);  

<?
class php_upload_class{

     var $FormName       = 'file'; //文件域名称
     var $Directroy      = './'; //上传至目录
     var $MaxSize        = 2097152; //最大上传大小
     var $CanUpload      = true; //是否可以上传
     var $doUpFile       = ''; //上传的文件名
     var $Error          = 0;  //错误参数
     var $user_post_file = array();  //用户上传的文件
     var $allow_type     = array('gif', 'jpg', 'png', 'bmp','txt','rar','zip','doc', 'pdf');
     var $save_info      = array(); //返回一组有用信息,用于提示用户。
     var $last_error     = '';
   var $mutiple_up_res = '';
   var $img_prefix     = 'p_';//重命名图片前缀
   var $is_same_name   = false; //是否将上传的文件重新名称,默认重名称
   var $custom_dir     = ''; //自定义图片名称
   
   var $to_remote      = false; //是否将上传的图片传到远程服务器
   var $host;                   //远程主机
   var $user;                   //用户名
   var $pw;                     //密码
   var $root_dir;              //远程路径
   
   var $is_zoom        = false; //是否将上传的图片文件生成缩略图,默认不缩放
     var $sm_File        = ''; //缩略图名称
     var $dscChar        = 'sm_';//缩略图名称前缀
   var $width          = 150;//缩略图宽度
   var $height         = 113;//缩略图高度
   
   var $is_watermark   = false; //是否将上传的图片文件打水印,默认不打水印
   var $quality        = 90; //0-100 生成图片质量
    var $errorMsg       = false; //水印处理错误
   var $waterPos       = 0; //水印起始位置
   var $waterImage     = ""; //水印图片路径
   var $waterText      = ""; //水印文字
   var $textFont       = 5; //水印文字大小
   var $textColor      = "#FF0000"; //水印文字颜色

   
     function php_upload_class($ini_array=array()){
             
        $this->user_post_file   = $ini_array['user_post_file'];
        $this->allow_type       = $ini_array['allow_type'];
        $this->is_same_name     = $ini_array['is_same_name'];
       
        $this->to_remote        = $ini_array['to_remote'];
        $this->host             = $ini_array['host'];
        $this->user             = $ini_array['user'];
        $this->pw               = $ini_array['pw'];
        $this->root_dir         = $ini_array['root_dir'];
       
        $this->is_zoom          = $ini_array['is_zoom'];
       
        $this->is_watermark     = $ini_array['is_watermark'];
        $this->waterPos         = $ini_array['waterPos'];
        $this->waterImage       = $ini_array['waterImage'];
        $this->waterText        = $ini_array['waterText'];
        $this->textFont         = $ini_array['textFont'];
        $this->textColor        = $ini_array['textColor'];
       
     }

    /*上传单个文件*/
     
     function upload_single_file($fileName = ''){
              if ($this->CanUpload){
                 if ($_FILES[$this->FormName]['size'] == 0){
                    $this->Error = 3;
                    $this->CanUpload = false;
                    return $this->Error;
                    break;
                 }
              }
 
              if($this->CanUpload){
 
                 if ($fileName == ''){
                     $fileName = $_FILES[$this->FormName]['name'];
                 }
     
                 $this->doUpload=@copy($_FILES[$this->FormName]['tmp_name'], $this->Directroy.$fileName);
 
                 if($this->doUpload){
                   $this->doUpFile = $fileName;
                   chmod($this->Directroy.$fileName, 0777);
                   return true;
                 }else{
                   $this->Error = 4;
                   return $this->Error;
                 }
              }
   
              //是否创建图片缩略图
              if($this->is_zoom){
         $imgInfo = @getimagesize($final_file_path);
         $srcWidth = $imgInfo[0];
         $srcHeight = $imgInfo[1];
         if($srcWidth>$srcHeight){
           $this->height = $srcHeight*$this->width/$srcWidth;
         }elseif($srcWidth<$srcHeight){
           $this->width = $srcWidth*$this->height/$srcHeight;
         }
       
        $this->thumb($this->dscChar,$this->width,$this->height);
              }
        //是否给图片加水印
              if($this->is_watermark){
         $this->imageWaterMark($fileName,$this->waterPos,$this->waterImage,$this->waterText,$this->textFont,$this->textColor);
        }
   
     }
     /*上传发生错误*/
   function parse_upload_error($last_error=0){
            switch($last_error){
               case "1":$last_error = "<li>上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。</li>";break;
               case "2":$last_error = "<li>上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。</li>";break;
               case "3":$last_error = "<li>文件只有部分被上传。</li>";break;
               case "4":$last_error = "<li>没有文件被上传。</li>";break;
               default: $last_error = "";break;
        }
            return $last_error;
   }
   /* 上传多个文件  */
     
     function upload_mutiple_file() {
           
        if($this->to_remote){
          require("php_ftp_class.php");
 
              $ini_array = array();
                $ini_array['host']     = $this->host;
                 $ini_array['user']     = $this->user;
                 $ini_array['pw']       = $this->pw;
                 $ini_array['root_dir'] = $this->root_dir;
 
                  $ftp = new php_ftp_class($ini_array);
                  $ftp->connect();
        }
 
              for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
                 
                  if ($this->user_post_file['error'][$i] == 0) {
                     $name      = $this->user_post_file['name'][$i];
           $tmpname   = $this->user_post_file['tmp_name'][$i];
           $size      = $this->user_post_file['size'][$i];
           $mime_type = $this->user_post_file['type'][$i];
           $type      = $this->getExt($this->user_post_file['name'][$i]);
                   
                     if (!$this->checkSize($size)) {
            $this->last_error .= "<li>允许上传的文件最大值为:<b>".$this->get_real_size($this->MaxSize)."</b>,文件 <b>".$name."</b> 的大小为 <b>".$this->get_real_size($size)."</b> ,上传失败。<br>\n";
            continue;
                     }
                     
                     if (!$this->checkType($type)) {
            $this->last_error .= "<li><b>".$type."</b> 类型的文件不允许上传,<b>".$name."</b> 属于该类型,上传失败</li>";
                        continue;
                     }
                   
                    if(!@is_uploaded_file($tmpname)) {
            $this->last_error .= "<li>警告:文件 <b>".$name."</b>通过非正常渠道上传,上传失败。</li>";
            continue;
                    }
                   
                    $basename = $this->getBaseName($name, ".".$type);
         
          $saveas = $this->img_prefix.date("YmdHis").".".$type;
                    //是否重命名上传文件
          $saveas = $this->is_same_name ? $saveas : $name;
         
          //自定义图片名称
          $custom_dir = $this->custom_dir."/".date("YmdHis")."-".$this->get6random();
          $pathinfo = pathinfo($custom_dir);
          if($pathinfo['dirname']!="."){//自定义名称带有目录
            $pathinfo['dirname'] = (strpos($pathinfo['dirname'],"/")==0) ? substr($pathinfo['dirname'],1,strlen($pathinfo['dirname'])) : $pathinfo['dirname'];
            $pathinfo['dirname'] = str_replace("//","/",$pathinfo['dirname']);
            $dirs = explode("/",$pathinfo['dirname']);
            $dirname = false;
            if($i==0){
              foreach($dirs as $dir){
                     $dirname .= $dir."/";
                 $ftp->mk_dir($dirname,true);
              }
            }
            $ftp->root_dir = $ini_array['root_dir']."/".$pathinfo['dirname'];
          }

          $saveas = $this->custom_dir ? $custom_dir.".".$type : $saveas;
         
          $final_file_path = $this->Directroy."/".$saveas; //本地目录
                   
         
         //是否创建图片缩略图
         if($this->is_zoom){
           $this->CanUpload = true;
           $this->doUpFile  = $tmpname;
           $this->thumb($tmpname,basename($saveas),$this->dscChar,$this->width,$this->height);
           //上传缩略图到远程服务器
           
           if($this->to_remote){
             $ftp->ftp_put($this->dscChar.$this->sm_File,$this->sm_File);
           }else{
             if(!@move_uploaded_file($tmpname, $final_file_path)) {
             $this->last_error .= $this->parse_upload_error($this->user_post_file['error'][$i]);
             continue;
           }
           }
           @unlink($this->sm_File);
         }
         //是否给图片加水印
         if($this->is_watermark){
           $this->imageWaterMark($tmpname,$this->waterPos,$this->waterImage,$this->waterText,$this->textFont,$this->textColor);
         }
         //上传图片到服务器
          if($this->to_remote){
              $ftp->ftp_put(basename($saveas),$tmpname);
            if($ftp->error()){
              $this->last_error .= $ftp->error();
              continue;
            }
          }else{
            if(!@move_uploaded_file($tmpname, $final_file_path)) {
            $this->last_error .= $this->parse_upload_error($this->user_post_file['error'][$i]);
            continue;
            }
          }
                   //存储当前文件的有关信息,以便其它程序调用。
                   $this->save_info[] =  array("name"      => $name,
                                           "type"      => $type,
                                               "mime_type" => $mime_type,
                                               "size"      => $size,
                             "saveas"    => $saveas,
                                               "path"      => $final_file_path
                            );
                  }
              }
        if($this->to_remote){
          $ftp->close();
        }
              $this->mutiple_up_res  = '<ul>上传结果:<br>';
          $this->mutiple_up_res .= '有 <font color=green><b>'.count($this->save_info).'</b></font> 个文件被成功上传。<br>';
          if($this->last_error){
           // $this->mutiple_up_res .= '有 <font color=red><b>'.(count($this->user_post_file)-count($this->save_info)).'</b></font> 个文件上传失败。<br>';
            $this->mutiple_up_res .= '上传失败,详细如下:';
            $this->mutiple_up_res .= $this->last_error;
          }
          $this->mutiple_up_res .= '</ul>';
     
          return $this->mutiple_up_res; //返回上传结果信息
     }


     /*创建图片缩略图 */

     function thumb($srcFile,$dscFile,$dscChar='',$width=150,$height=113){

              if ($this->CanUpload && $this->doUpFile != ''){
                 $srcFile = $srcFile ? $srcFile : $this->doUpFile;
 
                 if ($dscChar == ''){
                     $dscChar = 'sm_';
                 }
           $dscFile = $dscFile ? $dscFile : $this->Directroy."/".$dscChar.$srcFile;
               
         $data    = getimagesize($srcFile);
 
                 switch ($data[2]) {
                        case 1:
                               $im = @imagecreatefromgif($srcFile);
                        break;
 
                        case 2:
                           $im = @imagecreatefromjpeg($srcFile);
                        break;
 
                        case 3:
                              $im = @imagecreatefrompng($srcFile);
                        break;
                }
           
        $srcWidth  = $data[0];
        $srcHeight = $data[1];
        if($srcWidth>$srcHeight){
           $width  = $this->width;
           $height = $srcHeight*$this->width/$srcWidth;
        }elseif($srcWidth<$srcHeight){
           $width  = $srcWidth*$this->height/$srcHeight;
         $height = $this->height;
        }else{
           $width  = $this->height;
         $height = $this->height;
        }
 
                $srcW=imagesx($im);
                $srcH=imagesy($im);
                $ni=imagecreatetruecolor($width,$height);
                imagecopyresized($ni,$im,0,0,0,0,$width,$height,$srcW,$srcH);
                $cr = imagejpeg($ni,$dscFile,$this->quality);
                @chmod($dscFile, 0777);

        if($cr){
          $this->sm_File = $dscFile;
         
          return true;
        }else{
          $this->last_error .= "<li>不能生成<b>&quot;".$dscFile."&quot;</b>的缩略图</li>";
          continue;
        }
              }
     
     }

     /* 功能:PHP图片水印 (水印支持图片或文字)
     * 参数:
     *      $groundImage    背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
     *      $waterPos        水印位置,有10种状态,0为随机位置;
     *                        1为顶端居左,2为顶端居中,3为顶端居右;
     *                        4为中部居左,5为中部居中,6为中部居右;
     *                        7为底端居左,8为底端居中,9为底端居右;
     *      $waterImage        图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
     *      $waterText        文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
     *      $textFont        文字大小,值为1、2、3、4或5,默认为5;
     *      $textColor        文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
     *
     * 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
     *      $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
     *      当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
     *      加水印后的图片的文件名和 $groundImage 一样。
     * 作者:longware @ 2004-11-3 14:15:13 我修改的
     */
     function imageWaterMark($groundImage,$waterPos=0,$waterImage,$waterText,$textFont=5,$textColor="#FF0000"){

              $isWaterImage = FALSE;
              $formatMsg = "警告:暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";

              //读取水印文件
              if(!empty($waterImage)) {
                $isWaterImage = TRUE;
                $water_info   = @getimagesize($waterImage);
                $water_w      = $water_info[0];//取得水印图片的宽
                $water_h      = $water_info[1];//取得水印图片的高

                switch($water_info[2]){ //取得水印图片的格式
                      case 1:$water_im = @imagecreatefromgif($waterImage);break;
                      case 2:$water_im = @imagecreatefromjpeg($waterImage);break;
                      case 3:$water_im = @imagecreatefrompng($waterImage);break;
                      default:
                    $this->errormsg = $formatMsg;
                    die("");
                break;
                }
              }

              //读取背景图片
              if($groundImage) {
                $ground_info = getimagesize($groundImage);
                $ground_w    = $ground_info[0];//取得背景图片的宽
                $ground_h    = $ground_info[1];//取得背景图片的高

                switch($ground_info[2]){//取得背景图片的格式  
                      case 1:$ground_im = imagecreatefromgif($groundImage);break;
                      case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
                      case 3:$ground_im = imagecreatefrompng($groundImage);break;
                      default:
                $this->errorMsg = $formatMsg;
                    die("");
                break;
                }
              }else{
        $this->errorMsg = "需要加水印的图片不存在!";
                die("");
              }

              //水印位置
              if($isWaterImage){//图片水印  
                $w = $water_w;
                $h = $water_h;
                $label = "图片的";
              }else{ //文字水印  
                $temp = imagettfbbox(ceil($textFont*2.5),0,"./ARIAL.TTF",$waterText);//取得使用 TrueType 字体的文本的范围
                $w = $temp[2] - $temp[6];
                $h = $temp[3] - $temp[7];
                unset($temp);
                $label = "文字区域";
              }
              if( ($ground_w<$w) || ($ground_h<$h) ){
                $this->errorMsg = "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!";
                return;
              }
              switch($waterPos) {
                    case 0://随机
                           $posX = rand(0,($ground_w - $w));
                           $posY = rand(0,($ground_h - $h));
                           break;
                    case 1://1为顶端居左
                           $posX = 0;
                           $posY = 0;
                           break;
                    case 2://2为顶端居中
                           $posX = ($ground_w - $w) / 2;
                           $posY = 0;
                           break;
                    case 3://3为顶端居右
                           $posX = $ground_w - $w;
                           $posY = 0;
                           break;
                    case 4://4为中部居左
                           $posX = 0;
                           $posY = ($ground_h - $h) / 2;
                           break;
                    case 5://5为中部居中
                           $posX = ($ground_w - $w) / 2;
                           $posY = ($ground_h - $h) / 2;
                           break;
                    case 6://6为中部居右
                           $posX = $ground_w - $w;
                           $posY = ($ground_h - $h) / 2;
                           break;
                    case 7://7为底端居左
                           $posX = 0;
                          $posY = $ground_h - $h;
                           break;
                    case 8://8为底端居中
                           $posX = ($ground_w - $w) / 2;
                           $posY = $ground_h - $h;
                           break;
                    case 9://9为底端居右
                           $posX = $ground_w - $w;
                           $posY = $ground_h - $h;
                           break;
                    case 10://自定义
                           $posX = 160;
                           $posY = 265;
                           break;    
                    default://随机
                           $posX = rand(0,($ground_w - $w));
                           $posY = rand(0,($ground_h - $h));
                           break;
              }

              //设定图像的混色模式
              imagealphablending($ground_im, true);

              if($isWaterImage){ //图片水印  
                imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件        
              }else{//文字水印
                if( !empty($textColor) && (strlen($textColor)==7) ){
                    $R = hexdec(substr($textColor,1,2));
                    $G = hexdec(substr($textColor,3,2));
                    $B = hexdec(substr($textColor,5));
                }else{
          $this->errorMsg = "水印文字颜色格式不正确!";
                    die("");
                }
                imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));        
              }

              //生成水印后的图片
              @unlink($groundImage);
              switch($ground_info[2]){ //取得背景图片的格式
                    case 1:imagegif($ground_im,$groundImage);break;
                    case 2:imagejpeg($ground_im,$groundImage,$this->quality);break;
                    case 3:imagepng($ground_im,$groundImage);break;
                    default:
              $this->errorMsg = '不支持该类型背景图片';
                  die("");
              break;
             }

              //释放内存
              if(isset($water_info)) unset($water_info);
              if(isset($water_im)) imagedestroy($water_im);
              unset($ground_info);
              imagedestroy($ground_im);
     }
     //检查文件是否存在
     function scanFile()
     {
              if ($this->CanUpload){
                 $scan = is_readable($_FILES[$this->FormName]['name']);
                 if ($scan){  
                    $this->Error = 2;
                 }
                 return $scan;
             }
     }

     //获取文件大小
     function getSize($format = 'B')
     {
 
              if ($this->CanUpload)
        {
 
                  if ($_FILES[$this->FormName]['size'] == 0){
                      $this->Error = 3;
                      $this->CanUpload = false;
                  }
 
                  switch ($format){
                         case 'B':
                                  return $_FILES[$this->FormName]['size'];
                         break;
 
                         case 'M':
                                  return ($_FILES[$this->FormName]['size'])/(1024*1024);
             break;
                  }
 
               }
      }
      //转换大小
      function get_real_size($size) {

               $kb = 1024;         // Kilobyte
               $mb = 1024 * $kb;   // Megabyte
               $gb = 1024 * $mb;   // Gigabyte
               $tb = 1024 * $gb;   // Terabyte

               if($size < $kb) {
                  return $size." B";
               }else if($size < $mb) {
                  return round($size/$kb,2)." KB";
               }else if($size < $gb) {
                  return round($size/$mb,2)." MB";
               }else if($size < $tb) {
                  return round($size/$gb,2)." GB";
               }else {
                  return round($size/$tb,2)." TB";
               }

       }

     //获取文件类型
     function getExt($filename=false)
     {
           if($filename){
               $stuff = pathinfo($filename);
               return $stuff['extension'];
       }else{
               if ($this->CanUpload){
                  $ext=$_FILES[$this->FormName]['name'];
                  $extStr=explode('.',$ext);
                  $count=count($extStr)-1;
               }
               return $extStr[$count];
       }
     }

     //获取文件名称
     function getName()
     {
              if ($this->CanUpload){
                 return $_FILES[$this->FormName]['name'];
              }
     }

     //新建文件名
     function newName()
     {
             if ($this->CanUpload){
                $FullName=$_FILES[$this->FormName]['name'];
                $extStr=explode('.',$FullName);
                $count=count($extStr)-1;
                $ext = $extStr[$count];
 
                return date('YmdHis').rand(0,9).'.'.$ext;
             }
    }

      //显示错误参数
      function Err(){
               return $this->Error;
      }

     //上传后的文件名
     function UpFile(){

              if ($this->doUpFile != ''){
                 return $this->doUpFile;
              }else{
                 $this->Error = 6;
              }
    }

     //上传文件的路径
     function filePath(){

              if ($this->doUpFile != ''){
                 return $this->Directroy.$this->doUpFile;
             }else{
                 $this->Error = 6;
             }  
     }

     //缩略图文件名称
     function thumbMap(){

              if ($this->sm_File != ''){
                 return $this->sm_File;
              }else{
                $this->Error = 6;
              }
     }
    //////////////////extention
     /**//**
     * 检测用户提交文件类型是否合法
     * @access private
     * @return boolean 如果为true说明类型合法,反之不合法
     */
     function checkType($extension) {
              foreach ($this->allow_type as $type) {
                      if (strcasecmp($extension , $type) == 0)
                      return true;
              }
              return false;
     }


     /**//**
     * 取给定文件文件名,不包括扩展名。
     * eg: getBaseName("j:/hexuzhong.jpg"); //返回 hexuzhong
     *
     * @param String $filename 给定要取文件名的文件
     * @access private
     * @return String 返回文件名
     */

     function getBaseName($filename, $type) {
              $basename = basename($filename, $type);
              return $basename;
     }
   function halt($msg) {
            return $msg;
   }
   /**//**
     * 检测用户提交文件大小是否合法
     * @param Integer $size 用户上传文件的大小
     * @access private
     * @return boolean 如果为true说明大小合法,反之不合法
     */
    function checkSize($size) {
     
           if ($size > $this->MaxSize ) {
                return false;
             }
             else {
                return true;
             }
     }
     
    function get6random(){
             $return = false;
         $str = "1 2 3 4 5 6 7 8 9";
         $arr = explode(" ",$str);
         srand((double)microtime()*1000000);
       
         for($i=0;$i<=6;$i++){
            $salt = rand(0, 9);
          $return .= $arr[$salt];
         }
         return $return;
    }



}

////////////////////////////测试
/*
echo '
<form action="" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file[]"><br>
<input type="file" name="file[]"><br>
<input type="file" name="file[]"><br>
<input type="file" name="file[]"><br>
<input type="file" name="file[]"><br>
<input type="file" name="file[]"><br>
<input type="submit" name="Submit" value="提交">
<input name="scan" type="hidden" id="up" value="true">
</form>
';
if(!empty($_POST['scan'])){
       
 
 require("config.php");
 require("php_ftp_class.php");
 $ini_array = array();
 *//*
 $settings['FTP_HOST']='192.168.1.8';
 $settings['FTP_USER']='program';
 $settings['FTP_PW']='k8c3321d';
 $settings['FTP_ROOT_DIR']='E:/web/program/product';
 *//*
 $ini_array['host']             = $settings['FTP_HOST'];
 $ini_array['user']             = $settings['FTP_USER'];
 $ini_array['pw']               = $settings['FTP_PW'];
 $ini_array['root_dir']         = $settings['FTP_ROOT_DIR'];

 $ini_array['remote_host_path'] = "http://192.168.1.8/";
 $ini_array['user_post_file']   = $_FILES['file'];
 $ini_array['allow_type']       = array('gif', 'jpg', 'png', 'bmp');

 $ini_array['is_zoom']          = true;//需要生成缩略图
 
 
 $ini_array['is_watermark']     = true;//需要加水印
 $ini_array['waterPos']         = 5 ; //缺省为随机//0为随机 //1为顶端居左 //2为顶端居中 //3为顶端居右 //4为中部居左 //5为中部居中 //6为中部居右 //7为底端居左 //8为底端居中 //9为底端居右
 $ini_array['waterImage']       = "./tmpfolder/angel.gif"; //水印图片
 $ini_array['waterText']        = "";
 $ini_array['textFont']         = 6;
 $ini_array['textColor']        = "#ff0000";

 $ini_array['is_same_name']     = 1;//不需要重命名上传文件

 $upfos = new php_upload_class($ini_array);
 
 $tmpfolder = "./tmpfolder";
 
 if(!file_exists($tmpfolder)) mkdir($tmpfolder, 0777);
 
 $upfos->Directroy  = $tmpfolder;

 $upfos->upload_mutiple_file();

 echo $upfos->mutiple_up_res;
 
 foreach($upfos->save_info as $fileInfo){
     echo '<iframe src="ftp_put.php?to='.$fileInfo['saveas'].'&from='.$fileInfo['path'].'" frameborder="0" height="0" width="0" scrolling="no" ></iframe>';
     if($upfos->is_zoom) {
       echo '<iframe src="ftp_put.php?to=p_small/'.$upfos->dscChar.$fileInfo['saveas'].'&from='.dirname($fileInfo['path'])."/".$upfos->dscChar.$fileInfo['saveas'].'" frameborder="0" height="0" width="0" scrolling="no" ></iframe>';
     }
 }

// if($upfos->is_zoom) echo "<img src='{$tmpfolder}/sm_".$upfos->save_info[0]['name']."'><br>";
 
// echo "<img src='{$tmpfolder}/".$upfos->save_info[0]['name']."'>";

}
*/
?>
以上程序运行必要文件。
php_ftp_class.php

<?
class php_ftp_class{
     var $user     ;
     var $pw       ;
     var $host     ;
     var $root_dir = "";//root ftp dir of server
     var $con_id   = 0;//descriptor on ftp connection
     var $cwd;//current working dir
     var $FTP_MODE = 'FTP_BINARY';// FTP_ASCII | FTP_BINARY
     var $ERR      = false;//must object display ftp errors
     //constr.
     function php_ftp_class($ini_array=array('host'=>"localhost",'user'=>"guest",'pw'=>"guest",'root_dir'=>"",'remote_path'=>'http://localhost')){
              $this->host     = $ini_array['host'];
          $this->user     = $ini_array['user'];
          $this->pw       = $ini_array['pw'];
          $this->root_dir = $ini_array['root_dir'];
         
              if($this->connect()){
                 $this->cwd = @ftp_pwd($this->con_id); //返回当前目录名
              }
     }

     //connect to ftp server
     function connect(){
              $this->con_id = @ftp_connect($this->host);
              if(!$this->con_id){
   
               $this->ERR .= "<li>尝试连接到远程主机".$this->host."时发生错误,连接失败</li>";  
               return false;
 
            }
            if(@ftp_login($this->con_id,$this->user,$this->pw)){
       
             return true;
       
          }else{
       
            $this->ERR .= "<li>用户名 <b>&quot;".$this->user."&quot;</b> 错误,不能登录到远端主机 <b>&quot;".$this->host."&quot;</b>,登录失败</li>";
       
          }
            return false;
     }

     //close ftp connection
     function close(){
              ftp_quit($this->con_id);
     }

     //print error messages
     function error(){
              return   $this->ERR ? "<ul>FTP错误:".$this->ERR."</ul>\n" : false;
     }

     //change current working dir
     function cd($dir){
              if(!@ftp_chdir($this->con_id,$dir)){
                $this->ERR .= "<li>Cannot view directory <b>&quot;".$this->root_dir."/".$dir."&quot;</b>!</li>";
                return false;
              }
              $this->cwd=@ftp_pwd($this->con_id);
              return true;
     }

     //create new empty file
     function mk_file($name){
                if(!$tmpfile=tempnam("/tmp","phpftptmp")){
                  $this->ERR .= "<li>Can't create temp file?</li>";
                  return false;
                }elseif(!ftp_put($this->con_id,$name,$tmpfile,$this->FTP_MODE)){
                   $this->ERR .= "<li>Can't create file <b>&quot;".$this->root_dir."/".$this->cwd."/".$name."&quot;</b></li>";
                   unlink($tmpfile);
                   return false;
                }
                unlink($tmpfile);
                return true;
     }

     //create new dir
     function mk_dir($dir_name,$ret=false){
              $mkdir = @ftp_mkdir($this->con_id,$this->root_dir."/".$this->cwd."/".$dir_name);
        if (!$mkdir && !$ret){
         $this->ERR .= "<li>不能创建文件夹 <b>&quot;".$this->root_dir.$this->cwd.$dir_name."&quot;</b></li>";
         return false;
              }
              return true;
     }

     //change access right to object
     function set_perm($obj,$num){
              //CHMOD 444 ftp.php3
              if(!$this->site("CHMOD ".$num." ".$obj)){
                $this->ERR .= "<li>Cannot change permitions of object <b>&quot;".$this->root_dir."/".$this->cwd."/".$obj."&quot;</b></li>";
                return false;
              }
              return true;
     }

     //send SITE command
     function site($cmd){
              if(!ftp_site($this->con_id, $cmd)){
                $this->ERR .= "<li>Cannot send site command <b>&quot;".$cmd."&quot;</b></li>";
                return false;
              }
              return true;
 }

     //copy file D:/web/images.imp3.net/upload/product $ftp->copy("./images/upload_success.gif","upload_success.gif",true);
     function copy($from,$to){
   /*
 if(file_exists($this->root_dir."/".$to)){
     $this->error("Object <b>&quot;".$this->root_dir."/".$to."&quot;</b> already exists!");
     return false;
   }
   srand((double)microtime()*1000000);
   $tmpfile= dirname(tempnam('',''))."/phpftptmp.".rand() ;
   */
            if(!copy($from,$to)){
                $this->ERR .= "<li>上传<b>&quot;$from&quot;</b>到<b>&quot;$this->root_dir/$to&quot;</b>失败!</li>";
                return false;
              }
              return true;
     }
     function ftp_put($remote_file,$local_file,$ftp_mode=false){
   /*
 if(file_exists($this->root_dir."/".$to)){
     $this->error("Object <b>&quot;".$this->root_dir."/".$to."&quot;</b> already exists!");
     return false;
   }
   */
 //FTP_BINARY为什么不能用变量代替???
            if(!$ftp_mode){
                if(!ftp_put($this->con_id,$this->root_dir."/".$remote_file,$local_file,FTP_BINARY)){
                  $this->ERR .= "<li>上传<b>&quot;$local_file&quot;</b>到<b>&quot;$this->root_dir/$remote_file&quot;</b>失败!</li>";
                  return false;
                }
            }else{
                if(!ftp_put($this->con_id,$this->root_dir."/".$remote_file,$local_file,FTP_ASCII)){
                  $this->ERR .= "<li>上传<b>&quot;$local_file&quot;</b>到<b>&quot;$this->root_dir/$remote_file&quot;</b>失败!</li>";
                  return false;
               }
            }
            return true;
     }
     //move object
     function move($from,$to){
              if(!@ftp_rename($this->con_id,$this->root_dir."/".$from,$this->root_dir."/".$to)){
                $this->ERR .= "<li>移动 <b>&quot;".$this->root_dir."/".$from."&quot;</b> 到 <b>&quot;".$this->root_dir."/".$to."&quot;失败!</b></li>";
                return false;
              }
              return true;
     }

     //rename object
     function rename($from,$to){
              if(!@ftp_rename($this->con_id,$this->root_dir."/".$this->cwd."/".$from,$this->root_dir."/".$this->cwd."/".$to)){
                $this->ERR .= "<li>Cannot rename object <b>&quot;".$this->root_dir."/".$this->cwd."/".$to."&quot;</b></li>";
                return false;
              }
              return true;
     }

     //delete directory  
     function delete_dir($dir){
              if(!@ftp_rmdir($this->con_id, $this->root_dir."/".$this->cwd."/".$dir)){
                $this->ERR .= "<li>不能删除远端文件夹 <b>&quot;".$this->root_dir."/".$dir."&quot;</b></li>";
                return false;
              }
              return true;  
     }
     //delte file
     function delete_file($file){
   
              if(!@ftp_delete($this->con_id, $this->root_dir."/".$this->cwd."/".$file)){
                $this->ERR .= "<li>不能删除远端文件 <b>&quot;".$this->root_dir."/".$file."&quot;</b></li>";
        return false;
              }
              return true;  
     }

     //write into file
     function write($dest,$FILEDATA){
              if(!WIN){
               $old_perm=$this->get_perm($dest,'i');
               $this->set_perm($dest,"666");
             }
             $fd=fopen($this->root_dir."/".$this->cwd."/".$dest,"w");
             if(!fwrite($fd,$FILEDATA)){
               $this->ERR .= "<li>Cannot write file <b>&quot;".$this->root_dir."/".$this->cwd."/".$dest."&quot;</b></li>";
               fclose($fd);
               if(!WIN)$this->set_perm($dest,"644");
               return false;
             }
             fclose($fd);
             if(!WIN)$this->set_perm($dest,"644");
             return true;
     }

     //move uploaded file from TMP into CWD
     function move_uploaded_file($file_to_move,$file_name){
              srand((double)microtime()*1000000);
             if(!$tmp_dir=get_cfg_var('upload_tmp_dir'))$tmp_dir=dirname(tempnam('',''));
             $tmpfile=$tmp_dir."/phpftptmp.".rand();
             if(!copy($file_to_move,$tmpfile)){
               $this->ERR .=  "<li>Can't create temp file?</li>";
               unlink($file_to_move);
               return false;
             }elseif(!ftp_put($this->con_id,$this->cwd."/".$file_name,$tmpfile,$this->FTP_MODE)){
               $this->ERR .= "<li>Can't write file <b>&quot;".$this->root_dir."/".$this->cwd."/".$file_name."&quot;</b></li>";
               unlink($file_to_move);
               unlink($tmpfile);
               return false;
             }
             unlink($file_to_move);
             unlink($tmpfile);
             return true;
     }

     //return access right of an object, at various formats
     function get_perm($obj,$type='i'){
              $num=fileperms($obj);
             $s=array(07=>'rwx',06=>'rw-',05=>'r-x',04=>'r--',03=>'-wx',02=>'-w-',01=>'--x',00=>'---');
             $i=array(07=>'7',06=>'6',05=>'5',04=>'4',03=>'3',02=>'2',01=>'1',00=>'0');
             $b=array(
               07=>array(1,1,1),
               06=>array(1,1,0),
               05=>array(1,0,1),
               04=>array(1,0,0),
               03=>array(0,1,1),
               02=>array(0,1,0),
               01=>array(0,0,1),
               00=>array(0,0,0)
             );
             switch($type){
               case 'b':
                 $ret['o']=$b[($num & 0700)>>6];
                 $ret['g']=$b[($num &  070)>>3];
                 $ret['a']=$b[($num &   07)   ];
                 break;
               case 's':

                 if($num & 0x1000)     $ret ='p';//FIFO pipe
                 elseif($num & 0x2000) $ret.='c';//Character special
                 elseif($num & 0x4000) $ret.='d';//Directory
                 elseif($num & 0x6000) $ret.='b';//Block special
                 elseif($num & 0x8000) $ret.='-';//Regular
                 elseif($num & 0xA000) $ret.='l';//Symbolic Link
                 elseif($num & 0xC000) $ret.='s';//Socket
                 else $str.='?'; //UNKNOWN
                 $ret.=$s[($num & 0700)>>6];
                 $ret.=$s[($num &  070)>>3];
                 $ret.=$s[($num &   07)   ];
                 break;
               case 'i':
                 $ret =$i[($num & 0700)>>6];
                 $ret.=$i[($num &  070)>>3];
                 $ret.=$i[($num &   07)   ];
                 break;
             }
             return $ret;
     }
   //这里显示方式可以按自己的方法修改
     //print dir file list
     function dir_list(){
   //ftp_nlist ?Returns a list of files in the given directory.
   //ftp_rawlist ?Returns a detailed list of files in the given directory.
            $dir_list = '
            <table border=1 cellpadding=3 cellspacing=0><tr><td>Directories</td><td>Files</td></tr>';
            $contents=ftp_nlist($this->con_id, $this->cwd);
            $d_i=0;
            $f_i=0;
            sort($contents);
            for($i=0;$i<count($contents);$i++){
              $file_size=ftp_size($this->con_id,$contents[$i]);
              if(is_dir($this->root_dir.$contents[$i])){
                $nlist_dirs[$d_i]=$contents[$i];
                $d_i++;
              }else{
                $nlist_files[$f_i]=$contents[$i];
                $nlist_filesize[$f_i]=$file_size;
                $f_i++;
              }
            }
           $dir_list .='<tr><td><pre>';
            for($i=0;$i<count($nlist_dirs);$i++)
             $dir_list .=$nlist_dirs[$i]."<br>";
            $dir_list .='</td><td><pre>';
            for($i=0;$i<count($nlist_files);$i++)
             $dir_list .=$nlist_files[$i]." ".(int)$nlist_filesize[$f_i]."<br>";
            $dir_list .='</td></tr></table>';
          return $dir_list;
     }
}
/*测试
    require("config.php");

    $FTP_HOST=$settings['FTP_HOST'];
    $FTP_USER=$settings['FTP_USER'];
    $FTP_PW=$settings['FTP_PW'];
    $FTP_ROOT_DIR=$settings['FTP_ROOT_DIR'];
    $ftp = new php_ftp_class($FTP_USER,$FTP_PW,$FTP_HOST,$FTP_ROOT_DIR);
    $ftp->connect();
        $ftp->ftp_put("upload_success.gif","./images/upload_success.gif");
    $ftp->close();
    $ftp->error();*/


?>

<?
session_start();
//生成验证码图片
Header("Content-type: image/PNG");
$authnum=$_SESSION["authnum"];
srand((double)microtime()*1000000);
$len = strlen($authnum)*12+10;
$im = imagecreate($len,25);
$color[]= array ();
$color[1] = ImageColorAllocate($im, 0x00,0x00,0x00);
$color[2] = ImageColorAllocate($im, 0x00,0x00,0xff);
$color[3] = ImageColorAllocate($im, 0xff,0x33,0x00);
$color[4] = ImageColorAllocate($im, 0x00,0x00,0x99);
$color[5] = ImageColorAllocate($im, 0xff,0x00,0xff);
$color[6] = ImageColorAllocate($im, 0x99,0x66,0xff);
$color[7] = ImageColorAllocate($im, 0x00,0x99,0x99);
$color[8] = ImageColorAllocate($im, 0xff,0xff,0x00);

if($background)
{
$r = substr($background, 0, 2);
$g = substr($background, 2, 2);
$b = substr($background, 4, 2);
$bg = ImageColorAllocate($im, hexdec("0x".$r),hexdec("0x".$g),hexdec("0x".$b));
}
else
{
$bg = ImageColorAllocate($im, 0xcc,0xcc,0xff);
}
imagefill($im, 0, 0, $bg);

for($i=0,$x=5;$i<strlen($authnum);$i++)
{
imagestring($im, 5, $x, rand(2,8), $authnum[$i], $color[rand(1,8)]);
$x+=12;
}
for($i=0;$i<100;$i++)   //加入干扰象素
{
   $randcolor = ImageColorallocate($im,rand(100,255),rand(100,255),rand(100,255));
   imagesetpixel($im, rand()%$len , rand()%30 , $randcolor);
}
ImagePNG($im);
ImageDestroy($im);
?>



hexdec
(PHP 3, PHP 4, PHP 5)

hexdec -- 十六进制转换为十进制
说明
number hexdec ( string hex_string )


返回与 hex_string 参数所表示的十六进制数等值的的十进制数。hexdec() 将一个十六进制字符串转换为十进制数。所能转换的最大数值为 7fffffff,即十进制的 2147483647。PHP 4.1.0 开始,该函数可以处理大数字,这种情况下,它会返回 float 类型。

JavaScript 参考教程 不指定

jed , 2006-10-2 13:42 , 代码编程 , 评论(0) , 阅读(2421) , Via 本站原创
事件处理
事件处理概述
   事件处理是对象化编程的一个很重要的环节,没有了事件处理,程序就会变得很死,缺乏灵活性。事件处理的过程可以这样表示:发生事件 - 启动事件处理程序 - 事件处理程序作出反应。其中,要使事件处理程序能够启动,必须先告诉对象,如果发生了什么事情,要启动什么处理程序,否则这个流程就不能进行下去。事件的处理程序可以是任意 JavaScript 语句,但是我们一般用特定的自定义函数(function)来处理事情。

指定事件处理程序
  指定事件处理程序有三种方法:

方法一 直接在 HTML 标记中指定。这种方法是用得最普遍的。方法是:

<标记 ... ... 事件="事件处理程序" [事件="事件处理程序" ...]>

让我们来看看例子:

<body ... onload="alert('网页读取完成,请慢慢欣赏!')" onunload="alert('再见!')">

这样的定义<body>标记,能使文档读取完毕的时候弹出一个对话框,写着“网页读取完成,请慢慢欣赏”;在用户退出文档(或者关闭窗口,或者到另一个页面去)的时候弹出“再见”。

方法二 编写特定对象特定事件的 JavaScript。这种方法用得比较少,但是在某些场合还是很好用的。方法是:

<script language="JavaScript" for="对象" event="事件">
...
(事件处理程序代码)
...
</script>

例:

<script language="JavaScript" for="window" event="onload">
 alert('网页读取完成,请慢慢欣赏!');
</script>

方法三 在 JavaScript 中说明。方法:

<事件主角 - 对象>.<事件> = <事件处理程序>;

用这种方法要注意的是,“事件处理程序”是真正的代码,而不是字符串形式的代码。如果事件处理程序是一个自定义函数,如无使用参数的需要,就不要加“()”。例:

...

function ignoreError() {
 return true;
}

...

window.onerror = ignoreError; // 没有使用“()”

这个例子将 ignoreError() 函数定义为 window 对象的 onerror 事件的处理程序。它的效果是忽略该 window 对象下任何错误(由引用不允许访问的 location 对象产生的“没有权限”错误是不能忽略的)。

事件详解
onblur 事件 发生在窗口失去焦点的时候。

 应用于:window 对象

onchange 事件 发生在文本输入区的内容被更改,然后焦点从文本输入区移走之后。捕捉此事件主要用于实时检测输入的有效性,或者立刻改变文档内容。

 应用于:Password 对象;Select 对象;Text 对象;Textarea 对象

onclick 事件 发生在对象被单击的时候。单击是指鼠标停留在对象上,按下鼠标键,没有移动鼠标而放开鼠标键这一个完整的过程。

  一个普通按钮对象(Button)通常会有 onclick 事件处理程序,因为这种对象根本不能从用户那里得到任何信息,没有 onclick 事件处理程序就等于废柴。按钮上添加 onclick 事件处理程序,可以模拟“另一个提交按钮”,方法是:在事件处理程序中更改表单的 action, target, encoding, method 等一个或几个属性,然后调用表单的 submit() 方法。

  在 Link 对象的 onclick 事件处理程序中返回 false 值(return false),能阻止浏览器打开此连接。即,如果有一个这样的连接:<a href="http://www.a.com" onclick="return false">Go!</a>,那么无论用户怎样点击,都不会去到 www.a.com 网站,除非用户禁止浏览器运行 JavaScript。

 应用于:Button 对象;Checkbox 对象;Image 对象;Link 对象;Radio 对象;Reset 对象;Submit 对象

onerror 事件 发生在错误发生的时候。它的事件处理程序通常就叫做“错误处理程序”(Error Handler),用来处理错误。上边已经介绍过,要忽略一切错误,就使用:

function ignoreError() {
 return true;
}

window.onerror = ignoreError;

 应用于:window 对象

onfocus 事件 发生在窗口得到焦点的时候。

 应用于:window 对象

onload 事件 发生在文档全部下载完毕的时候。全部下载完毕意味着不但 HTML 文件,而且包含的图片,插件,控件,小程序等全部内容都下载完毕。本事件是 window 的事件,但是在 HTML 中指定事件处理程序的时候,我们是把它写在<body>标记中的。

 应用于:window 对象

onmousedown 事件 发生在用户把鼠标放在对象上按下鼠标键的时候。参考 onmouseup 事件。

 应用于:Button 对象;Link 对象

onmouseout 事件 发生在鼠标离开对象的时候。参考 onmouseover 事件。

 应用于:Link 对象

onmouseover 事件 发生在鼠标进入对象范围的时候。这个事件和 onmouseout 事件,再加上图片的预读,就可以做到当鼠标移到图像连接上,图像更改的效果了。有时我们看到,在指向一个连接时,状态栏上不显示地址,而显示其它的资料,看起来这些资料是可以随时更改的。它们是这样做出来的:

<a href="..."
  onmouseover="window.status='Click Me Please!'; return true;"
  onmouseout="window.status=''; return true;">

 

 应用于:Link 对象

onmouseup 事件 发生在用户把鼠标放在对象上鼠标键被按下的情况下,放开鼠标键的时候。如果按下鼠标键的时候,鼠标并不在放开鼠标的对象上,则本事件不会发生。

 应用于:Button 对象;Link 对象

onreset 事件 发生在表单的“重置”按钮被单击(按下并放开)的时候。通过在事件处理程序中返回 false 值(return false)可以阻止表单重置。

 应用于:Form 对象

onresize 事件 发生在窗口被调整大小的时候。

 应用于:window 对象

onsubmit 事件 发生在表单的“提交”按钮被单击(按下并放开)的时候。可以使用该事件来验证表单的有效性。通过在事件处理程序中返回 false 值(return false)可以阻止表单提交。

 应用于:Form 对象

onunload 事件 发生在用户退出文档(或者关闭窗口,或者到另一个页面去)的时候。与 onload 一样,要写在 HTML 中就写到<body>标记里。

  有的 Web Masters 用这个方法来弹出“调查表单”,以“强迫”来者填写;有的就弹出广告窗口,唆使来者点击连接。我觉得这种“onunload="open..."”的方法很不好,有时甚至会因为弹出太多窗口而导致资源缺乏。有什么对来者说就应该在网页上说完,不对吗?

 应用于:window 对象

关于对象化编程的语句
  现在我们有实力学习以下关于对象化编程,但其实属于上一章的内容了。

with 语句 为一个或一组语句指定默认对象。

用法:with (<对象>) <语句>;

with 语句通常用来缩短特定情形下必须写的代码量。在下面的例子中,请注意 Math 的重复使用:

x = Math.cos(3 * Math.PI) + Math.sin(Math.LN10);
y = Math.tan(14 * Math.E);

当使用 with 语句时,代码变得更短且更易读:

with (Math) {
 x = cos(3 * PI) + sin(LN10);
 y = tan(14 * E);
}

this 对象 返回“当前”对象。在不同的地方,this 代表不同的对象。如果在 JavaScript 的“主程序”中(不在任何 function 中,不在任何事件处理程序中)使用 this,它就代表 window 对象;如果在 with 语句块中使用 this,它就代表 with 所指定的对象;如果在事件处理程序中使用 this,它就代表发生事件的对象。

一个常用的 this 用法:

<script>
...
function check(formObj) {
 ...
}
...
</script>

<body ...>
...
<form ...>
...
<input type="text" ... onchange="check(this.form)">
...
</form>
...
</body>

这个用法常用于立刻检测表单输入的有效性。

自定义构造函数 我们已经知道,Array(),Image()等构造函数能让我们构造一个变量。其实我们自己也可以写自己的构造函数。自定义构造函数也是用 function。在 function 里边用 this 来定义属性。

function <构造函数名> [(<参数>)] {
 ...
 this.<属性名> = <初始值>;
 ...
}

然后,用 new 构造函数关键字来构造变量:

var <变量名> = new <构造函数名>[(<参数>)];

构造变量以后,<变量名>成为一个对象,它有它自己的属性——用 this 在 function 里设定的属性。

以下是一个从网上找到的搜集浏览器详细资料的自定义构造函数的例子:

function Is() {
 var agent = navigator.userAgent.toLowerCase();
 this.major = parseInt(navigator.appVersion);  //主版本号
 this.minor = parseFloat(navigator.appVersion);//全版本号
 this.ns = ((agent.indexOf('mozilla')!=-1) &&
            ((agent.indexOf('spoofer')==-1) && //是否 Netscape
             (agent.indexOf('compatible') == -1)));
 this.ns2 = (this.ns && (this.major == 3));    //是否 Netscape 2
 this.ns3 = (this.ns && (this.major == 3));    //是否 Netscape 3
 this.ns4b = (this.ns && (this.minor < 4.04)); //是否 Netscape 4 低版本
 this.ns4 = (this.ns && (this.major >= 4));    //是否 Netscape 4 高版本
 this.ie = (agent.indexOf("msie") != -1);      //是否 IE
 this.ie3 = (this.ie && (this.major == 2));    //是否 IE 3
 this.ie4 = (this.ie && (this.major >= 4));    //是否 IE 4
 this.op3 = (agent.indexOf("opera") != -1);    //是否 Opera 3
 this.win = (agent.indexOf("win")!=-1);        //是否 Windows 版本
 this.mac = (agent.indexOf("mac")!=-1);        //是否 Macintosh 版本
 this.unix = (agent.indexOf("x11")!=-1);       //是否 Unix 版本
}

var is = new Is();

这个构造函数非常完整的搜集了浏览器的信息。我们看到它为对象定义了很多个属性:major, minor, ns, ie, win, mac 等等。它们的意思见上面的注释。把 is 变量定义为 Is() 对象后,用 if (is.ns) 这种格式就可以很方便的知道浏览器的信息了。我们也可以从这个构造函数中看到,它也可以使用一般的 JavaScript 语句(上例中为 var 语句)。

让我们再来看一个使用参数的构造函数:

function myFriend(theName, gender, theAge, birthOn, theJob) {
 this.name = theName;
 this.isMale = (gender.toLowerCase == 'male');
 this.age = theAge;
 this.birthday = new Date(birthOn);
 this.job = theJob
}

var Stephen = new myFriend('Stephen', 'Male', 18, 'Dec 22, 1982', 'Student');

从这个构造函数我们不但看到了参数的用法,还看到了不同的属性用不同的数据型是可以的(上例五个属性分别为:字符串,布尔值,数字,日期,字符串),还看到了构造函数里也可以用构造函数来“构造”属性。如果用了足够的“保护措施”来避免无限循环,更可以用构造函数自身来构造自己的属性。

使用框架和Cookies
使用框架
  在讲述 window 对象的时候,我们提到过,一个框架内的网页也是 window 对象,也就是说,Frame 对象也是 window 对象。用最容易理解的话说,每一个 HTML 文件占用一个 window 对象,包括定义框架的网页(“框架网页”)。在 IE 里用“<iframe>”标记在文档中插入的框架也是 window 对象,但是用“包含网页”的方法(在 HTML 中显示为“<!--webbot bot="include" ...-->”)读取的 HTML 就不占用独自的 window 对象。每一个框架都是包含它的页的 window 对象的一个子对象(不知道应该叫“属性”不该),要引用它,可以用以下几种方法之一:

window.frames[x]
window.frames['frameName']
window.frameName

  其中,x 指的是该 window 对象中指定的第几个框架,与其它数组一样,x 也是从零开始的。frameName 指的是该框架的名字,跟<frame>里的“name”属性一样。

  如果使用 window.frameName 指定的 window 对象又是一个框架网页,那么引用它的框架的方法:window.frameName.subFrameName。以此类推。

  要注意的时,无论在何处,引用“window”对象所返回的,都是“当前”window 对象。如果要访问其它 window 对象,就要用到 parent 和 top 属性。parent 指的是“父级”window 对象,也就是包含当前 window 对象的框架网页;top 指的是窗口最顶端的 window 对象。

  使用框架还要密切留意你的 JavaScript 中定义的全局变量和自定义函数。它们都有它们的所属——所在的 window 对象。要引用其它框架中的全局变量或自定义函数,都要用“窗口对象.框架对象[.框架对象…].全局变量或自定义函数”这种很烦的方法。

  以上这个问题在建立连接时经常会被忽略:如果在<head>中定义了一个默认目标窗口(<base target="...">),在<a href="javascript:...">中,要知道输入的 JavaScript 语句是在默认目标窗口中运行的,必要时加一些“parent”“top”属性。

使用 Cookies
  我们已经知道,在 document 对象中有一个 cookie 属性。但是 Cookie 又是什么?“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie。”—— MSIE 帮助。一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件、程序等创建的,但是 JavaScript 也提供了对 Cookies 的很全面的访问权利。

  在继续之前,我们先要学一学 Cookie 的基本知识。

  每个 Cookie 都是这样的:<cookie名>=<值>

  <cookie名>的限制与 JavaScript 的命名限制大同小异,少了“不能用 JavaScript 关键字”,多了“只能用可以用在 URL 编码中的字符”。后者比较难懂,但是只要你只用字母和数字命名,就完全没有问题了。<值>的要求也是“只能用可以用在 URL 编码中的字符”。

  每个 Cookie 都有失效日期,一旦电脑的时钟过了失效日期,这个 Cookie 就会被删掉。我们不能直接删掉一个 Cookie,但是可以用设定失效日期早于现在时刻的方法来间接删掉它。

  每个网页,或者说每个站点,都有它自己的 Cookies,这些 Cookies 只能由这个站点下的网页来访问,来自其他站点或同一站点下未经授权的区域的网页,是不能访问的。每一“组”Cookies 有规定的总大小(大约 2KB 每“组”),一超过最大总大小,则最早失效的 Cookie 先被删除,来让新的 Cookie“安家”。

  现在我们来学习使用 document.cookie 属性。

  如果直接使用 document.cookie 属性,或者说,用某种方法,例如给变量赋值,来获得 document.cookie 的值,我们就可以知道在现在的文档中有多少个 Cookies,每个 Cookies 的名字,和它的值。例如,在某文档中添加“document.write(document.cookie)”,结果显示:

name=kevin; email=kevin@kevin.com; lastvisited=index.html

这意味着,文档包含 3 个 Cookies:name, email 和 lastvisited,它们的值分别是 kevin, kevin@kevin.com 和 index.html。可以看到,两个 Cookies 之间是用分号和空格隔开的,于是我们可以用 cookieString.split('; ') 方法得到每个 Cookie 分开的一个数组(先用 var cookieString = document.cookie)。

  设定一个 Cookie 的方法是对 document.cookie 赋值。与其它情况下的赋值不同,向 document.cookie 赋值不会删除掉原有的 Cookies,而只会增添 Cookies 或更改原有 Cookie。赋值的格式:

document.cookie = 'cookieName=' + escape('cookieValue')
    + ';expires=' + expirationDateObj.toGMTString();

是不是看到头晕了呢?以上不是粗体字的地方是要照抄不误的,粗体字是要按实际情况做出改动的。cookieName 表示 Cookie 的名称,cookieValue 表示 Cookie 的值,expirationDateObj 表示储存着失效日期的日期对象名,如果不需要指定失效日期,则不需要第二行。不指定失效日期,则浏览器默认是在关闭浏览器(也就是关闭所有窗口)之后过期。

  看到了上面的一些下划线了么?这些是应该注意的地方。
  首先 escape() 方法:为什么一定要用?因为 Cookie 的值的要求是“只能用可以用在 URL 编码中的字符”。我们知道“escape()”方法是把字符串按 URL 编码方法来编码的,那我们只需要用一个“escape()”方法来处理输出到 Cookie 的值,用“unescape()”来处理从 Cookie 接收过来的值就万无一失了。而且这两个方法的最常用途就是处理 Cookies。其实设定一个 Cookie 只是“document.cookie = 'cookieName=cookieValue'”这么简单,但是为了避免在 cookieValue 中出现 URL 里不准出现的字符,还是用一个 escape() 好。
  然后“expires”前面的分号:注意到就行了。是分号而不是其他。
  最后 toGMTString() 方法:设定 Cookie 的时效日期都是用 GMT 格式的时间的,其它格式的时间是没有作用的。

  现在我们来实战一下。设定一个“name=rose”的 Cookie,在 3 个月后过期。

var expires = new Date();
expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);
/*   三个月 x 一个月当作 30 天 x 一天 24 小时
  x 一小时 60 分 x 一分 60 秒 x 一秒 1000 毫秒 */
document.cookie = 'name=rose;expires=' + expires.toGMTString();

为什么没有用 escape() 方法?这是因为我们知道 rose 是一个合法的 URL 编码字符串,也就是说,'rose' == escape('rose')。一般来说,如果设定 Cookie 时不用 escape(),那获取 Cookie 时也不用 unescape()。

  再来一次:编写一个函数,作用是查找指定 Cookie 的值。

function getCookie(cookieName) {
 var cookieString = document.cookie;
 var start = cookieString.indexOf(cookieName + '=');
 // 加上等号的原因是避免在某些 Cookie 的值里有
 // 与 cookieName 一样的字符串。
 if (start == -1) // 找不到
   return null;
 start += cookieName.length + 1;
 var end = cookieString.indexOf(';', start);
 if (end == -1) return unescape(cookieString.substring(start));
 return unescape(cookieString.substring(start, end));
}

这个函数用到了字符串对象的一些方法,如果你不记得了(你是不是这般没记性啊),请快去查查。这个函数所有的 if 语句都没有带上 else,这是因为如果条件成立,程序运行的都是 return 语句,在函数里碰上 return,就会终止运行,所以不加 else 也没问题。该函数在找到 Cookie 时,就会返回 Cookie 的值,否则返回“null”。

  现在我们要删除刚才设定的 name=rose Cookie。

var expires = new Date();
expires.setTime(expires.getTime() - 1);
document.cookie = 'name=rose;expires=' + expires.toGMTString();

可以看到,只需要把失效日期改成比现在日期早一点(这里是早 1 毫秒),再用同样的方法设定 Cookie,就可以删掉 Cookie 了。

分页: 68/77 第一页 上页 63 64 65 66 67 68 69 70 71 72 下页 最后页 [ 显示模式: 摘要 | 列表 ]