有趣的浏览器地址栏Javascript代码

03:08

FROM: http://www.kenengba.com/post/483.html/trackback

1 编辑网页

在地址栏输入下面的代码按 enter, 网页上所有元素都能变成可编辑状态, 你可以移动, 调整元素大小. 如果你只是讨厌某个网站想发泄一下, 我建议你使用 NetDisater.

    javascript:document.body.contentEditable='true'; document.designMode='on'; void 0

2 无敌风火轮

在地址栏运行下面的代码可使页面上所有图片元素一个接一个地转圈.

这种效果最好的实现地方就是图片搜索了, 改变代码里的 img 成任何网页上有的字符, 可以使这些字符做无敌风火轮运动.

    javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; DI=document.getElementsByTagName("img"); DIL=DI.length; function A(){for(i=0; i-DIL; i++){DIS=DI[ i ].style; DIS.position='absolute'; DIS.left=(Math.sin(R*x1+i*x2+x3)*x4+x5)+"px"; DIS.top=(Math.cos(R*y1+i*y2+y3)*y4+y5)+"px"}R++}setInterval('A()',5); void(0);

3 晃来晃去

不但是你, 浏览器也不是那么喜欢这个 Javascript. 在地址栏运行这个代码后, 浏览器会迅速地晃来晃去.


    javascript:function flood(n) {if (self.moveBy) {for (i = 200; i > 0;i--){for (j = n; j > 0; j--) {self.moveBy(1,i); self.moveBy(i,0);self.moveBy(0,-i); self.moveBy(-i,0); } } }}flood(6);{ var inp = "D-X !msagro na dah tsuj resworb rouY"; var outp = ""; for (i = 0; i <= inp.length; i++) {outp =inp.charAt (i) + outp ; } alert(outp) ;}; reverse

4 计算器

在地址栏输入下面的代码, 可以实现简单的四则运算:

     javascript: alert(34343+3434-222);

5 防钓鱼验证

某些钓鱼网站提供的 URL 和网页本身的 URL 是不一致的, 可以用下面的代码进行验证, 当两个 URL 相差太大的时候, 就要稍加小心了:

    javascript:alert("The actual URL is:tt" + location.protocol + "//" + location.hostname + "/" + "nThe address URL is:tt" + location.href + "n" + "nIf the server names do not match, this may be a spoof.");

复制到剪切板

02:47

