EXT日期

问题描述,如何把后台的日期格式传到前台让Ext来解析呢 ,且不会丢失精度?

       第一步,我们先来看看Ext.util.Format的方法说明

date ( String/Date value , [String format ]  ) : String

Parse a value into a formatted date using the specified format pattern.

Parse a value into a formatted date using the specified format pattern.

Parameters:

value : String/Date

The value to format (Strings must conform to the format expected by the javascript Date object’s parse() method )

format : String

(optional) Any valid date format string (defaults to ‘m/d/Y’)

Returns:

String

The formatted date string

上面加粗的相信大家看到了 ,只要我们传回的日期格式的字符串能被javaScript 中的 Date的parse解析的话,那么在前台Ext就会自动识别

现在焦点就转移的js Date.parse的方法上了,用脑袋笨寻思就是知道,如果parse不知道GMT格式的字符串,那么他就太笨了,呵呵

所以我们日期类型在向前台返回时只要 返回  logTime.toGMTString()这个就可以了

后台  logTime.toGMTString()

前台

{

            header : “操作时间”,

            dataIndex : “logTime”,

            width : 80,

            sortable : true,

            renderer : Ext.util.Format.dateRenderer(‘Y-m-d H:i:s’)//想转成什么样的类型都可以了

        }

不需要修改任何Ext代码

datefield 组件 —- >format格式.

js常用正则表达式实例

匹配中文字符的正则表达式: [\u4e00-\u9fa5] 

匹配双字节字符(包括汉字在内):[^\x00-\xff] 

应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} 

匹配空行的正则表达式:\n[\s| ]*\r 

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/  

匹配首尾空格的正则表达式:(^\s*)|(\s*$) 

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下: 

String.prototype.trim = function() 

return this.replace(/(^\s*)|(\s*$)/g, ""); 

利用正则表达式分解和转换IP地址: 

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序: 

function IP2V(ip) 

re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 
if(re.test(ip)) 

return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 

else 

throw new Error("Not a valid IP address!") 

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下: 

var ip="10.100.20.168" 
ip=ip.split(".") 
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) 

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./ %&=]*)  

利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复] 

var s="abacabefgeeii" 
var s1=s.replace(/(.).*\1/g,"$1") 
var re=new RegExp("["+s1+"]","g") 
var s2=s.replace(re,"")  
alert(s1+s2) //结果为:abcefgi 

这个方法对于字符顺序有要求的字符串可能不适用。 

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1 

s="http://www.9499.net/page1.htm" 
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2") 
alert(s) 

利用正则表达式限制网页表单里的文本框输入内容: 


正则表达式限制只能输入中文:onkeyup="value="/value.replace(/["^\u4E00-\u9FA5]
/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\u4E00-\u9FA5]/g,’’))" 

用正则表达式限制只能输入全角字符: onkeyup="value="/value.replace(/["^\uFF00-
\uFFFF]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\uFF00-\uFFFF]/g,’’))" 

用正则表达式限制只能输入数字:onkeyup="value="/value.replace(/["^\d]
/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))" 

