Posts Tagged ‘控制’

用CSS动态控制文本属性

星期三, 06月 4th, 2008

本篇详细介绍了用CSS动态控制文本属性de文章主题,利用CSSde属性值可动态改变de特点,定义文本de多种属性值,再用一个事件来触发,一旦事件发生,则改变文本属性值,从而达到预期目de.
用CSS可以很方便地动态改变文本de属性,从而可制作出动态地使文字变大、缩小、改变文字颜色、改变文本de背景、字间距、行间距等等网页特效,一切都在您de掌握之中.是不是有点玄?事实就是如此.那一定很复杂吧?不!看完本文,您就会明白,原来这么简单.
请看下面de示例:
一、动态改变文字大小
这个例子de效果是:一段文本,当鼠标在这段文本上,文字变大,鼠标离开时又恢复原样.
制作方法:
1、在Dreamweaver3中,用CSS面板定义两个CSSdeclass,一个取名为“style1”定义为大号字(18px);另一个取名为“style2”,定义为小号字(12px).获得deCSS相关代码如下:
<style type=”text/css”>
<!–
.style1 { font-size:18px}
.style2 { font-size:12px}
–>
</style>
不使用Dreamweaverde网友可把上述相关代码直接复制到网页相关代码de<head>与</head>之间.
2、 在这段文字de<P>标记中加入这段相关代码:onmouseover=”this.className=’’style1”” onmouseout= “this.className=’’style2””.至此,制作完成,能产生效果de那段文字de源相关代码是这样de:
<p onmouseover=”this.className=’’style1”” onmouseout=”this.className=’’style2””><font color=”#FF0000″>鼠标在这段文字上,文字变大,鼠标离开时变小.</font></p>
不使用Dreamweaverde网友只要把相关代码改成上面这样就行了,预览一下就可看到实际效果了.
二、同时动态地改变文字de大小、颜色、加粗
这个例子de效果是:鼠标在文字上,文字de大小、颜色发生改变且加粗,鼠标离开时恢复原样.
这个例子de制作方法与例一相同,不同de只是在CSS中定义了不同de文字属性,所以制作方法不再重复.在<head>与</head>之间增加deCSS相关代码为:
<style type=”text/css”>
<!–
.style1 { font: bold 16px ; color: #0000FF}
.style2 { font-size:12px; color:#00ff00}
–>
</style>
制作完成,能产生效果de那段文字de源相关代码是这样de:
<p class=”style4″ onmouseover=”this.className=’’style1”” onmouseout=”this.className=’’style2””>鼠标在这段文字上,改变文字de大小、颜色、加粗,鼠标离开时恢复原 样.</p>
三、动态改变部分文本de背景
这个例子de效果是:当鼠标移到某行文本上,这行一部分文本de背景改变了,而本行de另一段背景却不变.
这个例子与上面de例子在制作方法上有点改变,上面de例子都是对整段文本de属性进行改变,所以把触发事件加载在“P”标记上;而本例是只改变一段文本de一部分de背景颜色,所以应先用”Span”标记把要改变背景de文本括起来,然后把触发事件加载到“Span”标记上.
本例在<head>与</head>之间增加deCSS相关代码为:
<style type=”text/css”>
<!–
.style1 { background: #99CCFF}
.style2 { background: #FFFFFF}
–>
</style>
制作完成,能产生效果de那段文字de源相关代码是这样de:
<p><span class=”style6″ onmouseover=”this.className=’’style1”” onmouseout=”this.className=’’style1””>当鼠标移到这段文本上,背景改变了,</span>而本 行de另一段背景却不变.</p>
四、给超级链接动态加图标
这个例子de效果是:当鼠标移到某个超级链接上,它de左边会出现一个图象,鼠标移开,图象消失.
本例在制作方法上与上例相同,都是改变文本de背景,但在制作时要注意几点:
1、在设置CSSde背景时是选择图象背景,并在设置图象背景de“repeat”参数时要选择“no-repeat”(不平铺);
2、在设置超级链接时,在其左边要预留出图象de位置;
3、触发事件要加载在超级链接上.
本例在<head>与</head>之间增加deCSS相关代码为:
<style type=”text/css”>
<!–  
.style1 { background: url(image/dot.gif) no-repeat; }
.style2 { background: #FFFFFF}
–>
</style>
制作完成,能产生效果de那个超级链接de源相关代码是这样de:
<a href=”#” onmouseover=”this.className=’’style1”” onmouseout=”this.className=’’style2””>将鼠标移动过来</a>
通过动态改变文本deCSS属性,还可以做出许多特效,但方法基本相同,不再一一例举了,掌握了方法,您就可以发挥想象力去创作了.

用CSS控制的闪烁效果

星期三, 06月 4th, 2008

  一段文本或一张图片,它de周围有一圈光晕,这圈光晕每一秒钟闪烁一次,而当鼠标移到上面时,立即停止闪烁,当鼠标移开时又继续闪烁.这种效果用于那些需要特别引起别人注意de内容上(如:警示、报告新增内容等),能起到较好de效果.

  上面这个示例就能实现上面所de效果,由于这里是抓取de一张图片,不能看到动态效果,只要按下面介绍de方法,制作一个试试,其效果是一目了然de.其制作思路是:采用了CSSde“Glow”滤镜产生光晕效果,利用CSSde属性可动态改变de特性,用一小段javascript程序来每一秒钟改变一次属性值,从而实现闪烁de效果,再用两个事件(onmouseover和onmouseout)调用Javascript程序来控制是否闪烁.

  制作方法:

  1、制作一个Glow滤镜,CSS滤镜de设置方法请参看“CSS滤镜应用技巧”de有关文章.在此不再重复.不是使用Dreamweaverde网友,请把下面de相关代码复制到网页源相关代码de〈head〉与〈/head〉之间:

  〈style type=”text/css”〉

  〈!–

  .glow1 { filter:glow(color=#FF0000,strengh=2)}

  –〉

  〈/style〉

  2、插入一个图层,取名为:bob.在图层上写上一段文字.再在图层上加载一个Glow滤镜,并加上两个事件以实现当鼠标移到文字上时强制停止闪烁,当鼠标移开文字时继续闪烁.相关代码:onclick=”stopflash(this)”,这句相关代码de作用是:一旦鼠标移到文字上,将调用程序de“stopflash(this)”函数来停止闪烁; onmouseout=”init()”,这句相关代码de作用是:一旦鼠标移开文字,将调用程序de“init()”函数来使光晕闪烁.本例完成后图层标记de相关代码是这样de:

  〈div id=”bob” style=”position:absolute; width:572px; height:35px; z-index:1″ class=”glow1″ onmouseover=”stopflash(this)” onmouseout=”init()”〉

  3、在〈head〉与〈/head〉之间插入这样一段Javascript程序:

  〈script 〉

  〈!–

  function init() // 光晕开始闪烁

  {

  makeflash(bob);

  }

  function makeflash(obj)

  {

  obj.flashTimer=setInterval(”bob.filters.glow.enabled= !bob.filters.glow.enabled”,1000)

  } // 这里de“1000”是闪烁de时间,以毫秒计,在本例中是设置了1000毫秒(即1秒),可以根据需要修改.

  function stopflash(obj) // 光晕停止闪烁

  { clearInterval(obj.flashTimer)

  }

  //–〉

  〈/script〉
  4、在网页源相关代码de〈body〉标记中加上这样一段相关代码:onload=”init()”.这句相关代码de作用是当网页载入时,光晕开始闪烁.

  至此,制作结束,按F12就可看到预期de效果了.

  光晕de颜色和光晕de长度均可修改CSS滤镜中de参数值来改变,光晕闪烁de时间间隔可通过修改Javascript中de间隔时间值来调整.若是在图层中插入图片(透明背景degif图片效果更好),则变为图片边缘de光晕闪烁效果.

用定制标签库和配置文件实现对JSP页面元素的访问控制

星期一, 06月 2nd, 2008

控制客户端访问是开发一个基于B/Sde架构de系统de开发者必须考虑de问题.JSPSERVLET规范de基于配置文件de安全策略对资源de控制是以文件为单位de,即只可以定义某个视图全部可以或全部不能被访问.一个比较复杂de系统往往要要求对视图de一部分(如JSP页面里de一个按钮)提供访问控制,只允许被某种角色de用户访问.如果采用可编程de安全策略,因为对用户角色和操作de定义在开发时不能定义,而且这种策略加大了程序员de工作量,它可能不是一种好de办法.

我采用定制标签库和和配置文件来解决这个问题:把要权限控制deJSP页面元素如BUTTON,作为标签de内容.为受保护de内容起一个唯一de名称,把这个名称作为标签de一个属性.某个角色对某个页面元素或一组页面元素是否有权限,在XML配置文件中描述.

例如,下面deJSP页面有“详细”和“修改”两个按钮.

<%@ taglib uri=”http://mytag” prefix=”custTag” %>

<html>

<head>

<title>test</title>

</head>

<body >

<form name=”form1″ >

<table width=”600″ border=”0″ cellspacing=”0″ cellpadding=”2″ >

<tr>

<td>

<custTag:JspSecurity elementName=”employeedetail” >

<input type=”button” name=”detail” value=”详细” >

</custTag:JspSecurity>

<custTag:JspSecurity elementName=”employeemodify” >

<input type=”button” name=”modify” value=”修改” >

</custTag:JspSecurity>

</td>

</tr>

</table>

<br>

</form>

</body>

下面XML配置文件内容表示对角色为commonde用户,只对名为employeedetail de页面元素即“详细”按钮有权限,对角色为“admin”de用户,对名为employeedetail employeemodifyde页面元素即两个按钮都有权限.

<?xml version=”1.0″ encoding=”GB2312″?>

<security>

<htmlElement name=”employeedetail” >

<roleName name=”common” />

<roleName name=”admin” />

</htmlElement>

<htmlElement name=”employeemodify” >

<roleName name=”admin” />

</htmlElement>

</security>

定制标签类JspSecurityTag继承了BodyTagSupport类.BodyTagSupport有一个变量bodyContent指向起始标志和结束标志之间de内容.JspSecurityTagde私有静态变量roleList保存从XML文件中取到角色和页面元素de对应集合,私有变量ElementName对应页面元素de名称.当解析该定制标签时,首先先取到页面元素de名称,再取到当前用户de角色,如果角色有该页面元素de权限,就显示标签正文(即页面元素),否则不显示.

Pagekage com.presentation.viewhelper.JspSecurityTag;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.util.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import org.w3c.dom.*;

import java.io.*;

import javax.xml.parsers.*;

public class JspSecurityTag extends BodyTagSupport {

//保存从XML文件中取到角色和页面元素de对应集合

private static ArrayList roleList;

//页面元素de名称

private String elementName;

public void setElementName(String str)

{

this.elementName=str;

}

public int doAfterBody() throws JspException{

if(roleList==null)

{

roleList=getList();

}

try{

//如果认证通过就显示标签正文,否则跳过标签正文,就这么简单

if(isAuthentificated(elementName))

{

if(bodyContent != null){

JspWriter out=bodyContent.getEnclosingWriter();

bodyContent.writeOut(out);

}else

{

}

}

}catch(Exception e){

throw new JspException();

}

return SKIP_BODY;

}

//XML配置文件中取到角色和页面元素de对应,保存到静态deArrayList

private ArrayList getList()

{

DocumentBuilderFactory dbf =

DocumentBuilderFactory.newInstance();

DocumentBuilder db = null;

Document doc=null;

NodeList childlist = null;

String elementName;

String roleName;

int index;

ArrayList theList = new ArrayList();

try{

db = dbf.newDocumentBuilder();

}catch(Exception e)

{

e.printStackTrace();

}

try{

doc = db.parse(new File(”security.xml”));

}catch(Exception e)

{

e.printStackTrace();

}

//读取页面元素列表

NodeList elementList = doc.getElementsByTagName(”htmlElement”);

for(int i=0;i<elementList.getLength();i )

{

Element name = ((Element)elementList.item(i));

//页面元素de名称

elementName = name.getAttribute(”name”);

//该页面元素对应de有权限de角色de列表

NodeList rolNodeList = ((NodeList)name.getElementsByTagName(”roleName”));

for(int j=0;j<rolNodeList.getLength();j )

{

//有权限de角色de名称

//roleName = ((Element)rolNodeList.item(j)).getNodeValue();

roleName = ((Element)rolNodeList.item(j)).getAttribute(”name”);

theList.add(new ElementAndRole(elementName,roleName));

}

}

return theList;

}

//检查该角色是否有该页面元素de权限

private boolean isAuthentificated(String elementName)

{

String roleName = “”;

//在用户登陆时把该用户de角色保存到SESSION中,这里只是直接从SESSION中取用//户角色.

roleName=this.pageContext.getSession().getAttribute(”rolename”);

// roleList包含elementName属性为elementName,roleName属性为roleNamede//ElementAndRole对象,则该角色有该页面元素de权限

if(roleList.contains(new ElementAndRole(elementName,roleName)))

{

return true;

}

}

return false;

}

//表示角色和页面元素de对应de关系de内部类

class ElementAndRole{

String elementName;

String roleName;

public ElementAndRole(String elementName,String roleName)

{

this.elementName=elementName;

this.roleName=roleName;

}

public boolean equals(Object obj)

{

return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

}

}

}

在标签库能被JSP页面使用前,要做以下三个步骤

1、 JSP页面中包括一个taglib元素,确定需要加载到内存de标签库.前面deJSP文件de第一行:<%@ taglib uri=”http://mytag” prefix=”custTag” %>做de就是这件事.

2、 在配置文件web.xml中使用taglib元素确定TLD文件de位置.在web.xml中增加:

<taglib>

<taglib-uri>http://mytag</taglib-uri>

<taglib-location>

/WEB-INF/mytag.tld

</taglib-location>

</taglib>

3TLD文件必须使用taglib元素标识每个定制标签极其属性.

下面是使用这个标签库对应deTLD文件

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE taglib

PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN”

“http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd”>

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>myTag</shortname>

<uri/>

<tag>

<name>JspSecurity</name>

<tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>

<info>

JspSecurityTag

</info>

<attribute>

<name>elementName</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

PHP中一个控制字符串输出的函数

星期一, 06月 2nd, 2008

// php 中 一个控制字符串输出de函数(中英文),每行显示多少字数,避免英文de影响
// $str 字符串
// $len 每行显示de字数(汉字×2)

function rep($str,$len)
{
$strlen=strlen($str);
$i=0;
$finstr="";
$pos=0;
while($i<$strlen)
{
$s1=substr($str,$i,1);
$s2=ord($s1);
if($s2>0xa0){
$finstr.=substr($str,$i,2);
$pos =2;
$i =2;
}else{
switch($s2){
case 13:
$finstr.="<BR>";
$pos=0;
break;
case 10:
$pos=0;
break;
case 32;
$finstr.=" ";
$pos ;
break;
default:
$finstr.=htmlspecialchars($s1);
$pos ;
break;
}
$i ;
} //if
if($pos>=$len){
$finstr.="<BR>";
$pos=0;
}

} //while
return $finstr;
}

php的控制语句

星期一, 06月 2nd, 2008

1、IF语句
  IF语句是多数语言中de一个重要特点,它根据条件执行程序段.PHPdeIF语句类似于 C:
  if (expr)
  statement

  正如在表达式中所论述, expr 被计算为它de真值.如果 expr 为TRUE, PHP执行相应语句, 如果为FALSE 则忽略它.
如果$a 大于 $b,下例将显示 \’a is bigger than b\’:
  if ($a > $b)
  print \"a is bigger than b\";

  通常,您希望根据条件执行多于一条语句.当然,不需要给每条语句都加上 IF 判断.取而代之,可以把多条语句组成一个语句组.
   If语句可以嵌套于其他 IF语句中,使您能够灵活地有条件de执行程序de各个部分.
2、 ELSE语句
  通常您希望满足特定条件时执行一条语句,不满足条件是执行另一条语句.ELSE就是用来做这个de.ELSE 扩展IF语句,在IF语句表达式为FALSE时执行另一条语句.例如, 下面程序执行如果 $a 大于 $b则显示 \’a is bigger than b\’,否则显示 \’a is NOT bigger than b\’:
  if ($a>$b) {
  print \"a is bigger than b\";
       }
  else {
    print \"a is NOT bigger than b\";
     }

 3、 ELSEIF语句
  ELSEIF,就象名字所示,是IF和ELSEde组合,类似于 ELSE,它扩展 IF 语句在IF表达式为 FALSE时执行其他de语句.但与ELSE不同,它只在ELSEIF表达式也为TRUE时执行其他语句.
  可以在一条IF语句中使用多条ELSEIF语句.第一个ELSEIF表达式为TRUEde语句将被执行.在PHP 3中,您也可以写成\’else if\’ (写成两个单词)和 \’elseif\’ (写成一个单词)效果一样.这只是写法上de细小差别(如果您熟悉 C,它也是),结果是完全一样de.
  ELSEIF语句仅在IF表达式和任何前面deELSEIF表达式都为FALSE,且当前ELSEIF表达式为TRUE时执行.
  下面是一个含有ELSEIF和ELSEde嵌套格式deIF语句:
  if ($a==5):
   print \"a equals 5\";
   print \"…\";
  elseif ($a==6):
      print \"a equals 6\";
      print \"!!!\";
     else:
      print \"a is neither 5 nor 6\";
  endif;

 
  4、 WHILE语句
  WHILE循环是PHP 3de一种简单de循环.象在 C 中一样.WHILE语句de基本格式是:
    WHILE(expr) statement
  WHILE语句de意思非常简单.它告诉PHP只要WHILE表达式为TRUE就重复执行嵌套de语句.每次循环开始时检查WHILE表达式de值,所以即使在嵌套语句内改变了它de值,本次执行也不会终止,而直到循环结束(每次PHP运行嵌套de语句称为一次循环).类似于IF语句,您可以用大括号把一组语句括起来,在同一个WHILE循环中执行多条语句:
   WHILE(expr): statement … ENDWHILE;
  下面例子完全相同, 都打出数字 1 到 10:

  /* example 1 */
   $i=1;
   while ($i<=10) {
   print $i ; /* the printed value would be $i before the increment (post-   
    increment) */
  }
  /* example 2 */
   $i=1;
   while ($i<=10):
   print $i;
   $i ;
   endwhile;

  5、DO..WHILE语句
  DO..WHILE 非常类似于 WHILE 循环, 只是它在每次循环结束时检查表达式是否为真,而不是在循环开始时. 它和严格deWHILE循环de主要区别是DO..WHILEde第一次循环肯定要执行(真值表达式仅在循环结束时间检查), 而不必执行严格deWHILE循环(每次循环开始时就检查真值表达式, 如果在开始时就为FALSE, 循环会立即终止执行).
  DO..WHILE循环只有一种形式:
    $i = 0;
    do {
       print $i;
      } while ($i>0);

上面循环只执行一次, 因为第一次循环后,当检查真值表达式时, 它算出来是 FALSE ($i 不大于 0)循环执行终止.
  6、 FOR循环语句
  FOR循环是PHP中最复杂de循环.象在 C 中一样. FOR循环de语法是:
    FOR (expr1; expr2; expr3) statement
  第一个表达式(expr1)在循环开始时无条件de计算(执行).
  每一次循环, 表达式 expr2 都被计算.如果结果为 TRUE, 则循环和嵌套de语句继续执行.如果结果为 FALSE,则整个循环结 束.
   每次循环结束时, expr3 被计算(执行). 每一个表达式都可为空.expr2 为空则循环de次数不定(PHP 默认它为TRUE,象C一样).除非您要通过一个条件de BREAK语句代替FOR de真值表达式来结束循环,否则不要这样.
  考虑下面例子.它们都显示数字 1 到 10:
   /* example 1 */
     for ($i=1; $i<=10; $i ) {
      print $i;
     }
   /* example 2 */
     for ($i = 1;;$i ) {
       if ($i > 10) {
         break;
         }
       print $i;
      }
    /* example 3 */
      $i = 1;
      for (;;) {
        if ($i > 10) {
          break;
         }
        print $i;
        $i ;
       }

  当然,第一个例子显然是最好de,但借此您可以发现在FOR 循环中很多场合可以使用空de表达式.
  其他de语言有一条foreach语句用来遍历一个数组或哈希(hash)表.PHP使用while语句和 list()、each() 函数来达到这个功能.
  7、 SWITCH选择语句
  SWITCH语句就象是对同一个表达式de一系列IF语句.在很多时侯,您想把同一个变量(或者表达式)和许多不同de值去比较 ,并根据不同de比较结果执行不同de程序段.这就是 SWITCH语句de用处了.
  下面两个例子通过不同de方法做同一件事,一个用一组 IF语句,另外一个用 SWITCH 语句:
  /* example 1 */
   if ($i == 0) {
    print \"i equals 0\";  
    }
   if ($i == 1) {
    print \"i equals 1\";
    }
   if ($i == 2) {
    print \"i equals 2\";
   }
  /* example 2 */
   switch ($i) {
   case 0:
    print \"i equals 0\";
    break;
   case 1:
    print \"i equals 1\";
    break;
   case 2:
    print \"i equals 2\";
    break;
   }

(二)、REQUIRE语句
  REQUIRE语句用指定de文件代替自己,很象 C 中de预处理 #include .
  这意味着您不能为了每次调用该函数来包含不同文件de内容,而把require()语句放在一个循环结构,.要这么做,使用 INCLUDE 语句.
    require(\’header.inc\’);
(三)、 INCLUDE语句
  INCLUDE语句包含指定de文件.
  每次遇到INCLUDE是INCLUDE语句就包含指定de文件.所以您可以在一个循环结构中使用INCLUDE语句以包含一系列不同de文件.
    $files = array(\’first.inc\’, \’second.inc\’, \’third.inc\’);
    for ($i = 0; $i < count($files); $i ) {
      include($files[$i]);
     }

(四)、 函数
  可以通过以下de语法定义函数:
   function foo( $arg_1, $arg_2, …, $arg_n ) {
     echo \"Example function.\\n\";
     return $retval; 
    }

函数中可以使用任何有效dePHP3 相关代码,甚至是其他de函数或类 de定义
 1、 函数返回值
  函数可以通过可选dereturn语句返回值.返回值可以是任何类型,包括列表和对象.
  function my_sqrt( $num ) {
   return $num * $num;
   }
  echo my_sqrt( 4 ); // outputs \’16\’.

  函数不能同时返回多个值,但可以通过返回列表de方法来实现:

  function foo() {
   return array( 0, 1, 2 );
   }
  list( $zero, $one, $two ) = foo();

2、 参数
  外部信息可以通过参数表来传入函数中;参数表就是一系列逗号分隔de变量和/或常量.
  PHP3支持通过值形参数(默认), 变量参数,和 默认参数.不支持变长参数表, 但可以用传送数组de方法来实现.
3、 关联参数
  默认情况函数参数是传值方式.如果您允许函数修改传入参数de值,您可以使用变量参数.
  如果您希望函数de一个形式参数始终是变量参数,您可以在函数定义时给该形式参数加(&)前缀:
  function foo( &$bar ) {
    $bar .= \’ and something extra.\’;
   }
  $str = \’This is a string, \’;
  foo( $str );
  echo $str; // outputs \’This is a string, and something extra.\’

  如果要传递一个可变参数给默认de函数(其形式参数不是变参方式),您可以在调用函数时给实际参数加(&)前缀:
  function foo( $bar ) {
    $bar .= \’ and something extra.\’;
   }
  $str = \’This is a string, \’;
  foo( $str );
  echo $str; // outputs \’This is a string, \’
  foo( &$str );
  echo $str; // outputs \’This is a string, and something extra.\’

4、 默认值
  函数可以定义 C 风格de默认值,如下:
  function makecoffee( $type = \"cappucino\" ) {
    echo \"Making a cup of $type.\\n\";
   }
  echo makecoffee();
  echo makecoffee( \"espresso\" );

  上边这段相关代码de输出是:
    Making a cup of cappucino.
    Making a cup of espresso.
  注意,当使用默认参数时,所有有默认值de参数应在无默认值de参数de后边定义;否则,将不会按所想de那样工作. 
   5、CLASS(类)
类是一系列变量和函数de集合.类用以下语法定义:
   <?php
    class Cart {
    var $items; // Items in our shopping cart
      // Add $num articles of $artnr to the cart
    function add_item($artnr, $num) {
      $this->items[$artnr] = $num;
     }
      // Take $num articles of $artnr out of the cart
    function remove_item($artnr, $num) {
      if ($this->items[$artnr] > $num) {
        $this->items[$artnr] -= $num;
        return true;
       } else {
           return false;
          }
       }
     }
    ?>

上面定义了一个叫Cart de类,其中包括一个关联数组和两个用来从cart中增加和删除项目de函数.
  类是实际变量de原始模型.您要通过new 操作符来建立一个所需类型de变量.
   $cart = new Cart;
   $cart->add_item(\"10\", 1);

这建立起一个 Cart类de对象$cart.该对象de函数add_item()被调用来给第10项加 1.
  类可以从其他de类扩充得到.扩充或派生出来de类拥有基类de所有变量和函数及您在扩充定义中所定义de东西.这要使用 extends 关键字.
  class Named_Cart extends Cart {
    var $owner;
    function set_owner($name) {
      $this->owner = $name;
     }
   }

这里定义了一个名为 Named_Cart de类它继承了 Cart类所有变量和函数并增加了一个变量 $owner和一个函数 set_owner(). 您建立de named_cart 类de变量现在就能设置carts de owner了.在named_cart变量中您仍然可以使用一般de cart函数:
 $ncart = new Named_Cart; // Create a named cart
 $ncart->set_owner(\"kris\"); // Name that cart
 print $ncart->owner; // print the cart owners name
 $ncart->add_item(\"10\", 1); // (inherited functionality from cart)

函数中de变量 $this 意思是当前de对象.您需要使用 $this->something de形式来存取所有当前对象de变量或函数.
  类中de构造器是您建立某种类de新变量时自动被调用de函数.类中和类名一样de函数就是构造器.
  class Auto_Cart extends Cart {
     function Auto_Cart() {
       $this->add_item(\"10\", 1);
      }
    }

这里定义一个类 Auto_Cart ,它给 Cart类加了一个每次new操作时设置项目10进行变量初始化de构造器.构造器也可以有参数,这些参数是可选de,这种特点也使得其十分有用.
  class Constructor_Cart {
   function Constructor_Cart($item = \"10\", $num = 1) {
     $this->add_item($item, $num);
    }
   }
     // Shop the same old boring stuff.
  $default_cart = new Constructor_Cart;
    // Shop for real…
  $different_cart = new Constructor_Cart(\"20\", 17);

输出控制类

星期一, 06月 2nd, 2008

<?php
/**
*
* 作者: 徐祖宁 (唠叨)
* 邮箱: czjsz_ah@stats.gov.cn
* 开发: 2002.07
*
*
* 类: outbuffer
* 功能: 封装部分输出控制函数,控制输出对象.
*
* 方法:
* run($proc) 运行php程序
* $proc php程序名
* display() 输出运行结果
* savetofile($filename) 保存运行结果到文件,一般可用于生成静态页面
* $filename 文件名
* loadfromfile($filename) 装入保存de文件
* $filename 文件名
*
* 示例:
* 1.
* require_once "outbuffer.php";
* $out = new outbuffer();
* $out->run("test.php");
* $out->display();
*
* 2.
* require_once "outbuffer.php";
* require_once "outbuffer.php";
* $out = new outbuffer("test.php");
* $out->savetofile("temp.htm");
*
* 3.
* require_once "outbuffer.php";
* $out = new outbuffer();
* $out->loadfromfile("temp.htm");
* $out->display();
*
*/
class outbuffer {
var $length;
var $buffer;
function outbuffer($proc="") {
$this->run($proc);
}
function run($proc="") {
ob_start();
include($proc);
$this->length = ob_get_length();
$this->buffer = ob_get_contents();
$this->buffer = eregi_replace("\r?\n","\r\n",$this->buffer);
ob_end_clean();
}
function display() {
echo $this->buffer;
}
function savetofile($filename="") {
if($filename == "") return;
$fp = fopen($filename,"w");
fwrite($fp,$this->buffer);
fclose($fp);
}
function loadfromfile($filename="") {
if($filename == "") return;
$fp = fopen($filename,"w");
$this->buffer = fread($fp,filesize($filename));
fclose($fp);
}
}
?>

PHP输出控制功能在简繁体转换中的应用

星期一, 06月 2nd, 2008

PHP输出控制功能在简繁体转换中de应用

概要:本文对PHPde输出控制功能进行了简单介绍并对其在简繁体转化中de应用给出了具体思路和实例
一 PHP 输出控制功能介绍
PHP作为当今流行de脚本语言之一,具有编写简便,执行速度快,扩充性好等优点.PHPde输出信息控制函数可以让您控制您de脚本输出de内容,可以用于许多不同de情况,特别是在您de脚本已经输出信息后需要发送文件头de情况以及需要对输出信息进行编辑处理de地方.输出控制函数不对使用 header() 或 setcookie() 发送de文件头信息产生影响,只对那些类似于 echo()、print() 和 PHP 相关代码de数据块有作用.
例 1. 控制输出
test.php
<?
function test($str){
return str_replace(”php2000″,”y10k”,$str);
}
ob_start(”test”);
echo “hello php2000″;
ob_end_flush();
?>
这个程序在没有输出信息控制de情况下应该输出为
hello php2000
但通过指定了输出控制函数后,输出变为
hello y10k
在上面de例子中,使用 echo() de输出内容将会保存在输出缓冲区中,直到调用了 ob_end_flush()或者脚本运行终止, 然后输出信息由自定义de处理函数进行处理(替换里面de字符串)并返回结果.
相关函数说明
ob_start([string output_callback])- 打开输出缓冲区
所有de输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息.
ob_end_flush - 结束(发送)输出缓冲区de内容,关闭输出缓冲区
二 简繁体转换de实现
一般通过对照表de形式实现,相关de文章非常多,这里就不多讲了,只给出其实现相关代码
<?
function gb2big5($str) {
global $_gb_big5_;
$leng = strlen($str)-1;
for($i = 0; $i<$leng; $i ){
$h = ord($str[$i]);
if($h>=160){
$l = ord($str[$i 1]);
$gb=($h==161 && $l==64)?” ” : substr($_gb_big5_, ($h-160)*510 ($l-1)*2, 2);
$str[$i] = $gb[0];
$str[$i 1] = $gb[1];
$i ;
}
}
return $str;
}
?>
其中:
$gb_big5_ 保存着big5 de字库对照表
$str 为要转化de字符串
三 输出控制函数在简繁体转化中de应用
目前de大多数网站de简繁体页面转换都是通过各自单独de页面实现de,这样导致在修改简体页面de时候还需要再次修改繁体de页面,不能做到自动同步.而我提供de这个方法,可以实现同一个页面自动de变换简繁体显示.其实现方法是:
1 建立简繁体标志,用于指示当前显示de简繁体状态,同时对简繁体状态进行切换
php2000_gb_big5.php
<?
session_start(); // 打开session 功能,用于在各个页面之间自动传递标志
if(!session_is_registered(”php2000_big5″)){ // 检查简繁体标志de注册状态
session_register(”php2000_big5″); // 注册简繁体标志,简体=0;繁体=1
$php2000_big5=0; // 默认为简体
}
$php2000_big5 = ($php2000_big5 1)%2; // 切换简繁体状态
header(”location:”.getenv(”HTTP_REFERER”)); // 返回其调用页面
?>
2对页面输出信息进行控制,每个页面都调用这段程序,用于简繁体转换
require.php(应包括前面第二部分de转换相关代码,这里略)
<?
Session_start();
function translate_gb2big5($str) {
$str = gb2big5($str); // 转化为 big5
$str = str_replace(’charset=gb2312′, ‘charset=big5′, $str); // 替换字符类型
header(’Content-Type: text/html; charset=big5′); // 繁体文件头
return $str;
}
if(session_is_registered(”php2000_big5″) && ($php2000_big5==1)){ // 判断标志
$fp = fopen(’big5.table’, ‘r’); // big5de字库表
$_gb_big5_ = fread($fp, filesize(’big5.table’)); // 读出数据
fclose($fp);
ob_start(’translate_gb2big5′); // 启动输出信息控制
}
?>
3 使用方法,这里给出一个最简单de例子,放在和 require.php 同一个目录里面
test.php
<?
require(”require.php”);
echo “大家好,这里是 PHP 世纪网”;
?>
<a href=php2000_gb_big5.php>
<?
if($php2000_big5==1)echo “GB”;
else echo “Big5″;
?>
</a>
第一次运行结果为默认简体如下
大家好,这里是 PHP 世纪网 Big5
点击 Big5 连接显示繁体如下
大家好,這里是 PHP 世紀網 GB
点击 GB 将返回简体页面
由于使用了session 保存了简繁体标志,这样其他任何使用了 require.php de页面都会自动按照当前de标志显示相应de页面.更多de实例请看我de网站 http://www.php2000.com.
4 big5 字库de保存de改进方法
曾经考虑使用 session 来保存 big5 字库,但使用后发现速度明显减慢,主要因为 session 也是通过文件形式实现,所以不会对性能产生提高,而且因为session 不会根据简繁体标志自动判断装载与否,所以造成在简体下也装载了 big5 de字库,所以造成速度减慢.
由于我用de服务器为 linux 所以考虑使用共享内存(Windows 不支持共享内存)来保存 big5 字库信息.其更改de相关代码为require.php de判断部分:
<?
if(session_is_registered(”php2000_big5″) && ($php2000_big5==1))
{
// 修改成使用共享内存
// 判断是否已经创建,打开50000字节de 0xff3 段de共享内存
$shm_id = @shmop_open(0xff3, “a”, 0644, 50000);
if($shm_id) {
$_gb_big5_ = shmop_read($shm_id, 0,shmop_size($shm_id)); // 读出big5 数据
}
else{
// 创建 50000 字节de系统标识为 0xff3 de共享内存块
$shm_id = @shmop_open(0xff3, “c”, 0644, 50000);
// 读出数据
$fp = fopen(’big5.table’, ‘r’);
$_gb_big5_ = fread($fp, filesize(’big5.table’));
fclose($fp);
if($shm_id){
$shm_bytes_written = shmop_write($shm_id, $_gb_big5_,0); // 写入 big5 数据
}
}
ob_start(’translate_gb2big5′);
}
?>
关于共享内存de使用方法,请参看有关资料.
四 结论
PHP 作为一种公开源相关代码de脚本语言,其扩充性是非常好de.本文只是对其一个功能de一种应用方式de探讨,并实现了比较完美de同一页面自动简繁体转换功能.希望广大爱好 PHP de朋友能从中得到启发,做出更好de作品.

javascript轻松控制表格列样式的脚本代码

星期一, 06月 2nd, 2008


点击运行可以看到效果:
[Ctrl A 全选 提示:您可先修改部分相关代码,再按运行]

javascript 播放器 控制

星期一, 06月 2nd, 2008

详细参数可查询MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmplay/mmp_sdk/settingsobject.asp
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<link href=”style/style.css” rel=”stylesheet” type=”text/css”>
<script language=”JavaScript”>
var state;
//初始化
function playerinit()
{
player.url=”mp3.m3u”;
player.settings.autoStart = false ;
}
//播放
function play()
{
if (player.controls.isavailable(’play’))
{
player.controls.play();
state=setInterval(”updatetime()”,1000);
playerinfo.innerHTML = “播放”;
}
}
//暂停
function pause()
{
if (player.controls.isavailable(’pause’))
{
player.controls.pause();
clearInterval(state);
playerinfo.innerHTML = “暂停”;
}
}
//停止
function stop()
{
if (player.controls.isavailable(’stop’))
{
player.controls.stop();
clearInterval(state);
playerinfo.innerHTML = “停止”;
}
}
//前首
function previous()
{
if (player.controls.isavailable( ‘previous’ ))
{
player.controls.previous();
playerinfo.innerHTML = “前一首”;
}
}
//后首
function next()
{
if (player.controls.isavailable( ‘next’ ))
{
player.controls.next();
playerinfo.innerHTML = “下一首”;
}
}
//?
function step()
{
if (player.controls.isavailable( ’step’ ))
player.controls.step( 1 );
}
//音量-
function voldown()
{
if ( player.settings.volume < 5 )
{
player.settings.volume = 0;
playerinfo.innerHTML = “0″;
}
else
{
player.settings.volume -= 5;
playerinfo.innerHTML = player.settings.volume;
}
}
//音量
function volup()
{
if ( player.settings.volume > 95 )
{
player.settings.volume = 100;
playerinfo.innerHTML = “100″;
}
else
{
player.settings.volume = 5;
playerinfo.innerHTML = player.settings.volume;
}
}
//静音
function mute()
{
player.settings.mute = !player.settings.mute;
}
//声道
function balance()
{
switch (player.settings.balance)
{
case 0:
player.settings.balance = 100;
playerinfo.innerHTML = ‘左声道’;
break;
case 100:
player.settings.balance = -100;
playerinfo.innerHTML = ‘右声道’;
break;
case -100:
player.settings.balance = 0;
playerinfo.innerHTML = ‘全声道’;
break;
default :
player.settings.balance = 0;
playerinfo.innerHTML = ‘全声道’;
break;
}
}
//更新时间
function updatetime()
{
playerinfo.innerHTML = player.controls.currentPositionString ” | ” player.currentMedia.durationString;
}
</script>
</head>
<body onload=”playerinit();”>
<table width=”300″>
<tr>
<td><object id=”player” classid=”CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6″ type=”application/x-oleobject” width=”300″ height=”60″>
<param name=”autoStart” value=”false”>
<param name=”balance” value=”0″>
<param name=”currentPosition” value=”0″>
<param name=”currentMarker” value=”0″>
<param name=”enableContextMenu” value=”true”>
<param name=”enableErrorDialogs” value=”false”>
<param name=”enabled” value=”true”>
<param name=”fullScreen” value=”false”>
<param name=”invokeURLs” value=”false”>
<param name=”mute” value=”true”>
<param name=”playCount” value=”1″>
<param name=”rate” value=”1″>
<param name=”uiMode” value=”none”>
<param name=”volume” value=”100″>
</object></td>
</tr>
<tr>
<td><span id=”playerinfo”></span></td>
</tr>
<tr>
<td>
<div align=”center”>
<input type=”button” onmouseover=this.className=”but12″; onmouseout=this.className=”but11″; name=”previous” title=”上一首” onclick=”previous();”>
<input type=”button” onmouseover=this.className=”but22″; onmouseout=this.className=”but21″; name=”play” title=”播放” onclick=”play();”>
<input type=”button” onmouseover=this.className=”but32″; onmouseout=this.className=”but31″; name=”pause” title=”暂停” onclick=”pause();”>
<input type=”button” onmouseover=this.className=”but42″; onmouseout=this.className=”but41″; name=”stop” title=”停止” onclick=”stop();”>
<input type=”button” onmouseover=this.className=”but52″; onmouseout=this.className=”but51″; name=”next” title=”下一首” onclick=”next();”>
<input type=”button” onmouseover=this.className=”but62″; onmouseout=this.className=”but61″; name=”voldown” title=”音量-” onclick=”voldown();”>
<input type=”button” onmouseover=this.className=”but62″; onmouseout=this.className=”but61″; name=”volup” title=”音量 ” onclick=”volup();”>
<input type=”button” onmouseover=this.className=”but62″; onmouseout=this.className=”but61″; name=”mute” title=”静音” onclick=”mute();”>
<input type=”button” onmouseover=this.className=”but62″; onmouseout=this.className=”but61″; name=”balance” title=”声道” onclick=”balance();”>
</div>
</td>
</tr>
</table>
<script language = “JavaScript” for = player event = playstatechange(newstate)>
switch (newstate){
case 1:
playerinfo.innerHTML = “停止”;
break;
case 2:
playerinfo.innerHTML = “暂停”;
break;
case 3:
playerinfo.innerHTML = “正在播放”;
break;
case 4:
playerinfo.innerHTML = “4″;
break;
case 5:
playerinfo.innerHTML = “5″;
break;
case 6:
playerinfo.innerHTML = “正在缓冲…”;
break;
case 7:
playerinfo.innerHTML = “7″;
break;
case 8:
playerinfo.innerHTML = “8″;
break;
case 9:
playerinfo.innerHTML = “正在连接…”;
break;
case 10:
playerinfo.innerHTML = “准备就绪.欢迎光临<a href=’http://mp3.asp2004.net’>http://mp3.asp2004.net</a>”;
break;
case 11:
playerinfo.innerHTML = “11″;
break;
default:
playerinfo.innerHTML = “”;
}
</script>
</body>
</html>

超级经典一套鼠标控制左右滚动图片带自动翻滚

星期一, 06月 2nd, 2008

点击运行可以看到效果:
[Ctrl A 全选 提示:您可先修改部分相关代码,再按运行]