web 开发中常常要实现 “复制到剪切板” 功能。这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了。Firefox 默认下不能直接通过 Javascript 操作剪切板,必须开启相关的设置才行。想只通过 Javascript 技术实现跨浏览器 的剪切板是行不通的。现在常用的方法是利用 JavaScript+Flash实现,普遍流传的办法是 _clipboard.swf,这是国外最早实现的(著名的 Clipboard Copy 解决方案: http://www.jeffothy.com/weblog/clipboard-copy/)。但是很可惜,_clipboard.swf 在新出来的 flash10 中无效,因为 Flash10 中规定了只有在 swf 上进行了实际的操作(比如鼠标点击)才能启动剪切板。而 _clipboard.swf 方法的 swf 是隐藏的,通过 JavaScript 来操作 flash 的剪切板,显然没有对 swf 进行实际的用户操作。

function copy(v_str , tip_obj) {
	copy_clip(v_str);
}

function copy_clip(text2copy) {
	if (window.clipboardData) {
		window.clipboardData.setData("Text", text2copy);
	} else {
		var flashcopier = 'flashcopier';
		if(!document.getElementById(flashcopier)) {
			var divholder = document.createElement('div');
			divholder.id = flashcopier;
			document.body.appendChild(divholder);
		}
		document.getElementById(flashcopier).innerHTML = '';
		var divinfo = '<embed src="/img/_clipboard.swf" FlashVars="clipboard='+escape(text2copy)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
		document.getElementById(flashcopier).innerHTML = divinfo;
	}
	return true;
}

function copyToClipboard(txt) {
	if (window.clipboardData) {
		window.clipboardData.clearData();
		window.clipboardData.setData("Text", txt);
	}	else if (navigator.userAgent.indexOf("Opera") != -1) {
		window.location = txt;
	}	else if (window.netscape)	{
		try {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
		}	catch (e)	{
			alert("您的firefox安全限制限制您进行剪贴板操作,请打开'about:config'将signed.applets.codebase_principal_support'设置为true'之后重试");
			return false;
		}
		var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
		if (!clip)
			return false;
		var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
		if (!trans)
			return false;
		trans.addDataFlavor('text/unicode');
		var str = new Object();
		var len = new Object();
		var str = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
		var copytext = txt;
		str.data = copytext;
		trans.setTransferData("text/unicode",str,copytext.length*2);
		var clipid = Components.interfaces.nsIClipboard;
		if (!clip)
			return false;
		clip.setData(trans,null,clipid.kGlobalClipboard);
	}
	return true;
}

最近国外出现了一种新的方法,而且专门做了一个 JavaScript 库 Zero Clipboard ,它包含一个 flash 影片和一个 JavaScript 接口,这个 flash 是透明的(不是隐藏),用户不会察觉到它的存在。这个 flash 覆盖在一个 DOM元素上,比如 button,div之类,当点击这个 DOM 时,你实际点击的是这个 flash,这个作用在 flash 上的动作能够开启 flash 的剪切板。这实际上就是一种 clickjacking。

DEMO页面 : http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/

Zero Clipboard项目主页: http://code.google.com/p/zeroclipboard/

万年历

09:30
var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052d0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0)
var solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
var Animals=new Array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
var solarTerm = new Array("小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,
195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,
440795,462224,483532,504758);
var nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十');
var nStr2 = new Array('初','十','廿','卅',' ');
//var monthName = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");
var monthName = new Array("1","2","3","4","5","6","7","8","9","10","11","12");

var sFtv = new Array(
  "0101*元旦",
  "0115 成人节",
  "0214 情人节",
  "0303 女孩节",
  "0308 妇女节",
  "0312 植树节",
  "0308 妇女节",
  "0312 植树节",
  "0315 消费者日",
  "0401 愚人节",
  "0407 卫生日",
  "0413 宋干节",
  "0417 食品节",
  "0501 劳动节",
  "0504 青年节",
  "0505 男孩节",
  "0512 护士节",
  "0513 无烟日",
  "0601 儿童节",
  "0605 环境日",
  "0701 香港回归",
  "0801 建军节",
  "0804 筷子节",
  "0808 父亲节",
  "0910 教师节",
  "0915 敬老节",
  "0928 孔子诞辰",
  "1001*国庆节",
  "1006 老人节",
  "1010 啤酒节",
  "1016 粮食日",
  "1024 联合国日",
  "1031 万圣节",
  "1111 光棍节",
  "1220 澳门回归",
  "1224 平安夜",
  "1225 圣诞节",
  "1226 节礼日"
);

var lFtv = new Array(
  "0101*春节",
  "0115 元宵节",
  "0505 端午节",
  "0707 七夕",
  "0715 中元节",
  "0815 中秋节",
  "0909 重阳节",
  "1208 腊八节",
  "1224 小年",
  "0100*除夕"
);

var wFtv = new Array(
  "0520 母亲节",
  "0630 父亲节",
  "0716 合作节",
  "1144 感恩节"
);

var cM = new Array(
  "正",  "二",  "三",  "四",  "五",  "六",  "七",  "八",  "九",  "十",  "十一",  "十二");

function lYearDays(y) {
  var i, sum = 348
  for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0
  return(sum+leapDays(y))
}

function leapDays(y) {
  if(leapMonth(y))  return((lunarInfo[y-1900] & 0x10000)? 30: 29)
  else return(0)
}

function leapMonth(y) {
  return(lunarInfo[y-1900] & 0xf)
}

function monthDays(y,m) {
  return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 )
}