用正则表达式限制只能输入数字和英文:onkeyup="value="/value.replace(/[\W]
/g,"’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"

Lucene全文检索中用到方法

Services中调用接口方法:

   1.重新生成索引

      

 /**
     * 重新生成索引
     *
     * @return
     */
    public String newIndex(String page) {
        HelpSearchDomain helpSearchDomain = (HelpSearchDomain) getContextBean("helpSearchDomain");
        BaseInfoAttributeDomain baseInfoAttributeDomain = (BaseInfoAttributeDomain) getContextBean("baseInfoAttributeDomain");
        //设置分页对象信息
        SplitPage sp = new SplitPage();
        sp.setCurrentPage(Integer.parseInt(page));
        sp.setPageSize(20);
        List knowledgeList = baseInfoAttributeDomain.getAllBaseInfoAttribute("1", sp);
        String path = "D:\\upload";
        path = PropertiesUtil.get("PATH", path);
        if (knowledgeList != null && knowledgeList.size() > 0) {
            for (Iterator iterator = knowledgeList.iterator(); iterator.hasNext();) {
                BaseInfoAttribute bi = (BaseInfoAttribute) iterator.next();
                BaseInfoAttribute bia = null;
                System.out.println(bi.getInfoType().getType());
                if (bi.getInfoType().getType().equals(InfoType.ZSK)) {
                    bia = baseInfoAttributeDomain.findBaseInfoAttribute(bi.getId());
                }
                try {
                    helpSearchDomain.delKnowledgeIndex(path + "\\" + bia.getContent(), bia.getInfoType().getName(), path);//删除索引
                } catch (Exception e) {
                    e.getMessage();
                }
            }
            for (Iterator iterator = knowledgeList.iterator(); iterator.hasNext();) {
                BaseInfoAttribute bi = (BaseInfoAttribute) iterator.next();
                if (bi.getInfoType().getType().equals(InfoType.ZSK)) {
                    BaseInfoAttribute bia = baseInfoAttributeDomain.findBaseInfoAttribute(bi.getId());
                    helpSearchDomain.createKnowledgeIndex(false, path + "\\" + bia.getContent(), path, bia.getTitle(), bia.getCreatetime(), bia.getInfoType().getName(), String.valueOf(bi.getId()));
                }
            }
        }
        return "索引生成成功";
    }

 

2.根据条件检索内容

  

/**
     * 根据条件检索内容
     *
     * @param keyword
     * @param type
     * @param page
     * @return
     */
    public Object searchKnowledgeQuery(String keyword, String type, String page) {
        HelpSearchDomain helpSearchDomain = (HelpSearchDomain) getContextBean("helpSearchDomain");
        String path = "D:\\upload";
        SplitPage sp = new SplitPage();
        sp.setPageSize(18);
        sp.setCurrentPage(page == null   1 : Integer.parseInt(page));
        String isExist = helpSearchDomain.isExistsKnowlegeIndex(path);
        List returnlist = new ArrayList();
        List _list = new ArrayList();
        List list = new ArrayList();
        if (!isExist.equals("")) {
            if (type.equals("3")) {//标题
                list = helpSearchDomain.searchKnowlegeByKey("title", keyword, path, sp);
                if (list != null && list.size() > 0) {
                    int len = list.size();
                    for (int i = 0; i < len; i++) {
                        Map m = (Map) list.get(i);
                        Map map = new HashMap();
                        map.put("id", m.get("knowlegeid"));
                        map.put("title", "<a href=\"javascript:void(0)\" onclick=\'getKnowledgeInfo(" + m.get("knowlegeid") + ")\'>" + m.get("title") + "</a>");
                        map.put("infoType", m.get("infoType"));
                        map.put("createtime", m.get("createtime"));
                        _list.add(map);
                    }
                }
            } else if (type.equals("2")) {// 内容
                list = helpSearchDomain.searchKnowlegeByKey("contents", keyword, path, sp);
                if (list != null && list.size() > 0) {
                    int len = list.size();
                    for (int i = 0; i < len; i++) {
                        Map m = (Map) list.get(i);
                        Map map = new HashMap();
                        map.put("id", m.get("knowlegeid"));
                        map.put("title", "<a href=\"javascript:void(0)\" onclick=\'getKnowledgeInfo(" + m.get("knowlegeid") + ")\'>" + m.get("title") + "</a>");
                        map.put("infoType", m.get("infoType"));
                        map.put("createtime", m.get("createtime"));
                        _list.add(map);
                    }
                }
            } else { //全文
                list = helpSearchDomain.searchKnowlegeByKey("all", keyword, path, sp);
                if (list != null && list.size() > 0) {
                    int len = list.size();
                    for (int i = 0; i < len; i++) {
                        Map m = (Map) list.get(i);
                        Map map = new HashMap();
                        map.put("id", m.get("knowlegeid"));
                        map.put("title", "<a href=\"javascript:void(0)\" onclick=\'getKnowledgeInfo(" + m.get("knowlegeid") + ")\'>" + m.get("title") + "</a>");
                        map.put("infoType", m.get("infoType"));
                        map.put("createtime", m.get("createtime"));
                        _list.add(map);
                    }
                }
            }
            returnlist.add(_list);
            returnlist.add(sp);
            return returnlist;
        } else {
            return "";
        }
    }

 

有不懂得地方加:QQ413540158

DWZ(JUI)教程根据ID刷新dialogDWZ(JUI)教程根据ID刷新dialog

 

来源:http://blog.csdn.net/jiweigang1/article/details/7908789

 

DWZ (JUI) 教程 根据ID刷新 dialog
分类:DWZ——JUI

DWZ (JUI) 教程 dialog 刷新

最近有朋友问到 有没有dialog 刷新的方法, 在原先的dialog是有刷新的方法的 reload:function(url, options){

但是不能 根据 dialog id 进行刷新 ,其实简单封装一下就可以了,希望对大家有帮助。

 

 

[javascript]view plaincopy

 
  1. reloadDialog:function(dialogId){
  2. vardialog=$(“body”).data(dialogId);
  3. if(dialog){
  4. $.pdialog.reload(dialog.data(“url”),{dialogId:dialogId});
  5. }
  6. },

 

这是我简单封装的方法 ,加入到 dwz-dialog.js 里就行了。

大家好好看看这里的源码,看看dwz是如何存放 dialog,url 等属性的 ,就可以自己封装出来自己想要的方法了。

 

转载请标明出处http://blog.csdn.net/jiweigang1/article/details/7908789

 

微博地址http://weibo.com/u/1534913940

 

 

DWZ (JUI) 教程 dialog 刷新

最近有朋友问到 有没有dialog 刷新的方法, 在原先的dialog是有刷新的方法的 reload:function(url, options){

但是不能 根据 dialog id 进行刷新 ,其实简单封装一下就可以了,希望对大家有帮助。

 

 

[javascript]view plaincopy

 
  1. reloadDialog:function(dialogId){
  2. vardialog=$(“body”).data(dialogId);
  3. if(dialog){
  4. $.pdialog.reload(dialog.data(“url”),{dialogId:dialogId});
  5. }
  6. },

 

 

这是我简单封装的方法 ,加入到 dwz-dialog.js 里就行了。

大家好好看看这里的源码,看看dwz是如何存放 dialog,url 等属性的 ,就可以自己封装出来自己想要的方法了。

 

转载请标明出处http://blog.csdn.net/jiweigang1/article/details/7908789

 

微博地址http://weibo.com/u/1534913940

使用<!–//–>这样的html注释把js代码注起来的作用

一直不明白用eclipse代码提示功能生成<script></script>代码块的时候,会使用<!– //–>这样的html注释把js代码注起来。之前在各大搜索引擎找寻答案一直未果,今天无意中在w3school看到了答案。真是那个柳暗花明什么什么的,在此记录一下。

如何与老的浏览器打交道

那些不支持 JavaScript 的浏览器会把脚本作为页面的内容来显示。为了防止这种情况发生,我们可以使用这样的 HTML 注释标签:

<html>
<body>
<script type="text/javascript">
<!--
document.write("Hello World!");
//-->
</script>
</body>
</html>

 

注释行末尾的两个正斜杠是 JavaScript 的注释符号,它会阻止 JavaScript 编译器对这一行的编译。

 

不过,现在还有浏览器不支持js吗?

JavaScriptIRR算法

function IRR(cashFlows, estimatedResult) {
    var result = "isNAN";
    if (cashFlows != null && cashFlows.length > 0) {
        // check if business startup costs is not zero:
        if (cashFlows[0] != 0) {
            var noOfCashFlows = cashFlows.length;
            var sumCashFlows = 0;
            // check if at least 1 positive and 1 negative cash flow exists:
            var noOfNegativeCashFlows = 0;
            var noOfPositiveCashFlows = 0;
            for (var i = 0; i < noOfCashFlows; i++) {
                sumCashFlows += cashFlows[i];
                if (cashFlows[i] > 0) {
                    noOfPositiveCashFlows++;
                } else {
                    if (cashFlows[i] < 0) {
                        noOfNegativeCashFlows++;
                    }
                }
            }

            // at least 1 negative and 1 positive cash flow available 
            if (noOfNegativeCashFlows > 0 && noOfPositiveCashFlows > 0) {
                // set estimated result:
                var irrGuess = 0.1; // default: 10%
                if (!isNaN(estimatedResult)) {
                    irrGuess = estimatedResult;
                    if (irrGuess <= 0) {
                        irrGuess = 0.5;
                    }
                }

                // initialize first IRR with estimated result:
                var irr = 0;
                if (sumCashFlows < 0) { // sum of cash flows negative 
                    irr = -irrGuess;
                } else { // sum of cash flows not negative
                    irr = irrGuess;
                }

                // iteration:
                // the smaller the distance, the smaller the interpolation
                // error
                var minDistance = 1e-15;

                // business startup costs
                var cashFlowStart = cashFlows[0];
                var maxIteration = 100;
                var wasHi = false;
                var cashValue = 0;
                for (var i = 0; i <= maxIteration; i++) {
                    // calculate cash value with current irr:
                    cashValue = cashFlowStart; // init with startup costs

                    // for each cash flow
                    for (var j = 1; j < noOfCashFlows; j++) {
                        cashValue += cashFlows[j] / Math.pow(1 + irr, j);
                    }

                    // cash value is nearly zero
                    if (Math.abs(cashValue) < 0.01) {
                        result = irr;
                        break;
                    }

                    // adjust irr for next iteration:
                    // cash value > 0 => next irr > current irr
                    if (cashValue > 0) {
                        if (wasHi) {
                            irrGuess /= 2;
                        }
                        irr += irrGuess;
                        if (wasHi) {
                            irrGuess -= minDistance;
                            wasHi = false;
                        }
                    } else {// cash value < 0 => next irr < current irr
                        irrGuess /= 2;
                        irr -= irrGuess;
                        wasHi = true;
                    }

                    // estimated result too small to continue => end
                    // calculation
                    if (irrGuess <= minDistance) {
                        result = irr;
                        break;
                    }
                }
            }
        }
    }
    return result;
}

 

 

我的QQ

<a href=”http://sighttp.qq.com/cgi-bin/check sigkey=5b49f1dc7e219b898533ba12b62a6f5f88961c348e2e561df1917877654967336df90f5638d979e270dfa4b402bb9c81a89d7fa0fc98ec39″; target=_blank; onclick=”var tempSrc=’http://sighttp.qq.com/wpa.js rantime=’+Math.random()+’&sigkey=5b49f1dc7e219b898533ba12b62a6f5f88961c348e2e561df1917877654967336df90f5638d979e270dfa4b402bb9c81a89d7fa0fc98ec39′;var oldscript=document.getElementById(‘testJs’);var newscript=document.createElement(‘script’);newscript.setAttribute(‘type’,’text/javascript’); newscript.setAttribute(‘id’, ‘testJs’);newscript.setAttribute(‘src’,tempSrc);if(oldscript == null){document.body.appendChild(newscript);}else{oldscript.parentNode.replaceChild(newscript, oldscript);}return false;”><img border=”0″ SRC=’http://wpa.qq.com/pa p=1:346637299:1′ alt=”点击这里给我发消息”></a>

 

关于COOKIE个数与大小的问题

 

 实话讲,再没有经历过大网站大并发的考验是很少去注意这方面的问题也很少去用到cookie,今天有同事又问起关于cookie的问题,我就到网上查询了一下做了一些相关的摘要记录下来,以备不时之用。关于cookie的操作,做为JS程序员应该是相对熟悉一些的,所以就不对它进行过多的说明了。

以下就是关于各浏览器之间对cookie的不同限制:

IE6.0

IE7.0/8.0

Opera

FF

Safari

Chrome

cookie个数:

每个域为20个

每个域为50个

每个域为30个

每个域为50个

没有个数限制

每个域为53个

cookie总大小:

4095个字节

4095个字节

4096个字节

4097个字节

4097个字节

4097个字节

超出个数限制后的处理操作:

1、IE与Opera的处理是一样的。他们都利用“最近最少使用算法”,当cookie已经达到限额时就将自动剔除最老的cookie,以给最新的cookie的留下可用的空间。

2、FF很特殊,虽然最后设置的cookie会被保留下来,但它好像没有什么章法随机进行删除已存在的cookie。

备注:

在我们进行页面cookie操作的时候,应该尽量保证cookie的数量以及相应的大小。cookie个数最好 < 20~30个;cookie大小最好 < 4K

 

jquery插件开发及extend

    以下信息是在看了IBM上的一篇文章(使用 jQuery(中级),第 2 部分: 创建自己的插件)http://www.ibm.com/developerworks/cn/web/wa-aj-jquery6/ ca=drs-tp4608之后,自己的一些想法。

    这文章主要是从如何写一个插件上来说,中间主要用到的还是在jQuery.fn上做文章,通过定义一个闭包函数,将jQuery作为参数传递过去,再在这个fn增加自己的函数来实现。中间有几个问题,记录如下:

    1,为什么往fn上加函数就可以让jquery对象调用了呢?

看了下代码,注意到这句(jQuery.fn = jQuery.prototype),这句其实很明白了,jQuery.fn实际上就是jQuery.prototype,通过原型来实现一个函数的添加。而在fn上追加的函数上使用this,这个this实际上就是jQuery对象。因为fn就是prototype,调用函数者就是jQuery实现上就是jQuery的一个实例化对象。

 

    看了下文章中关于插件开发的,具体代码倒是其次,主要是其中有几个要点很重要。复制如下:

    1,让内部方法私有化,这其实就是说在自己写的插件里面,因为这个函数可能就自己的插件调用,这其实也是为了避免代码污染。在jquery中有很多例子的。

    2,让默认值可覆盖,这就是说在程序中可能会有一些默认值。所以需要在传递参数中,传递一些可以覆盖默认参数的东西,比如参数中经常传递options这个参数,其实就是拿来覆盖默认参数的。

 

    还有几个插件开发规则,复制如下:

    1,文件命名为 “jquery.<your plug-in name>.js”,这个没什么说的。

    2,所有新方法都附加到 jQuery.fn 对象,所有新功能都附加到 jQuery 对象,这个其实就是往对象上加函数。插件写法就是jQuery.fn.plugin=function(options)的这种样子。

    3,“this” 用于引用 jQuery 对象。这个如果按照第条规则,this肯定引用到jQuery的。

    4,插件中定义的所有方法/函数的末尾都必须带有一个 “;”(分号),否则将不利于代码的最小化。这个不清楚了。

    5,除有特别注明外,所有方法都必须返回 jQuery 对象,其实就是返回this。这个主要是为了链式编程吧,jQuery中到处都是这种。

    6,总是在插件代码中使用 “jQuery” 而不是 “$”。这个不是强制的,比如中我写的闭包就可以这样写:(function($))(jQuery)的这种格式,然后在里面使用$,这里的$其实就是jQuery,这个是参数传递上的东西。

 

   最后就是里面经常用到的extend函数了。简单看了下,整个函数很简单,就是一个复制过程,但在jQuery中经常用到,比如ajax就是通过extend带到jquery中的。

    这里面有个问题,我们使用ajax都是通过$.ajax这种形式访问的,这就表明ajax其实不算是jquery对象的一个方法,最多算一个静态方法。这就实际上说明,extend是往一个对象上追加信息,而$.ajax是往$这个类对象上加,而不是jqury实例对象站加,所以就不能用类似$().ajax的形式来进行ajax访问了,后者返回的是一个undefined信息。在方法内部,实际上就是一个this引用的问题了。

    还是将jquery自己的代码贴出来,在上面加注释信息。

 

jQuery.extend = jQuery.fn.extend = function() {
	//target就是复制目的是哪个对象,这里首先就是第一个参数。
	//i表示source的起始坐标。0被target占用,所以源是目的的下一个
	//length,当前参数长度了;deep,是否深度copy,深度copy就是将里面的对象再次序列化,进行迭代调用
	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

	//处理第一个函数是boolean的情况,就是说第一个函数可以控制是否深度copy,那这样的话接下来的参数就是往后移位了.
	//jquery中很多地方都是这种处理情况,往往参数列表中有个参数缺失,那么不需要用null来占位,而是直接将后面的参数移到前面来,这样就有一个处理参数移位的问题.
	//在这个里面,第一个参数被占位,那么target就为1位了,源再+1往后走了.
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	//处理这个目的不是object对象,且又不是函数的,这样的话,实际target可能就是其他东西,比如字符串或者基本类型等,这时就将target进行改变.实际上就是忽略target的原来信息.可以理解成一个用source来代替target.
	if ( typeof target !== "object" && !jQuery.isFunction(target) )
		target = {};

	//如果length==i,其实就是没有source的情况,那么将将target变成source,原先的target就直接用调用者this代替了.这样的话,其实就是直接往调用者上加东西.
	//这个用$.ajax来理解,最适合了.源代码中jQuery.extend({ajax:function()});的形式,其实就是直接往$上加函数,因为调用者就是jQuery
	if ( length == i ) {
		target = this;
		--i;
	}
	//进行循环,将source(可能有很多个source,按顺序进行copy),也就是说可以这样写$.extend(target,source1,source2);
	//这样后面的信息可以覆盖前面的信息,而source1可以是函数内置的一个默认信息,source2可以对信息进行更改.
	for ( ; i < length; i++ )
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null )
			// Extend the base object
			for ( var name in options ) {
				//这里就对两边进行取信息了,src表示从target中取的信息(这个可能是null,当然也可能不是,不是的话,那么后面的copy就可能要覆盖这个值了)
				//copy就是从source中取的信息了.
				var src = target[ name ], copy = options[ name ];

				// Prevent never-ending loop
				//这里主要是为了防止在深度copy的情况下,出现无限迭代的情况.比如这种情况:extend(true,target,{"a":target}),这样的话,就会出现无限copy了
				if ( target === copy )
					continue;

				// //这里就是处理深度copy了,如果需要,就进行深度copy,将copy后的值加到target中
				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
					target[ name ] = jQuery.extend( deep, 
						// Never move original objects, clone them
						src || ( copy.length != null   [ ] : { } )
					, copy );

				// 不加undefined值
				else if ( copy !== undefined )
					target[ name ] = copy;

			}

	// 返回target
	return target;
};

     翻译都是按照自己的理解来翻译的,可能不对。

    

     在看了这个东西,感觉在其他程序中(我做java,java中很多这种)也有很多类似的设定,需要进行类似迭代处理,比较直观的就是java中java对象转json的处理了,都一样要对一个对象json化成一个string,中间仍要处理各种类型的信息,还要避免无限迭代等。

 

     以上都是整个jquery中大信息中的小小的一部分。了解一些,总比过后忘了好。

javascript小技巧

text文本框 内容保存

<HTML> 
<HEAD> 
<META NAME="save" CONTENT="history"> 
<STYLE> 
   .sHistory {behavior:url(#default#savehistory);} 
</STYLE> 
</HEAD> 
<BODY> 
<INPUT class=sHistory type=text id=oPersistInput> 
</BODY> 
</HTML>

现在挺流行的一种链接样式

其主要技巧是使用了标记a的border样式变化来实现虚线变实线的效果,感觉这个用法挺有创意的,呵呵,而传统上都是用下划线来做这类样式的。附上其实现代码:

<style type="text/css">
a#link0716:link,a#link0716:visited
{ color:#9AC8ED;border-bottom:1px dotted #9AC8ED;text-decoration:none;}
a#link0716:hover 
{ border-bottom:1px solid #000;color:#000;}
</style>
<a id="link0716" href="#">我是低调的超链接</a>