function Lunar(objDate) {
  var i, leap=0, temp=0;
  var baseDate = new Date(1900, 0, 31);
  var offset   = (objDate - baseDate)/86400000;

  this.dayCyl = offset + 40;
  this.monCyl = 14;

  for(i = 1900; i<2050 && offset>0; i++) {
    temp = lYearDays(i)
    offset -= temp
    this.monCyl += 12
  }

  if(offset<0) {
    offset += temp;
    i--;
    this.monCyl -= 12
  }

  this.year = i
  this.yearCyl = i-1864

  leap = leapMonth(i)
  this.isLeap = false

  for(i=1; i<13 && offset>0; i++) {

    if(leap>0 && i==(leap+1) && this.isLeap==false) {
      --i; this.isLeap = true; temp = leapDays(this.year);
    } else {
      temp = monthDays(this.year, i);
    }

    if(this.isLeap==true && i==(leap+1)) this.isLeap = false

    offset -= temp
    if(this.isLeap == false) this.monCyl++
  }

  if(offset==0 && leap>0 && i==leap+1)
    if(this.isLeap) {
      this.isLeap = false;
    } else {
      this.isLeap = true; --i; --this.monCyl;
    }

  if(offset<0) { offset += temp; --i; --this.monCyl; }

  this.month = i;
  this.day = offset + 1;
}

function solarDays(y,m) {
  if(m==1)
    return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28);
  else
    return(solarMonth[m]);
}

function cyclical(num) {
  return(Gan[num%10]+Zhi[num%12])
}

function calElement(sYear,sMonth,sDay,week,lYear,lMonth,lDay,isLeap,cYear,cMonth,cDay) {

  this.isToday    = false;
  this.sYear      = sYear;
  this.sMonth     = sMonth;
  this.sDay       = sDay;
  this.week       = week;
  this.lYear      = lYear;
  this.lMonth     = lMonth;
  this.lDay       = lDay;
  this.isLeap     = isLeap;
  this.cYear      = cYear;
  this.cMonth     = cMonth;
  this.cDay       = cDay;

  this.color      = '';

  this.lunarFestival = ''; //农历节日
  this.solarFestival = ''; //国历节日
  this.solarTerms    = ''; //节气

}

function sTerm(y,n) {
  var offDate = new Date( ( 31556925974.7*(y-1900) + sTermInfo[n]*60000  ) + Date.UTC(1900,0,6,2,5) )
  return(offDate.getUTCDate())
}

function calendar(y,m) {
  var sDObj, lDObj, lY, lM, lD=1, lL, lX=0, tmp1, tmp2;
  var lDPOS = new Array(3);
  var n = 0;
  var firstLM = 0;

  sDObj = new Date(y, m, 1);  //当月一日日期
  this.length = solarDays(y, m);    //国历当月天数

  this.firstWeek = sDObj.getDay();    //国历当月1日星期几

  for(var i = 0;i < this.length; i++) {
    if(lD > lX) {
      sDObj = new Date(y, m, i + 1)    //当月一日日期

      lDObj = new Lunar(sDObj)     //农历
      lY    = lDObj.year           //农历年
      lM    = lDObj.month          //农历月
      lD    = lDObj.day            //农历日
      lL    = lDObj.isLeap         //农历是否闰月
      lX    = lL? leapDays(lY): monthDays(lY,lM) //农历当月最後一天

      if(n==0) firstLM = lM;
      lDPOS[n++] = i-lD + 1
    }

    //sYear,sMonth,sDay,week,
    //lYear,lMonth,lDay,isLeap,
    //cYear,cMonth,cDay
    this[i] = new calElement(y, m+1, i+1, nStr1[(i+this.firstWeek)%7],
                             lY, lM, lD++, lL,
                             cyclical(lDObj.yearCyl) ,cyclical(lDObj.monCyl), cyclical(lDObj.dayCyl++) )

    if((i+this.firstWeek)%7==0)   this[i].color = 'red'  //周日颜色
    if((i+this.firstWeek)%14==13) this[i].color = 'red'  //周休二日颜色
  }

  tmp1=sTerm(y,m*2 )-1;
  tmp2=sTerm(y,m*2+1)-1;
  if (typeof(solarTerm[m * 2]) != 'undefined') {
    this[tmp1].solarTerms = solarTerm[m*2];
  }

  if (typeof(solarTerm[m * 2 + 1]) != 'undefined') {
    this[tmp2].solarTerms = solarTerm[m*2+1];
  }

   if(m==3) this[tmp1].color = 'red' //清明颜色

   for(i in sFtv)
      if(sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/))
        if(Number(RegExp.$1)==(m+1)) {
          this[Number(RegExp.$2)-1].solarFestival += RegExp.$4 + ' '
          if(RegExp.$3=='*') this[Number(RegExp.$2)-1].color = 'red'
        }

  for(i in wFtv)
    if(wFtv[i].match(/^(\d{2})(\d)(\d)([\s\*])(.+)$/))
      if(Number(RegExp.$1)==(m+1)) {
       tmp1=Number(RegExp.$2)
       tmp2=Number(RegExp.$3)
       this[((this.firstWeek>tmp2)?7:0) + 7*(tmp1-1) + tmp2 - this.firstWeek].solarFestival += RegExp.$5 + ' '
      }

    //农历节日
    for(i in lFtv)
      if(lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
         tmp1=Number(RegExp.$1)-firstLM
        if(tmp1==-11) tmp1=1
          if(tmp1 >=0 && tmp1<n) {
             tmp2 = lDPOS[tmp1] + Number(RegExp.$2) -1
             if( tmp2 >= 0 && tmp2<this.length) {
                this[tmp2].lunarFestival += RegExp.$4 + ' '
                if(RegExp.$3=='*') this[tmp2].color = 'red'
             }
          }
      }

    //黑色星期五
    if((this.firstWeek+12)%7==5)
      this[12].solarFestival += '黑色星期五 '

   //今日
  if(y==tY && m==tM && typeof(this[tD - 1]) != 'undefined') this[tD-1].isToday = true;

}

//====================== 中文日期
function cDay(d){
  var s;
  switch (d) {
     case 10:
       s = '初十'; break;
     case 20:
       s = '二十'; break;
       break;
     case 30:
       s = '三十'; break;
       break;
     default :
       s = nStr2[Math.floor(d/10)];
       s += nStr1[d%10];
  }
  return(s);
}

var cld;
function drawCld(SY,SM) {
  var i,sD,s,size;
  cld = new calendar(SY,SM);

  if(SY>1874 && SY<1909) yDisplay = '光绪' + (((SY-1874)==1)?'元':SY-1874)
  if(SY>1908 && SY<1912) yDisplay = '宣统' + (((SY-1908)==1)?'元':SY-1908)
  if(SY>1911 && SY<1950) yDisplay = '民国' + (((SY-1911)==1)?'元':SY-1911)
  //   if(SY>1949) yDisplay = '共和国' + (((SY-1949)==1)?'元':SY-1949)

  // GZ.innerHTML = yDisplay +'年 农历' + cyclical(SY-1900+36) + '年('+Animals[(SY-4)%12]+')';

  if (SY>1949) yDisplay = ''

  GZ.innerHTML = yDisplay +' 农历' + cyclical(SY-1900+36) + '年('+Animals[(SY-4)%12]+')';

  YMBG.innerHTML = SY + "年" + monthName[SM] + "月";
  for(i=0;i<42;i++) {
     sObj=eval('SD'+ i);
     lObj=eval('LD'+ i);
     sObj.className = '';
     sD = i - cld.firstWeek;
    if(sD>-1 && sD<cld.length) {
      sObj.innerHTML = sD+1;
      if(cld[sD].isToday) sObj.className = 'todyaColor';
      sObj.style.color = cld[sD].color;
      if(cld[sD].lDay==1)
        lObj.innerHTML = '<b>'+(cld[sD].isLeap?'闰':'') + cMonth(cld[sD].lMonth)+ '月' + (monthDays(cld[sD].lYear,cld[sD].lMonth)==29?'小':'大')+'</b>';
      else
        lObj.innerHTML = cDay(cld[sD].lDay);

      s=cld[sD].lunarFestival;

      if(s.length>0) {
        if(s.length>6) s = s.substr(0, 4)+'…';
        s = s.fontcolor('red');
      }  else { //国历节日
        s=cld[sD].solarFestival;
        if(s.length>0) {
          size = (s.charCodeAt(0)>0 && s.charCodeAt(0)<128)?8:4;
          if(s.length>size+2) s = s.substr(0, size)+'…';
          s = s.fontcolor('blue');
        }  else { //廿四节气
          s=cld[sD].solarTerms;
          if(s.length>0) s = s.fontcolor('limegreen');
        }
      }
      if(s.length>0) lObj.innerHTML = s;

    } else { //非日期
      sObj.innerHTML = '';
      lObj.innerHTML = '';
    }
  }
}

function cMonth(m) {
  if (typeof(cM[parseInt(m) -1]) != 'undefined') {
    return cM[parseInt(m) - 1];
  } else {
    return m;
  }
}

var Today = new Date();
var tY = Today.getFullYear();
var tM = Today.getMonth();
var tD = Today.getDate();

tY = 2009;
tM = 4;

cld = new calendar(tY, tM);
$.each(cld, function(i,n ) {
  if (i == 9) {
    str = '';
    $.each(n, function( j, k) {
      str = str + j + ' ' + k + "\n";
    });
    alert(str);
  }

});

工作需要
时间紧张
只好到网上找了个
在此基础上做修改
很感谢写这万年历的原创者

Javascript 事件兼容说明

06:26

http://www.quirksmode.org/dom/events/index.

密码强度

05:41

FROM: blueidea

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>密码强度</title>
<style type="text/css">
body{
 font-size:12px;
 font-family: arial, helvetica, sans-serif;
 margin:0;
}
form{
 margin:2em;
}
#chkresult{margin-left:53px;height:15px;}
</style>
</head>

<body>
<form name="form1">
 <label for="pwd">用户密码</label>
 <input type="password" name="pwd" onblur="chkpwd(this)" />
 <div id="chkresult"></div>
 <label for="pwd2">重复密码</label>
 <input type="password" name="pwd2" />
</form>
<script type="text/javascript">
 function chkpwd(obj){
  var t = obj.value;
  var id = getresult(t);

  //定义对应的消息提示
  var msg = new Array(4);
  msg[0]="密码过短。";
  msg[1]="密码强度差。";
  msg[2]="密码强度良好。";
  msg[3]="密码强度高。";

  var sty = new Array(4);
  sty[0]=-45;
  sty[1]=-30;
  sty[2]=-15;
  sty[3]=0;

  var col = new Array(4);
  col[0]="gray";
  col[1]="red";
  col[2]="#ff6600";
  col[3]="green";

  //设置显示效果
  var bimg="http://bbs.blueidea.com/attachments/2011/12/03/pwdlen_dsipeegqwxfo.gif";//一张显示用的图片
  var swidth=300;
  var sheight=15;
  var bobj = document.getElementById("chkresult");
  bobj.style.fontsize="12px";
  bobj.style.color=col[id];
  bobj.style.width=swidth + "px";
  bobj.style.height=sheight + "px";
  bobj.style.lineheight=sheight + "px";
  bobj.style.background="url(" + bimg + ") no-repeat left " + sty[id] + "px";
  bobj.style.textIndent = "20px";
  bobj.innerHTML = "检测提示:" + msg[id];
 }

 //定义检测函数,返回0/1/2/3分别代表无效/差/一般/强
 function getresult(s){
  if(s.length < 4){
   return 0;
  }
  var ls = 0;
  if (s.match(/[a-z]/ig)){
   ls++;
  }
  if (s.match(/[0-9]/ig)){
   ls++;
  }
   if (s.match(/(.[^a-z0-9])/ig)){
   ls++;
  }
  if (s.length < 6 && ls > 0){
   ls--;
  }
  return ls
 }
</script>
</body>

</html>

判断浏览器函数

05:26
function justify_browser() {
    var Sys = {};
    var ua = navigator.userAgent.toLowerCase();
    var s;
    (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
    (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
    (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
    (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
    (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;

    if (Sys.ie) return 1;
    if (Sys.firefox) return 2;
    if (Sys.chrome) return 3;
    if (Sys.opera) return 4;
    if (Sys.safari) return 5;
}

Javascript中使用document.getElement

05:25

页面具有 DTD (或者说指定了 DOCTYPE) 时,使用 document.documentElement。
页面不具有 DTD (或者说没有指定了 DOCTYPE) 时,使用 document.body。
在 IE 和 Firefox 中均是如此。
为了兼容,可以使用如下代码:

var scrollTop = window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;

offsetTop、offsetLeft、offsetWidth、offsetHeight、style中的样式

05:21

假设 obj 为某个 HTML 控件

  • obj.offsetTop 指 obj 距离上方或上层控件的位置, 整型, 单位 px.
  • obj.offsetLeft 指 obj 距离左方或上层控件的位置, 整型, 单位 px.
  • obj.offsetWidth 指 obj 控件自身的宽度, 整型, 单位 px.
  • obj.offsetHeight 指 obj 控件自身的高度, 整型, 单位 px.

我们对前面提到的 “上方或上层” 与 “左方或上层” 控件作个说明.

例如:

<div id="tool">
      <input type="button" value="提交">
      <input type="button" value="重置">
</div>

提交 按钮的 offsetTop提交 按钮距 tool 层上边框的距离, 因为距其上边最近的是 tool 层的上边框.
重置 按钮的 offsetTop重置 按钮距 tool 层上边框的距离, 因为距其上边最近的是 tool 层的上边框.

提交 按钮的 offsetLeft提交 按钮距 tool 层左边框的距离, 因为距其左边最近的是 tool 层的左边框.
重置 按钮的 offsetLeft重置 按钮距 提交 按钮右边框的距离, 因为距其左边最近的是 提交 按钮的右边框.

offsetTop 可以获得 HTML 元素距离上方或外层元素的位置, style.top 也是可以的, 二者的区别是:

  • offsetTop 返回的是数字, 而 style.top 返回的是字符串, 除了数字外还带有单位 px.
  • offsetTop 只读, 而 style.top 可读写.
  • 如果没有给 HTML 元素指定过 top 样式, 则 style.top 返回的是空字符串.

offsetLeft 与 style.left, offsetWidth 与 style.width, offsetHeight 与 style.height 也是同样道理.
offsetTop, offsetLeft 在IE6, IE7下不会工作.

  • scrollHeight 获取对象的滚动高度.
  • scrollLeft 设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
  • scrollTop 设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
  • scrollWidth 获取对象的滚动宽度
  • offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
  • offsetLeft 获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
  • offsetTop 获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置
  • event.clientX 相对文档的水平座标
  • event.clientY 相对文档的垂直座标
  • event.offsetX 相对容器的水平坐标
  • event.offsetY 相对容器的垂直坐标
  • document.documentElement.scrollTop 垂直方向滚动的值
  • event.clientX+document.documentElement.scrollTop 相对文档的 水平座标+垂直方向滚动的量

以上主要指IE之中, FireFox差异如下:
IE6.0, FF1.06+

  • clientWidth = width + padding
  • clientHeight = height + padding
  • offsetWidth = width + padding + border
  • offsetHeight = height + padding + border

IE5.0/5.5

  • clientWidth = width – border
  • clientHeight = height – border
  • offfsetWidth = width
  • offsetHeight = height

另外, CSS中的 margin 属性, 与clientWidth, offsetWidth, clientHeight, offsetHeight均无关

对于所有的属性, 这里有详细的说明并有实例.

Javascript dateDiff函数

06:29
function dateDiff(interval, date1, date2) {
	var objInterval = {'D' : 1000 * 60 * 60 * 24, 'H' : 1000 * 60 * 60, 'M' : 1000 * 60, 'S' : 1000, 'T' : 1};
	interval = interval.toUpperCase();
	var dt1 = Date.parse(date1.replace(/-/g, '/'));
	var dt2 = Date.parse(date2.replace(/-/g, '/'));
	try	{
		return Math.round((dt2 - dt1) / eval('(objInterval.' + interval + ')'));
	} catch (e) {
		return e.message;
	}
}

说明:

  • interval 取值: d (day), m(minutes), s(second), t(毫秒), 不分区大小写.
  • 日期格式 yyyy (/-) (m)m (/-) (d)d
  • 使用方式 alert(dateDiff('D', '2007-4-1', '2007/04/19'));.

jQuery 选择器

14:50

1 基础选择器

名称

说明

举例

#id

根据元素Id选择

$("divId")选择ID为divId的元素

element

根据元素的名称选择,

$("a")选择所有<a>元素

.class

根据元素的css类选择

$(".bgRed")选择所用CSS类为bgRed的元素

*

选择所有元素

$("*")选择页面所有元素

selector1,
selector2,
selectorN

可以将几个选择器用","分隔开然后再拼成一个选择器字符串.会同时选中这几个选择器匹配的内容.

$("#divId,a,.bgRed")

2 层次选择器

名称

说明

举例

ancestor descendant

使用”form input”的形式选中form中的所有input元素.即ancestor(祖先)为from,descendant(子孙)为input.

$(“.bgRed div”)选择CSS类为bgRed的元素中的所有<div>元素.

parent>child

选择parent的直接子节点child.child必须包含在parent中并且父类是parent元素.

$(“.myList>li”)选择CSS类为myList元素中的直接子节点<li>对象.

prev+next

prev和next是两个同级别的元素.选中在prev元素后面的next元素.

$(“#hibiscus+img”)选在id为hibiscus元素后面的img对象.

prev~siblings

选择prev后面的根据siblings过滤的元素
注:siblings是过滤器

$(“#someDiv~[title]“)选择id为someDiv的对象后面所有带有title属性的元素

3 基本过滤器

名称

说明

举例

:first

匹配找到的第一个元素

查找表格的第一行:$(“tr:first”)

:last

匹配找到的最后一个元素

查找表格的最后一行:$(“tr:last”)

:not(selector)

去除所有与给定选择器匹配的元素

查找所有未选中的input元素:$(“input:not(:checked)”)

:even

匹配所有索引值为偶数的元素,从0开始计数

查找表格的1、3、5…行:$(“tr:even”)

:οdd

匹配所有索引值为奇数的元素,从0开始计数

查找表格的2、4、6行:$(“tr:odd”)

:eq(index)

匹配一个给定索引值的元素
注:index从0开始计数

查找第二行:$(“tr:eq(1)”)

:gt(index)

匹配所有大于给定索引值的元素
注:index从0开始计数

查找第二第三行,即索引值是1和2,也就是比0大:$(“tr:gt(0)”)

:lt(index)

选择结果集中索引小于N的elements
注:index从0开始计数

查找第一第二行,即索引值是0和1,也就是比2小:$(“tr:lt(2)”)

:header

选择所有h1,h2,h3一类的header标签.

给页面内所有标题加上背景色:$(“:header”).css(“background”,”#EEE”);

:animated

匹配所有正在执行动画效果的元素

只有对不在执行动画效果的元素执行一个动画特效:

$(“#run”).click(function(){
$(“div:not(:animated)”).animate({left:”+=20″},1000);
});

4 内容过滤器

名称

说明

举例

:contains(text)

匹配包含给定文本的元素

查找所有包含”John”的div元素:$(“div:contains(‘John’)”)

:empty

匹配所有不包含子元素或者文本的空元素

查找所有不包含子元素或者文本的空元素:$(“td:empty”)

:has(selector)

匹配含有选择器所匹配的元素的元素

给所有包含p元素的div元素添加一个text类:$(“div:has(p)”).addClass(“test”);

:parent

匹配含有子元素或者文本的元素

查找所有含有子元素或者文本的td元素:$(“td:parent”)

可见性过滤器

名称

说明

举例

:hidden

匹配所有的不可见元素

注:在1.3.2版本中,hidden匹配自身或者父类在文档中不占用空间的元素.如果使用CSSvisibility属性让其不显示但是占位,则不输入hidden.

查找所有不可见的tr元素:$(“tr:hidden”)

:visible

匹配所有的可见元素

查找所有可见的tr元素:$(“tr:visible”)

6 属性过滤器

名称

说明

举例

[attribute]

匹配包含给定属性的元素

查找所有含有id属性的div元素:
$(“div[id]“)

[attribute=value]

匹配给定的属性是某个特定值的元素

查找所有name属性是newsletter的input元素:
$(“input[name='newsletter']“).attr(“checked”,true);

[attribute!=value]

匹配给定的属性是不包含某个特定值的元素

查找所有name属性不是newsletter的input元素:
$(“input[name!='newsletter']“).attr(“checked”,true);

[attribute^=value]

匹配给定的属性是以某些值开始的元素

$(“input[name^='news']“)

[attribute$=value]

匹配给定的属性是以某些值结尾的元素

查找所有name以’letter’结尾的input元素:
$(“input[name$='letter']“)

[attribute*=value]

匹配给定的属性是以包含某些值的元素

查找所有name包含’man’的input元素:
$(“input[name*='man']“)

[attributeFilter1][attributeFilter2][attributeFilterN]

复合属性选择器,需要同时满足多个条件时使用。

找到所有含有id属性,并且它的name属性是以man结尾的:
$(“input[id][name$='man']“)

7 子元素过滤器

名称

说明

举例

:nth-child(index/even/odd/equation)

匹配其父元素下的第N个子或奇偶元素

‘:eq(index)’只匹配一个元素,而这个将为每一个父元素匹配子元素。:nth-child从1开始的,而:eq()是从0算起的!

可以使用:
nth-child(even)
:nth-child(odd)
:nth-child(3n)
:nth-child(2)
:nth-child(3n+1)
:nth-child(3n+2)

在每个ul查找第2个li:
$(“ulli:nth-child(2)”)

:first-child

匹配第一个子元素

‘:first’只匹配一个元素,而此选择符将为每个父元素匹配一个子元素

在每个ul中查找第一个li:
$(“ulli:first-child”)

:last-child

匹配最后一个子元素

‘:last’只匹配一个元素,而此选择符将为每个父元素匹配一个子元素

在每个ul中查找最后一个li:
$(“ulli:last-child”)

: οnly-child

如果某个元素是父元素中唯一的子元素,那将会被匹配

如果父元素中含有其他元素,那将不会被匹配。

在ul中查找是唯一子元素的li:
$(“ulli:only-child”)

8 表单选择器

名称

说明

解释

:input

匹配所有input,textarea,select和button元素

查找所有的input元素:
$(“:input”)

:text

匹配所有的文本框

查找所有文本框:
$(“:text”)

:password

匹配所有密码框

查找所有密码框:
$(“:password”)

:radio

匹配所有单选按钮

查找所有单选按钮

:checkbox

匹配所有复选框

查找所有复选框:
$(“:checkbox”)

:submit

匹配所有提交按钮

查找所有提交按钮:
$(“:submit”)

:image

匹配所有图像域

匹配所有图像域:
$(“:image”)

:reset

匹配所有重置按钮

查找所有重置按钮:
$(“:reset”)

:button

匹配所有按钮

查找所有按钮:
$(“:button”)

:file

匹配所有文件域

查找所有文件域:
$(“:file”)

« Previous PageNext Page »