??xml version="1.0" encoding="utf-8" standalone="yes"?> setIntervalҎ则是表示间隔一定时间反复执行某操作?/p> 如果用setTimeout实现setInerval的功能,需要在执行的程序中再定时调用自己才行。如果要清除计数器需?Ҏ使用的方法不同,调用不同的清除方法: 例如Qtttt=setTimeout('northsnow()',1000); clearTimeout(tttt); 或者: tttt=setInterval('northsnow()',1000); clearInteval(tttt); 举一个例子: 或者: <div id="liujincai"></div>
<input type="button" name="start" value="start" onclick='startShow();'>
<input type="button" name="stop" value="stop" onclick="stop();">
<script language="javascript">
var intvalue=1;
var timer2=null;
function startShow()
{
liujincai.innerHTML=liujincai.innerHTML + " " + (intvalue ++).toString();
timer2=window.setTimeout("startShow()",2000);
}
function stop()
{
window.clearTimeout(timer2);
}
</script>
<input type="button" name="start" value="start" onclick='timer2=window.setInterval("startShow()",2000);//startShow();'>
<input type="button" name="stop" value="stop" onclick="stop();">
<script language="javascript">
var intvalue=1;
var timer2=null;
function startShow()
{
liujincai.innerHTML=liujincai.innerHTML + " " + (intvalue ++).toString();
}
function stop()
{
window.clearInterval(timer2);
}
</script>
]]>
]]>
]]>
把下面代码copy入你html文g?lt;head>?lt;/head>中即可:
<script language="JavaScript">
var num = 2;
var mypage = 'http://www.webjx.com';
var pissoff = ' 你必d点击上面的链?';
allow = Array();
allow[num] = 2;
function gotoit(link){
if (link != num){
allow[link] = 2;
} else {
for (i=1;i<=num;i++){
if (allow[i] != 2){
i = num + 1;
lemmeIn = 0;
} else {
lemmeIn = 1;
}
}
if (lemmeIn == 1){
window.location = mypage;
} else {
alert(pissoff);
}
}
}
//--->
</script>
把下面代码copy入你html文g?lt;body>?lt;/body>中即可:
<a href="http://www.webjx.com" onClick="gotoit(1)" target="_blank"><u>先帮忙点击这?lt;/u></a><BR>
<a href="javascript:gotoit(num)"><u>q入</u></a><BR>
<script language="Javascript">
<!--
document.write('<a href="http://www.webjx.com" target="_top">sdfdsf</a>');
//-->
</script>
=====================================
强制点击q告大法(2)Q点了图象才能看到链接.可用于强制点d?/p>
W一?把如下代码加?lt;head>区域?/p>
<SCRIPT language="JavaScript">
<!--
function MM_showHideLayers() { //v2.0
var i, visStr, args, theObj;
args = MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) { //with arg triples (objNS,objIE,visStr)
visStr = args[i+2];
if (navigator.appName == 'Netscape' && document.layers != null) {
theObj = eval(args[i]);
if (theObj) theObj.visibility = visStr;
} else if (document.all != null) { //IE
if (visStr == 'show') visStr = 'visible'; //convert vals
if (visStr == 'hide') visStr = 'hidden';
theObj = eval(args[i+1]);
if (theObj) theObj.style.visibility = visStr;
} }
}
function MM_preloadImages() { //v2.0
if (document.images) {
var imgFiles = MM_preloadImages.arguments;
if (document.preloadArray==null) document.preloadArray = new Array();
var i = document.preloadArray.length;
with (document) for (var j=0; j<imgFiles.length; j++) if (imgFiles[j].charAt(0)!="#"){
preloadArray[i] = new Image;
preloadArray[i++].src = imgFiles[j];
} }
}
//-->
</SCRIPT>
W二??lt;body>Z加入如下代码
<div id="Layer1" style="position:absolute; left:240px; top:175px; width:306px; height:63px; z-index:1; visibility: hidden"><a href="http://www.webjx.com"><font color=green size="5" face="隶书">带你M个意想不到的地方!</font></a></font></div>
<div id="Layer2" style="position:absolute; left:280px; top:237px; width:147px; height:82px; z-index:2; visibility: visible">
<p align="center"><a href="http://www.webjx.com" target="_blank">
<img SRC="http://www.webjx.com/skill/mm.jpg" border="0" onMouseDown="MM_showHideLayers('document.layers[\'Layer1\']','document.all[\'Layer1\']','show')"></a></font><br>
</p>
</div>
W三??lt;body>Z内容改ؓ:
<body bgcolor="#fef4d9" onLoad="MM_preloadImages()">
=======================================
强制点击q告大法(3)Q两个文字链接要先后点击Q否则就跛_警告?/p>
W一?把如下代码加?lt;head>区域?br /><script language="JavaScript">
var num = 2;
var mypage = 'http://www.webjx.com';
var pissoff = ' 请先点击上面链接 ';
allow = Array();
allow[num] = 2;
function gotoit(link){
if (link != num){
allow[link] = 2;
} else {
for (i=1;i<=num;i++){
if (allow[i] != 2){
i = num + 1;
lemmeIn = 0;
} else {
lemmeIn = 1;
}
}
if (lemmeIn == 1){
window.location = mypage;
} else {
alert(pissoff);
}
}
}
//--->
</script>
W二?把如下代码加?lt;body>区域?br /><a href="http://www.webjx.com" onClick="gotoit(1)" target="_blank"><u>先帮忙点击这?lt;/u></a><BR>
<a href="javascript:gotoit(num)"><u>下蝲本站所有页?lt;/u></a>
<script language="javascript">
<!--
function document.onkeydown(){
event.keyCode = 0;
event.returnvalue = false;
}
-->
</script>
<script language="javascript">
<!--
function document.oncontextmenu()
{
return false;
}
-->
</script>
function nocontextmenu()
{
if(document.all) {
event.cancelBubble=true;
event.returnvalue=false;
return false;
}
}
<body onmousedown="rclick()" oncontextmenu= "nocontextmenu()">
<script language="javascript">
<!--
function rclick()
{
if(document.all) {
if (event.button == 2){
event.returnvalue=false;
}
}
}
-->
</script>
<script language="javascript">
<!--
//屏蔽鼠标右键、Ctrl+N、Shift+F10、F5h、退格键
function window.onhelp(){return false} //屏蔽F1帮助
function KeyDown(){
if ((window.event.altKey)&&
((window.event.keyCode==37)|| //屏蔽 Alt+ 方向??br />(window.event.keyCode==39))){ //屏蔽 Alt+ 方向??br />alert("不准你用ALT+方向键前q或后退|页Q?);
event.returnvalue=false;
}
if ((event.keyCode == 8) &&
(event.srcElement.type != "text" &&
event.srcElement.type != "textarea" &&
event.srcElement.type != "password") || //屏蔽退格删除键
(event.keyCode==116)|| //屏蔽 F5 h?br />(event.ctrlKey && event.keyCode==82)){ //Ctrl + R
event.keyCode=0;
event.returnvalue=false;
}
if ((event.ctrlKey)&&(event.keyCode==78)) //屏蔽 Ctrl+n
event.returnvalue=false;
if ((event.shiftKey)&&(event.keyCode==121)) //屏蔽 shift+F10
event.returnvalue=false;
if (window.event.srcElement.tagName == "A" && window.event.shiftKey)
window.event.returnvalue = false; //屏蔽 shift 加鼠标左键新开一|页
if ((window.event.altKey)&&(window.event.keyCode==115)){ //屏蔽Alt+F4
window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");
return false;}
}
window.open("你的.htm", "","toolbar=no,location=no,directories=no,menubar=no,
scrollbars=no,resizable=yes,status=no,top=0,left=0")
window.open("你的.asp", "", "fullscreen=yes")
*/
//-->
</script>
<script language=javascript>
function window.onbeforeunload()
{
if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)
{
window.event.returnvalue = "";
}
}
</script>
<script language="javascript">
<!--
window.open(www.32pic.com,"32pic","fullscreen=3,height=100, width=400,
top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no,
status=no");
-->
</script>
onbeforeunload="javascript:return false"http://使不能关闭窗?/p> <script language="javascript"> <a href="javascript:location.replace(url)"> style="overflow-y:hidden" onload="setInterval('clipboardData.setData(\'Text\',\'\')',100)" <style> <META HTTP-EQUIV="imagetoolbar" CONTENT="no"> <img galleryimg="no"> <noscrript></noscript>
五、屏蔽F5?/strong>
<!--
function document.onkeydown()
{
if ( event.keyCode==116)
{
event.keyCode = 0;
event.cancelBubble = true;
return false;
}
}
-->
</script>
六、屏蔽IE后退按钮
在你链接的时候用
七、屏蔽主H口滚动?/strong>
在body标签里加?br />
八、屏蔽拷?不断地清I剪贴板
在body标签里加?br />
九、屏蔽网站的打印功能
@media print {
* { display: none }
}
</style>
十、屏蔽IE6.0 囄上自动出现的保存图标
Ҏ一Q?br />
Ҏ二:
十一、屏蔽页中所有的script
]]>
虽然 JavaScript 是脚本语a, 但它所支持的面向对象编E也是非常强大的. 虽然它没有类和实? 但它有对? 原型和隐式的l承. 我们会解释如何模拟l承及其类与子cM间关pȝ形式. 原型是理解承概늚关键, 我们会教你如何建立原型, 如何一个对象是否是另外一个对象的原型, 及其 JavaScript 的模型与 Java 面向对象~程之间的区? 我们同样会向你展C如何检对象所包含的各U属性的Ҏ. 在另外一文章里, 我还会详l地讲解有关 "原型?(prototype chain)" 的知?
本文大量地参考了 Webreference.com ?"Object-Oriented Programming with JavaScript, Part I: Inheritance" 的内? 许多内容我进行了详细的测试和再探? 以保证内容不会有太大的失?
原文地址: http://www.webreference.com/js/column79/
面向对象语言的特?/strong>
面向对象设计是基于以?3 个主要原理的: 装, l承和多? 说某U程序语a是支?OO (面向对象) 设计? 只有在它的语法中支持以上 3 个概忉|可以q么? q种语言应该Z提供某些Ҏ, 以你能很轻村֜定义和用这些范? 装涉及C某个对象变成一?"黑盒?的概? 当你使用某个对象? 你不用知道它内部是如何工作的, 你也不必理解对象是如何工作的. q个对象只需它l对有用的信息以接口方式提供出来. 此对象应该给你提供友好的接口, 来让你可以用其有限的属性集和方法集. 装q有一层意? 那就是说某个对象包含了它需要的每一样东? q包括数据和对于它的操作. 装的概念非常的强大, 因ؓ它允许将一个大的Y仉目有效地分配l每个开发h? 对于团队中的每个? 他们只需要关注自己所实现的对? 而不需要太多地x于别人的实现. 开发项目中的开销使得开发团队中成员与接口的数量按指数别增? 装是自 "软g危机" 以来最受欢q的 OO 设计理念.
软g的复用是 OO 设计思想中另外一个重要的特点. 在Y件体pM实现此思想的主要方法就是? cd是定义对象的功能. 类是某个新c? 或者说是子c被建立的来源类. 一个子cM它的类中承了所的方法和属? 实际? 所有的子类都是被自动地生成? 因此节省了大量的工作. 你不需要一个一个地定义q些子类. 当然, 你可以重载那些承下来的Ҏ和属? 事实? 谁也没有指出哪个子类要徏立得和其类一模一? 除非你没有重载Q何的属性和Ҏ.
多态可能是q个 3 个概念中最复杂的一个了. 其本质上是说, 每个对象都可以处理各U不同的数据cd. 你不必ؓ处理不同的数据类型而徏立不同的c? 其典型的例子是d的类, 你不必ؓ实现d, ȝ? L圆而编写不同的c? 你可以徏立一个够聪明的cL调用特定的方法来操作特定的Ş?
通过函数实现l承
虽然 JavaScript 不支持显C承操作符, 但你可以通过其实方式实现隐式l承. 对于实现cȝl承, ?2 U比较常用的方式. W一U将某个cd义成子类的方法是, 通过在负责定义子cd数的内部调用类的构造函? 看下面的CZ:
// 类构造函?br />function superClass() {
this.bye = superBye;
this.hello = superHello;
}
// 子类构造函?br />function subClass() {
this.inheritFrom = superClass;
this.inheritFrom();
this.bye = subBye;
}
function superHello() {
return "Hello from superClass";
}
function superBye() {
return "Bye from superClass";
}
function subBye() {
return "Bye from subClass";
}
// 试构造特性的函数
function printSub() {
var newClass = new subClass();
alert(newClass.bye());
alert(newClass.hello());
}
当你q行上面?printSub 函数? 它会依次执行 subBuy ?superHello 函数. 我们可以看到, bye ?hello Ҏ最先在 superClass 中被定义? 然? ?subClass ? bye Ҏ又被重蝲? subClass 构造函数头两行的功能只是做了一个简单的原始的承操? 但它是通过昄执行 inheritFrom Ҏ来完成的l承操作. l承的过E先是将 superClass 的对象原型赋l?subClass 下的 inheritFrom Ҏ, 然后在执行完 superClass 的构造函数后, superClass 的属性就被自动地加到?subClass 的属性列表中.q主要是׃?subClass 中通过 this 来调用的 inheritFrom (也就?superClass) 构造函数造成? 通过此种方式调用 superClass 构造函数时, JavaScript 解释器会?superClass 中的 this ?subClass 中的 this 理解成位于同一个作用域下的 this 关键? 所以就产生了承的效果.
另外, 需要说明的? 对于M一个实例化的对? 你Q意地为它d属性或Ҏ, 如下所C?
var newClass = new subClass();
newClass.addprop = "added property to instance object";
很明? 通过此种方式d的属性和Ҏ只对当前实例化对象有? 不会影响所有的同类型对象实? 无疑, 它是你创造的一个独一无二的对象实?
通过原型实现l承
W二U? 也是更强大的Ҏ是通过建立一个超cd? 然后其赋值给子类对象?prototype 属? 以此方式来徏立子cȝl承. 假设我们的超cL superClass, 子类?subClass. ?prototype 的赋值格式如?
subClass.prototype = new superClass;
对于原型l承的实现方? 让我们刚前面的代码改写一? CZ如下:
// 类构造函?br />function superClass() {
this.bye = superBye;
this.hello = superHello;
}
// 子类构造函?br />function subClass() {
this.bye = subBye;
}
subClass.prototype = new superClass;
function superHello() {
return "Hello from superClass";
}
function superBye() {
return "Bye from superClass";
}
function subBye() {
return "Bye from subClass";
}
// 试构造特性的函数
function printSub() {
var newClass = new subClass();
alert(newClass.bye());
alert(newClass.hello());
}
我们可以看到, 除了前面第一U承方式中 subClass 中的?2 行内? 换成函数外的 prototype 赋D句之? 没有其它M的变? 但代码的执行效果和前面是一L.
为已l徏立的对象d属?/strong>
通过原型实现的承比通过函数实现的承更? 因ؓ它支持动态? 你可以在构造函数已l完成之? 再通过 prototype 属性定义超cȝ其它Ҏ和属? q且其下的子cd象会自动地获得新的方法和属? 下面是示? 你可以看到它的效?
function superClass() {
this.bye = superBye;
this.hello = superHello;
}
function subClass() {
this.bye = subBye;
}
subClass.prototype = new superClass;
function superHello() {
return "Hello from superClass";
}
function superBye() {
return "Bye from superClass";
}
function subBye() {
return "Bye from subClass";
}
var newClass = new subClass();
/*****************************/
// 动态添加的 blessyou 属?br />superClass.prototype.blessyou = superBlessyou;
function superBlessyou() {
return "Bless You from SuperClass";
}
/*****************************/
function printSub() {
alert(newClass.bye());
alert(newClass.hello());
alert(newClass.blessyou());
}
q就是我们经常看到的为内部对? ?String, Math {再d其它属性和Ҏ的技? 对于M的内部对象和自定义对? 你都也可以通过 prototype 来重载其下的属性和Ҏ. 那么在调用执行时, 它将调用你所定义的方法和属? 下面是示?
// 为内?String 对象dҎ
String.prototype.myMethod = function(){
return "my define method";
}
// 为内?String 对象重蝲Ҏ
String.prototype.toString = function(){
return "my define toString method";
}
var myObj = new String("foo");
alert(myObj.myMethod());
alert(myObj);
alert("foo".toString());
另外需要注意的? 所?JavaScript 内部对的 prototype 属性都是只ȝ. 你可以像上面那样为内部对象的原型d或重载属性和ҎQ但不能更改该内部对象的 prototype 原型. 然? 自定义对象可以被赋给新的原型. 也就是说, 像下面这样做是没有意思的.
function Employee() {
this.dept = "HR";
this.manager = "John Johnson";
}
String.prototype = new Employee;
var myString = new String("foo");
上面的程序在q行之后不会报错, 但显? 如果你调?myString.dept 会得到一个非定义的?
另外, 一个经怋用的?prototype 下的 isPrototypeOf() Ҏ, 它主要用来判断指定对象是否存在于另一个对象的原型链中. 语法如下:
object1.prototype.isPrototypeOf(0bject2);
上面的格式是用来判断 Object2 是否出现 Object1 的原型链? CZ如下:
function Person() {
this.name = "Rob Roberson";
this.age = 31;
}
function Employee() {
this.dept = "HR";
this.manager = "John Johnson";
}
Employee.prototype = new Person();
var Ken = new Employee();
当执?Employee.prototype.isPrototypeOf(Ken), Person.prototype.isPrototypeOf(Ken) ?Object.prototype.isPrototypeOf(Ken) ? l果都会q回 true.
用于 Netscape 下的特定l承?/strong>
?Netscape 览?4.x ?6, 及其 Mozilla pd览? JavaScript 对象间的原型关pd储在一个特D的内部属性对象中, __proto__ (前后?2 个下划线). 下面是一个示?
function Shape() {
this.borderWidth = 5;
}
function Square() {
this.edge = 12;
}
Square.prototype = new Shape;
myPicture = new Square;
alert(myPicture.__proto__);
alert(myPicture.borderWidth);
׃脚本执行q?Square.prototype = new Shape 语句, 所?myPicture h了一个指?Shape 对象的内部属?__proto__. 在脚本的执行q程? 当要获取对象的某个属性? q且此对象是通过原型赋D徏立的某个对象, 在自wƈ没有Ҏ个属性进行定义时, JavaScript 解析器会查看它的 __proto__ 属性对? 也就它的原型对象, 然后枚D其原型中的所有属? 而得出的l果要么是有q个属? 要么是没有这个属? 如果没有此属? 再枚丑֎型对象下面的原型对象, 直到此过E真正的l束. 而所有的q些 JavaScript 引擎内部的操? 我们是不会知道的, 下面的内容就是对q个问题的解?
其实, 对于所有的自定义对? 无论它有没有使用q?prototype 赋值操? 它都h一?__proto__ 内部对象. 而如果某个对象是通过多层 prototype "l承" 来的, 所有的 "l承" 而来的属性却可以通过单的一层@环遍历出? 而不需要用什么递归法, 因ؓ JavaScript 引擎自动l我们做? CZ如下:
function Shape() {
this.borderWidth = 5;
}
function Square() {
this.edge = 12;
}
function RoundSquare()
{
this.radio = 0.5;
}
Square.prototype = new Shape;
RoundSquare.prototype = new Square;
var myPicture = new RoundSquare;
for (property in myPicture.__proto__) {
alert(property);
}
我们或者还可以通过更改后面的@? 来遍历某个子cd象承来的所有属? 如下:
for (property in RoundSquare.prototype) {
alert(property);
}
如果你不怕麻? 我们甚至q可以通过U连的方? 取出其构造函C定义的原始属性?
alert(myPicture.__proto__.__proto__.borderWidth);
无论你是否修改过此属性? 通过上面语句所取出的属性值都是原始定义? 让我们沿着q个思\再往下看, 下面的代码涉及到另外一个问? q个问题和原型链 (prototype chain) 有关. 代码如下:
function State() {
}
function City() {
}
City.prototype = new State;
function Street() {
}
Street.prototype = new City;
var UniversityAvenue = new Street();
function tryIt() {
alert(UniversityAvenue.__proto__== Street.prototype);
alert(UniversityAvenue.__proto__.__proto__==
City.prototype);
alert(UniversityAvenue.__proto__.__proto__.__proto__
== State.prototype);
alert(UniversityAvenue.__proto__.__proto__.__proto__.
__proto__== Object.prototype);
alert(UniversityAvenue.__proto__.__proto__.__proto__.
__proto__.__proto__== null);
}
当执?tryIt 函数? 所有的昄均ؓ true. 也就是说, 子类对象?prototype.__proto__ L{于类对象?prototype 属? 类对象?prototype.__proto__ L{于 Object.prototype; Object.prototype.__proto__ L?null; 而实例对象的 __proto__ L{于其类对象?prototype, q就是ؓ什么Q何自定义对象都具?__proto__ 属性的原因. 对于上面的叙q? 其对应的代码如下:
Street.prototype.__proto__ == City.prototype // true
State.prototype.__proto__ == Object.prototype // true
Object.prototype.__proto__ == null // true
UniversityAvenue.__proto__ == Street.prototype // true
模拟实现 instanceOf 函数
Ҏ上一节的内容, 我们了解了有?Netscape 所支持?__proto__ Ҏ的内容. q一? 我们利用此Ҏ来创徏自己的实例对象检函?
许多时? 我们都需要判断某个对象是否是由某个类来定义的, 在其它的语言? 你可以通过 instanceOf 函数来实现此判断. ?JavaScript 中同h供了一?instanceof q行W? 而在 __proto__ 的基? 我们完全可以自己定义一个同L函数, 虽然q看上去是在重复力_, 但有助于我们更深d了解有关 __proto__ 的知? 下面的代码只是用来说明功? 在实际的应用? 你不需要重复定?instanceOf 函数, 使用 instanceof q算W即?
function instanceOf(object, constructorFunction) {
while (object != null) {
if (object == constructorFunction.prototype)
{return true}
object = object.__proto__;
}
return false;
}
function State() {
}
function City() {
}
City.prototype = new State;
function Street() {
}
Street.prototype = new City;
var UniversityAvenue = new Street();
function demo() {
alert("instanceOf(UniversityAvenue, Street) is " +
instanceOf(UniversityAvenue, Street));
alert("instanceOf(UniversityAvenue, City) is " +
instanceOf(UniversityAvenue, City));
alert("instanceOf(UniversityAvenue, State) is " +
instanceOf(UniversityAvenue, State));
}
你会看到所有的q行l果全部?true, 其原理和上一节的U连判断相等如出一? 实际证明, 它的q行l果?instanceof q行W的q行l果是一致的.
你可以通过 constructor 属性来Q意对象的类, 此属性返回通过 new q算W创建新对象时所调用的构造函? q回值是 Function 对象cd. 因ؓ Object 内部对象是支?constructor 属性的, q且有的对象 (包括内部对象和自定义对象) 都是?Object l承而来? 所以所有的对象都支持此属? 让我们再看一下下面的例子:
function Employee() {
this.dept = "HR";
this.manager = "John Johnson";
}
function printProp() {
var Ken = new Employee();
alert(Ken.constructor);
}
调用?printProp 函数之后, 你会看到弹出框中昄的是 Employee 函数的定义文? 其实 Ken.constructor 的返回值本w是 Function 对象cd, 而在 alert 时被隐含地调用了 toString Ҏ. 对于cd象本w? 你同样可以调?prototype.constructor 来取出其构造函?
对象的分cd打印
JavaScript 支持 3 U主要类型的对象: 内部对象, 宿主对象, 自定义对? 可能q有Ҏ的外部对? ? ActiveX 对象?XPCOM 对象. 内部对象?JavaScript 语言本n所支持, ? Object, Math, Number 对象{? 所有的内部对象的共同特Ҏ以大写字母开? q且它们是大写敏感? 如果你想使用数学帔R PI, 必须写成 Math.PI, 你如果写?math.PI, JavaScript 会显C错? 宿主对象是被览器支持的, 目的是ؓ了能和被览的文档可以交? ? document, window ?frames. 宿主对象的特Ҏ所有对象全部以写字母开? 因ؓ JavaScript 本n是大小写敏感的, 所以你同样不能大写搞. 剩下要说的就只是自定义对象了, 你可以随便将你的对象定义成小写或大小? 但是一定要W合基本的命名规? 如下所C? q就是一个自定义对象:
function employee() {
this.dept = "HR";
this.manager = "John Johnson";
}
function printProp() {
var ken = new Employee();
for (property in ken) {
alert(property);
}
}
前面我们已经提到q? 所有的内部对象和自定义对象都是?Object 对象l承而来? 它是所有对象的类对象. 你可建立一?Object 对象的实? 如下:
var myObject = new Object();
Object cd的对象有许多的属性和Ҏ, 你可以查看相关的手册. 上面只是定义了一个最单的I对? 你还可以?Object 构造函C入参? 它会q回相应cd值的实例化对? C, q回值的cd是某U对象类型的 (? String, Number ?Object). q种方式和直接通过赋值字W串或数值常量不? 主要表示在类型方? 如下所C?
var myObject = new Object("foo"); // q回值类型ؓ object
var myObject = new String("foo"); // q回值类型ؓ object, 效果同上
?br />var myObject = "foo"; // q回值类型ؓ string
你可以从调试器的 type 列中看出q个l微的差? 它是单类型与对象cd之间的区? 但是, 你通过 alert 调用是看Zq些内部差别? 因ؓ在调?alert 的过E中, 所有的对象cd值都会被自动调用 toString Ҏq行字符串类型{? 转换规则?JavaScript 手册中有说明. 如果?alert 的是某个自定义对? q且它没有定?toString Ҏ, 那么它的q回值将?"[object Object]". 对于 Math 对象, 当你查看?Math.constructor 属性时, 你会得到一个不同于其它内部对象的内容ؓ "function Object()..." 的对象构造函? q与其它对象q回 "function Function()..." 的构造函数很不相? 原因很简? 因ؓ Math 对象是不能通过 new q算W进行创建的.
另外, 如果传入 Object 构造函C的值是一个对? 它将原封不动地将该对象返? C, 此操作只是一个引? 而不是复?
h对象的属?/strong>
在前面的CZ代码? 已经出现q以循环方式枚D对象属性的CZ. 其实, 通过 for...in 语句, 无论是Q何对象和数组, 其下的元? 属性和Ҏ都可以遍历出? CZ如下:
function employee() {
this.dept = "HR";
this.manager = "John Johnson";
}
function printProp() {
var ken = new employee();
for (property in ken) {
alert(property + " : " + ken[property]);
}
}
在遍历测试过E中, 你会发现, 对于自定义对象和宿主对象一般都可以枚D出其下的属? 而对于内部对? 几乎没有什么属性可以遍历出? Z么要说几乎呢? 因ؓ对于 Mozilla 内核的浏览和 IE 内核的浏览器, ?JavaScript 引擎有不? Mozilla 下可以枚丑և部分内容, 而枚丄原则不得而知.
对于每一个对? 你还可以使用 hasOwnProperty Ҏ来检其是否h某个属性或Ҏ. ׃ hasOwnProperty ?Object 对象下的Ҏ, 因此所有的对象都具有此Ҏ. 但是, 需要注意的? 此方法只能检通过 this 关键字定义的成员, 如果某个成员是通过原型铑֮义的, 那么此方法将q回 false. 也就是说, 通过 prototype l承来的属性和Ҏ, 及其通过 prototype 定义的属性和Ҏ, 都是不能通过 hasOwnProperty 来进行检的. 由此, 我们可以看出, 通过 this关键字定义的属性和Ҏ是同对象本n处于同一个地址I间内的; 而通过 prototype 定义的属性和Ҏ, 是通过所谓的 "原型? q行理? 其下的的属性和Ҏ不位于同一个地址I间之间, 当其调用q种属性或Ҏ? 必须通过 "链表" 才能索引到其下的某个属性或Ҏ. 也就? 调用以原型方式定义的属性和Ҏ会有一个类g链表?"回溯" 操作.
?hasOwnProperty 差不? 对于对象中的每个属? 我们q可以通过 propertyIsEnumerable 来测试它是否可以被枚丑և? 如下所C?
function Employee1() {
this.dept = "HR";
this.manager = "John Johnson";
this.month = new Array("jan", "feb", "mar");
}
var Ken = new Employee1();
Ken.month.propertyIsEnumerable(0);
我们可以看到, 其语法是 propertyIsEnumerable 后跟数组的元素烦引或对象中的属性名U? 同样, 对于原型链中的属性或Ҏ它是不予考虑? l果当然是返?false.
对于 JavaScript ?Java 的比?/strong>
?Java q种Zcȝ语言不同, JavaScript 是一U基于原型的语言. q种特点影响着每一个方? 如术?instance 在基于类的语a中有着Ҏ的意? 它表C某个实例是隶属于某个特D类的独立个? 是对cd义的真实实现; 而在 JavaScript ? 术语 instance 没有q个意? 因ؓ在它的语法里? cd实例是没有区别的. 虽然, 实例可以用来说明某个对象是用某个特D的构造函数生成的. 如下所C?
function superClass() {
this.bye = superBye;
this.hello = superHello;
}
function subClass() {
this.bye = subBye;
}
subClass.prototype = new superClass;
function superHello() {
return "Hello from superClass";
}
function superBye() {
return "Bye from superClass";
}
function subBye() {
return "Bye from subClass";
}
var newClass = new subClass();
newClass ?subClass 的实? 它是通过 subClass 的构造函数生成的. 而如果用基于类的语a? 如下所C是 Java 的等价实?
public class superClass {
public superClass () {
this.bye = superBye;
this.hello = superHello;
}
}
public class subClass extends superClass {
public subClass () {
this.bye = subBye;
}
}
l束?/strong>
我们在上面的几节? 详细地说明了有关 JavaScipt 中的面向对象实现, 或者只能说是模拟实? 在此期间向你展示了实现方? q且阐述了有兛_何检对象之间关pȝҎ, 如何打印属性和试某个特定的属? q做了一?JavaScript ?Java 的简单比? 但这昄是不够的, 因? JavaScript 的面向对象编E是非常多样化的, 格式也非常繁? 我打在后面的内定w, 再ȝ一下有问封装的格式问题, 着重说明与对象Ҏ有关的内容和实现, 同时q有上面提到的原型链 (prototype chain) 问题.
setTimeoutҎ是定时程序,也就是在什么时间以后干什么。干完了拉倒?/p>
setIntervalҎ则是表示间隔一定时间反复执行某操作?/p>
如果用setTimeout实现setInerval的功能,需要在执行的程序中再定时调用自己才行。如果要清除计数器需?Ҏ使用的方法不同,调用不同的清除方法:
例如Qtttt=setTimeout('northsnow()',1000);
clearTimeout(tttt);
或者:
tttt=setInterval('northsnow()',1000);
clearInteval(tttt);
举一个例子:
或者:
<div id="liujincai"></div>
<input type="button" name="start" value="start" onclick='timer2=window.setInterval("startShow()",2000);//startShow();'>
<input type="button" name="stop" value="stop" onclick="stop();">
<script language="javascript">
var intvalue=1;
var timer2=null;
function startShow()
{
liujincai.innerHTML=liujincai.innerHTML + " " + (intvalue ++).toString();
}
function stop()
{
window.clearInterval(timer2);
}
</script>
在前公司Q有q本书的W二或第三版Q也一直将q本书视为经典。但那时q没有深入的ȝ它前几章的概忉|叙qͼ而是把它当成一本手册来查。现在却L地关注了Q因为Qomo的底层是以纯理论的OOP为基的?/p>
今天q本书终于寄CQ但是一M下,大失所望。不知道作者对JavaScript语言的理解能力不够,q是他对OOP的理解不够。《JavaScript权威指南》这本书寚w向对象的叙述不但不专业,而且q错误百出。实在不g看?/p>
试D几例Q?/p>
× JavaScript没有正式的类的概念,……,?strong>用构造函数和原型对象模拟了类
事实上,JavaScript的确没有正式的类的概念,但模拟类的只是构造函数而不是类。因为类是“声明”,对象是实体。用“实体”去模拟“声明”原本就说不通。在JScript中,cȝ是通过Ҏ造函数来q行的,而不是一U基于原型的?/p>
× JavaScript中的实例属性是那些在对象中用构造函数创建的或初始化的属?/strong> ×cd?/strong>?strong>cL?/strong> cMq样的问题非怹多,昑־作者的逻辑很乱。作者甚x有办法ؓ读者理清脚本环境与DOM环境的异同,q在W四章关于局部变量、执行环境和作用域等问题的讨Z(4.6~4.7?其H出?/p>
因此Q我怿没有多少L白这本书有关JavaScript中对象系l的描述。此外,q本书将JavaScript、DOM和CSSq几U不同层ơ的体系揉到一h讲述Q尽ɘq本书内Ҏ得更Z富而且刺激了购乎ͼ然而也使读者不得不在几个不同的泥坑中蟩来蟩去,最l无所适从?/p>
因此作ؓQ最好是把这本书当成一本手册来查阅Q而不是当作理Z的经典。随便说一点,q不是翻译的q错Q而真的是作者的问题?/p>
同一家出版社的《Delphi技术手册》的译被一些h骂得很惨Q但事实上是M懂书的h在胡a。——那本书的翻译得是非常精道的Q一些看似拗口的译文其实很精准,多读两遍懂了。与此相较,q本《JavaScript权威指南》的作者,看v来对“JavaScript的对象系l”就未必深彻C解和思考过了?/p>
q个问题出现在所谓的“实例属性”还有一U与构造函数无关的情况Q也是直接对原型属性声明。例如“MyObject.prototype.prop_1 = 'abcd'”,因此上面q种定义是不完整的?/p>
JavaScript中没有“类”,因此也没有类属性与cL法。只不过构造器(函数)也被对象pȝ理解为“对象”,因此构造器也可以创建新的属性和Ҏ。——这只是它作Z个“单独的对象实例”的Ҏ而已Q把q个作ؓcd性和cL法,很不合逻辑?/p>
JavaScript 需要框架吗Q是不是把简单的事情复杂化了? 短小_ֹ才是脚本之道?
非要借鉴 JAVA 的架构吗Q是否有更好的解x案?
对于W一U意见,我认为某U条件下q是有道理的。例如:我仅仅是xC?Hello, world! 直接 alert()可以了Q何必要弄一?Framework 出来Q岂非劳民伤财,题大做?实Q对于一些简单的web应用Qjs 在整个体pM充当的角色很,我觉得是可以不用框架的。但对于一个RIA模式的Web应用Q尤其是企业U的应用Q系l复杂程度和JS代码规模相当庞大的情况下Q没有框架带来的后果是可以预见的。对于第二种观点Q赞成框架的必要性,但对jsvm一些“模从쀝java的做法抱有怀疑态度。我不能说这U看法不对,也许实有更好API架构。但是,本h认ؓq个不是关键所在,jsvm提供了对多种语法解析器的支持Q有兴趣的h完全可以Ҏ自己喜好在jsvm下开发出另外一套API。类C#,cVB的语法都可以实现?
单的_JSVM Ҏ目的是ؓ了规范浏览器端JavaScript脚本开发,更好的实C码复用。传l面向过E型的JavaScript开发方式已l明显不能满_规模软g开发的需要。大部分q象表明? 随着 RIA 的发展,客户端都承担更多的逻辑处理工作Q企业应用的代码规模和复杂度都是相当大的。有效的代码l织l构Q合理的模块_度Q低耦合高内聚的设计原则{等如何引入到JavaScript的开发上来?怿当你了解 JSVM2 之后Q会有一些答案?
作ؓ一个框ӞJSVM要解决的问题不是提供某一U应用的解决ҎQ而是针对各种场景提供q泛的支持。另外一个需要说明的是:jsvm2q不是jsvm1的一个升U版Q几乎是在jsvm1上完全重构。且不提供对原jsvm1.x中的cȝ支持。(当然Q原jsvm1.x下的c需要经q做一些小改动卌在jsvm2下正常工作)较jsvm1.xQjsvm2 有了几处明显的变化:
性能上有了明昄提升?
每个cL件拥有独立的语法域?
几种常见的webq行模式在Framework中将直接被支持?
~译引擎支持多语法解析器Qƈ~省提供了一个名?jsvm2"的语法解析器。从语法层面提供了一些OO关键字的支持Qjsvm下的面向对象的javascript开发更为直观和方便?
h更灵zȝ扩展性。二ơ开发者可以很方便的扩展其功能?
//不对Netscape4.0老版本提供完整支持?br />var NavName = (document.all)? "IE":"Gecko";
var isFirstTime = true;
var RightSuspent = (screen.width>800)?1004:770;
function WriteObj(Name,InitBigWinSrc,InitBigWinWidth,InitBigWinHeight){
var BigWinHtml = "";
if (NavName == "IE"){
BigWinHtml= "<DIV id=\\"" + Name + "Div\\" style=\\"LEFT:" + (RightSuspent - parseInt(InitBigWinWidth)) + "px; POSITION: absolute;";
if (typeof(InitScrollIs) == "undefined"){
BigWinHtml += "top:0px;";
}
else if ((typeof(InitScrollIs) == "boolean"&&InitScrollIs == false)||(InitScrollIs == "false")){
BigWinHtml += "top:0px;";
}
else{
BigWinHtml += "top:expression(document.body.scrollTop+this.style.pixelHeight);";
}
if (Name == "LittleWin") BigWinHtml += ";display:none;z-index:100;";
else BigWinHtml += ";z-index:120;";
BigWinHtml += "\\">";
BigWinHtml += "<OBJECT classid=\\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\\" ";
BigWinHtml += "codebase=\\"http://download.macromedia.com/pub/shockwave/cabs/flashlash.cab#version=6,0,0,0\\" ";
BigWinHtml += "WIDTH=\\"" + InitBigWinWidth + "\\" HEIGHT=\\"" + InitBigWinHeight + "\\" id=\\"" + Name + NavName + "\\" ALIGN=\\"\\">";
BigWinHtml += "<PARAM NAME=movie VALUE=\\"" + InitBigWinSrc + "\\"> <PARAM NAME=quality VALUE=high>";
//BigWinHtml += "<param name=wmode value=transparent>";
BigWinHtml += "</OBJECT>";
BigWinHtml += "</Div>";
}
else if (NavName == "Gecko"){
BigWinHtml= "<DIV id=\\"" + Name + "Div\\" style=\\"LEFT:" + (RightSuspent - parseInt(InitBigWinWidth)) + "px; POSITION: absolute; TOP: 100px";
if (Name == "LittleWin") BigWinHtml += ";display:none;z-index:100;";
else BigWinHtml += ";z-index:120;";
BigWinHtml += "\\">";
BigWinHtml += "<EMBED src=\\"" + InitBigWinSrc + "\\" quality=high bgcolor=#FFFFFF WIDTH=\\"" + InitBigWinWidth + "\\" HEIGHT=\\"" + InitBigWinHeight + "\\" name=\\"" + Name + NavName + "\\" ALIGN=\\"\\"";
BigWinHtml += "id=\\"" + Name + NavName + "\\" TYPE=\\"application/x-shockwave-flash\\" loop=\\"false\\" PLUGINSPAGE=\\"http://www.macromedia.com/go/getflashplayer\\">";
BigWinHtml += "</EMBED>";
BigWinHtml += "</Div>";
}
document.write(BigWinHtml);
}
function _CheckCookie(E){
var Now = new Date();
var s = String(Now.getYear())+String(Now.getMonth()+1)+String(Now.getDate());
if (_GetFullScreenCookie(E)==s){
return true;
}
else {
Now.setTime(Now.getTime() + (parseInt(typeof(InitUseCookieHours)=="undefined" ? 24:parseInt(InitUseCookieHours))*60*60*1000));
_SetFullScreenCookie(E,s,Now);
return false;
}
}
function _GetFullScreenCookie (name) {
var args = name + "=";
var aLength = args.length;
var cLength = documents.cookie.length;
var i = 0;
while (i < cLength) {
var j = i + aLength;
if (documents.cookie.substring(i, j) == args)
return _GetFullScreenCookieVal(j);
i = documents.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
function _GetFullScreenCookieVal(offset) {
var endstr = documents.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = documents.cookie.length;
return unescape(documents.cookie.substring(offset, endstr));
}
function _SetFullScreenCookie (name, value) {
var argv = _SetFullScreenCookie.arguments;
var argc = _SetFullScreenCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
documents.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
function BigWinGecko_DoFSCommand(command,args){
var BigWinOBJ = document.getElementById("BigWinDiv");
var LittleWinOBJ = document.getElementById("LittleWinDiv");
BigWinOBJ.style.visibility = "hidden";
if (isFirstTime){
LittleWinOBJ.style.display = "block";
isFirstTime = false;
return;
}
LittleWinOBJ.style.visibility = "visible";
}
function LittleWinGecko_DoFSCommand(command,args){
var BigWinOBJ = document.getElementById("BigWinDiv");
var LittleWinOBJ = document.getElementById("LittleWinDiv");
var PlayWinOBJ = document.getElementById("BigWin"+NavName);
LittleWinOBJ.style.visibility = "hidden";
BigWinOBJ.style.visibility = "visible";
PlayWinOBJ.Play();
}
if (NavName == "IE"){
document.write("<Scr"+"ipt language=\\"javascript\\" For=\\"BigWinIE\\" Event=\\"FSCommand(command,args)\\">\\n");
document.write(" BigWinGecko_DoFSCommand(command,args);\\n");
document.write("</Scr"+"ipt>");
document.write("<Scr"+"ipt language=\\"javascript\\" For=\\"LittleWinIE\\" Event=\\"FSCommand(command,args)\\">\\n");
document.write(" LittleWinGecko_DoFSCommand(command,args);\\n");
document.write("</Scr"+"ipt>");
}
if (InitBigWinSrc&&InitBigWinWidth&&InitBigWinHeight&&InitLittleWinSrc&&InitLittleWinWidth&&InitLittleWinHeight){
WriteObj("BigWin",InitBigWinSrc,InitBigWinWidth,InitBigWinHeight);
WriteObj("LittleWin",InitLittleWinSrc,InitLittleWinWidth,InitLittleWinHeight);
if (_CheckCookie("TurnBook")){
BigWinGecko_DoFSCommand("turnbook","big");
}
}
LittleWinGecko_DoFSCommand("FSCommand","www");
setTimeout("BigWinGecko_DoFSCommand()",30000);
//-->
</script>
<!--撕页l束-->
1Q配|文Ӟsetting.js
2Q显C文Ӟprint.js
setting.js 如下Q?/p>
document.write("<object id=\"factory\" style=\"display:none\" viewastext classid=\"clsid:1663ed61-23eb-11d2-b92f-008048fdd814\" codebase=\"images/events/ScriptX.cab#Version=5,60,0,360\"></object>");
function Printers() {
agree = confirm('定打印?');
if (agree) {
if (agree)
{
NoPrinter.style.visibility='hidden';
factory.printing.Print();}
else NoPrinter.style.visibility='visible';
}
}
factory.printing.header = ""
factory.printing.footer = ""
factory.printing.leftMargin = 0.75
factory.printing.topMargin = 0.75
factory.printing.rightMargin = 0.75
factory.printing.bottomMargin = 0.75
昄文gprint.js 如下Q?/p>
document.write('<style media="print">@media print { .noprint{display:none} } </style>');
/////////////////////////////////~~控制打印时不昄按钮的样式,在页面不需要打印的地方只需要引用该样式卛_
document.write('<div id=NoPrinter name=NoPrinter align=right style="visibility:visible" class="noprint"><br> ');
document.write('<input type=button class=button value=关闭 name="bFQ" id="bFQ" onclick=\"javascript\:window.close()\">');
document.write('<input type="button" value="打印讄" onclick=\"factory.printing.PageSetup()\">');
document.write('<input type="button" value="打印预览" onclick=\"factory.printing.Preview()\">');
document.write('<input type=button name=button3 value="打印" onclick="Printers()"> </div>');
在用打印功能时Q只要把文g2个文件包含在面中放|打印按钮的地方卛_Q代码如下:
<script src="../inc/print/Printer.js"></script>
<script src="../inc/print/Printers.js"></script>
document.write("<script>alert(t);</scr"+"ipt>");
注意Q?lt;/script>不能写作</script>Q要用字W串q接的Ş式来表述Q否则会有语法错误,估计是因为JavaScript遇到</script>׃本结束了?/p>
在这U情况下Q正常的脚本和嵌入的脚本的执行顺序就需要研I一下了?/p>
b.jsQ[下蝲]
alert("5");
a.jsQ[下蝲]
alert("4");
document.write("<script src=b.js></scr"+"ipt>");
alert("6");
test.htmlQ[下蝲]
<script src=a.js></script>
<script>
alert("1");
document.write("<script src=b.js></scr"+"ipt>");
document.write("<script>alert("3")</scr"+"ipt>");
alert("2");
</script>
执行test.htmlQ可以看到打印的序是:4,6,5,1,3,2,5
q可以做一些相x试,得出的结论是Q?br />1.同的不同的代码块,代码块间的执行顺序ؓ从上CQ?br />2.在代码中嵌入代码的情况下Q先执行上层代码块,再执行子代码块;代码中嵌入代码是指一个文件引入另一个文Ӟ而不是指所有的通过document.write形式打出的代码?/p>
可以使用 new q算W结合像 Object()、Date() ?Function() q样的预定义的构造函数来创徏对象q对其初始化。面向对象的~程其强有力的特征是定义自定义构造函C创徏脚本中用的自定义对象的能力。创Z自定义的构造函敎ͼq样可以创建具有已定义属性的对象。下面是自定义函数的CZQ注?this 关键字的使用Q?/p>
function Circle (xPoint, yPoint, radius) {
this.x = xPoint; // 圆心?x 坐标
this.y = yPoint; // 圆心?y 坐标
this.r = radius; // 圆的半径
}
调用 Circle 构造函数时Q给出圆心点的值和圆的半径Q所有这些元素是完全定义一个独特的圆对象所必需的)。结束时 Circle 对象包含三个属性。下面是如何例示 Circle 对象?/p>
var aCircle = new Circle(5, 11, 99);
二,使用原型来创建对?/strong>
在编写构造函数时Q可以用原型对象(它本w是所有构造函数的一个属性)的属性来创徏l承属性和׃nҎ。原型属性和Ҏ按引用复制l类中的每个对象Q因此它们都h相同的倹{可以在一个对象中更改原型属性的|新的值将覆盖默认|但仅在该实例中有效。属于这个类的其他对象不受此更改的媄响。下面给Z使用自定义构造函数的CZQCircleQ注?this 关键字的使用Q?/p>
Circle.prototype.pi = Math.PI;
function ACirclesArea () {
return this.pi * this.r * this.r; // 计算圆面U?br />}
Circle.prototype.area = ACirclesArea; // 计算圆面U的函数现在?Circle Prototype 对象的一个方?br />var a = ACircle.area(); // 此ؓ如何?Circle 对象上调用面U函?/p>
使用q个原则Q可以给预定义的构造函敎ͼ都具有原型对象)定义附加属性。例如,如果惌能够删除字符串的前后I格Q与 VBScript ?Trim 函数cMQ,可以给 String 原型对象创徏自己的方法?/p>
// 增加一个名?trim 的函C?br />// String 构造函数的原型对象的一个方法?br />String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, ""); // 用正则表辑ּ前后空?br />}
var s = " leading and trailing spaces "; // 有空格的字符?br />window.alert(s + " (" + s.length + ")");
s = s.trim(); // 删除前后I格
window.alert(s + " (" + s.length + ")");
三,特别对象、属性和Ҏ
Error 对象Q保存有关错误的信息?/p>
var newErrorObj = new Error()
var newErrorObj = new Error(
number
)
var newErrorObj = new Error(
number,
description
)
Error 对象的构造函数语法有以下部分Q?
参数Q-number。与错误相联的数字倹{如果省略则为零?br /> Qdescription。描q错误的短字W串。如果省略则为空字符丌Ӏ?/p>
说明Q每当生运行时错误Q就产生 Error 对象的一个实例以描述错误。该实例有两个固有属性保存错误的描述Qdescription 属性)和错误号Qnumber 属性)?/p>
错误h 32 位的倹{高 16 位字是设备代码,而低字是实际的错误代码?/p>
Error 对象也可以用如上所C的语法昑ּ创徏Q或?throw 语句抛掉。在两种情况下,都可以添加选择的Q何属性,以拓?Error 对象的能力?/p>
典型圎ͼ?try...catch 语句中创建的局部变量引用隐式创建的 Error 对象。因此,可以按选择的Q何方法用错误号和描q?/p>
下面的例子演CZ隐式创徏 Error 对象的用:
try {
x = y; // 产生错误?br />} catch(e) { // 创徏局部变?e?br /> response.write(e) // 打印 "[object Error]".
response.write(e.number & 0xFFFF) // 打印 5009?br /> response.write(e.description) // 打印 "'y' is undefined".
}
Function 对象Q创建新的函数?/p>
语法 1
function functionName([argname1 [, ...[, argnameN]]]) {
//body
}
语法 2
functionName = new Function( [argname1, [... argnameN,]] body );
参数Q-functionName。必选项。最新创建函数的名称
Qargname1...argnameN。可选项。函数接收的参数列表?br /> Qbody。可选项。包含调用该函数时被执行?JScript 代码块的字符丌Ӏ?/p>
说明Q函?JScript 中的基本数据cd。语?1 创徏在必要时?JScript 转换?Function 对象的函数倹{JScript 在调用函数时用语法 2 创徏的函数{换ؓ Fnction 对象?/p>
语法 1 ?JScript 中创建函数的基本Ҏ。语?2 是用于显式创建函数对象的另一Ҏ?
例如Q要创徏传递给它的两个参数相加的函敎ͼ可以用两U方法中的Q一U完成:
例子 1
function add(x, y) {
return(x + y); // 执行加法q返回结果?br />}
例子 2
var add = new Function("x", "y", "return(x+y)");
在两U情况下Q都可以用如下代码行调用该函敎ͼ
add(2, 3);
注意 在调用函数时Q请保包含了括号和必需的参数。调用函数时不用括号Dq回函数的文本而不是函数执行的l果?/p>
Object 对象Q提供所?JScript 对象通用的功能?/p>
obj = new Object([value])
参数Q-obj。必选项。要赋gؓ Object 对象的变量名?br /> Qvalue。可选项。Q意一U?JScript 基本数据cd。(Number、Boolean、或 String。)如果 value Z个对象,q回不作改动的该对象。如?value ?null、undefinedQ或者没有给出,则生没有内容的对象?/p>
说明QObject 对象被包含在所有其?JScript 对象中;在所有其它对象中它的Ҏ和属性都是可用的。在用户定义的对象中可以重定义这些方法,q在适当的时候通过 JScript 调用。toString Ҏ是经常被重定义的 Object Ҏ的例子?/p>
arguments 属性:为当前执行的 function 对象q回一个arguments 对象?/p>
function.arguments
function 参数是当前执行函数的名称Q可以省略?
说明Q通过 arguments 属性,函数可以处理可变数量的参数?arguments 对象?length 属性包含了传递给函数的参数的数目。对于arguments 对象所包含的单个参敎ͼ其访问方法与数组中所包含的参数的讉KҎ相同?/p>
CZQ下面的例子说明?arguments 属性的用法Q?/p>
function ArgTest() {
var i, s, numargs = arguments.length;
s = numargs;
if (numargs < 2)
s += " argument was passed to ArgTest. It was ";
else
s += " arguments were passed to ArgTest. They were " ;
for (i = 0; i < numargs; i++) {
s += arguments[i] + " ";
}
return(s);
}
callee 属性:q回正被执行?Function 对象Q也是所指定?Function 对象的正文?/p>
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名U?
说明Qcallee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用?/p>
callee 属性的初始值就是正被执行的 Function 对象。这允许匿名的递归函数?/p>
CZQ?/p>
function factorial(n) {
if (n <= 0)
return 1;
else
return n * arguments.callee(n - 1)
}
print(factorial(3));
要求Q版?.5或以上?/p>
caller 属性:q回一个对函数的引用,该函数调用了当前函数?/p>
functionName.caller
functionName 对象是所执行函数的名U?/p>
说明Q对于函数来_caller 属性只有在函数执行时才有定义?如果函数是由 JScript E序的顶层调用的Q那?caller 包含的就?null ?/p>
如果在字W串上下文中使用 caller 属性,那么l果?functionName.toString 一P也就是说Q显C的是函数的反编译文本?/p>
下面的例子说明了 caller 属性的用法Q?/p>
function CallLevel() {
if (CallLevel.caller == null)
return("CallLevel was called from the top level.");
else
return("CallLevel was called by another function.");
}
constructor 属性:表示创徏对象的函数?
object.constructor
必需?object是对象或函数的名U?
说明Qconstructor 属性是所有具?prototype 的对象的成员。它们包括除 Global ?Math 对象以外的所?JScript 固有对象。constructor 属性保存了Ҏ造特定对象实例的函数的引用?
例如Q?
x = new String("Hi");
if (x.constructor == String) // q行处理Q条件ؓ真)?br />?
function MyFunc {
// 函数体?br />}
y = new MyFunc;
if (y.constructor == MyFunc) // q行处理Q条件ؓ真)?/p>
description 属性:q回或设|与特定错误相联pȝ描述字符丌Ӏ?/p>
object.description [= stringExpression]
description 属性的语法l成部分如下Q?/p>
参数Q-object。必选项。Error 对象的Q意实例?br /> QstringExpression。可选项。包含错误描q的字符串表辑ּ?/p>
说明Qdescription 属性包含与特定错误相联pȝ错误信息字符丌Ӏ用包含在q个中的|来警告用户发生了一个不能或不想处理的错误?/p>
prototype 属性:q回对象cd原型的引用?/p>
objectName.prototype
objectName 参数是对象的名称?
说明Q用 prototype 属性提供对象的cȝ一l基本功能?对象的新实例“扎쀝赋予该对象原型的操作?
例如Q要?Array 对象dq回数组中最大元素值的Ҏ?要完成这一点,声明该函敎ͼ它加入 Array.prototypeQ?q用它?
function array_max( ) {
var i, max = this[0];
for (i = 1; i < this.length; i++) {
if (max < this[i])
max = this[i];
}
return max;
}
Array.prototype.max = array_max;
var x = new Array(1, 2, 3, 4, 5, 6);
var y = x.max( );
该代码执行后Qy 保存数组 x 中的最大|或说 6?/p>
所?JScript 固有对象都有只读?prototype 属性。可以象该例中那样ؓ原型d功能Q但该对象不能被赋予不同的原型。然而,用户定义的对象可以被赋给新的原型?/p>
apply ҎQ应用某一对象的一个方法,用另一个对象替换当前对象?/p>
apply([thisObj[,argArray]])
参数Q-thisObj。可选项。将被用作当前对象的对象?br /> QargArray。可选项。将被传递给该函数的参数数组?/p>
说明Q如?argArray 不是一个有效的数组或者不?arguments 对象Q那么将D一?TypeError?/p>
如果没有提供 argArray ?thisObj M一个参敎ͼ那么 Global 对象被用作 thisObjQ?q且无法被传递Q何参数?/p>
要求Q版?.5或以上?/p>
call ҎQ调用一个对象的一个方法,以另一个对象替换当前对象?/p>
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数Q-thisObj。可选项。将被用作当前对象的对象?br /> Qarg1, arg2, , argN。可选项。将被传递方法参数序列?/p>
说明Qcall Ҏ可以用来代替另一个对象调用一个方法。call Ҏ可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象?/p>
如果没有提供 thisObj 参数Q那?Global 对象被用?thisObj?/p>
要求Q版?.5或以上?/p>
concat Ҏ (Array)Q返回一个新数组Q这个新数组是由两个或更多数l组合而成的?/p>
array1.concat([item1[, item2[, . . . [, itemN]]]])
参数Q-array1。必选项。其他所有数l要q行q接?Array 对象?
Qitem1,. . ., itemN。可选项。要q接?array1 末尾的其他项目?/p>
说明Qconcat Ҏq回一?Array 对象Q其中包含了 array1 和提供的L其他目的连接?/p>
要加的项目(item1 ?itemNQ会按照从左到右的顺序添加到数组。如果某一ؓ数组Q那么添加其内容?array1 的末。如果该目不是数组Q就其作ؓ单个的数l元素添加到数组的末?/p>
以下Z源数l复制元素到l果数组Q?
对于从正被连接到新数l的数组中复制的对象参数Q复制后仍然指向相同的对象。不论新数组和源数组中哪一个有改变Q都引起另一个的改变?
对于q接到新数组的数值或字符Ԍ只复制其倹{一个数l中值有改变q不影响另一个数l中的倹{?
CZQ下面这个例子说明了使用数组?concat Ҏ的用?
function ConcatArrayDemo() {
var a, b, c, d;
a = new Array(1,2,3);
b = "JScript";
c = new Array(42, "VBScript);
d = a.concat(b, c); // q回数组 [1, 2, 3, "JScript", 42, "VBScript"]
return(d);
}
escape ҎQ对 String 对象~码以便它们能在所有计机上可诅R?/p>
escape(charString)
必选项 charstring 参数是要~码的Q?String 对象或文字?
说明Qescape Ҏq回一个包含了 charstring 内容的字W串| Unicode 格式Q。所有空根{标炏V重音符号以及其他非 ASCII 字符都用 %xx ~码代替Q其?xx {于表示该字W的十六q制数。例如,I格q回的是 "%20" ?/p>
字符值大?255 的以 %uxxxx 格式存储?
注意Qescape Ҏ不能够用来对l一资源标示?(URI) q行~码。对其编码应使用 encodeURI 和encodeURIComponent Ҏ?/p>
unescape ҎQ解码用 escape Ҏq行了编码的 String 对象?/p>
unescape(charstring)
必选项 charstring 参数是要解码?String 对象?
说明Qunescape Ҏq回一个包?charstring 内容的字W串倹{所有以 %xx 十六q制形式~码的字W都?ASCII 字符集中{h的字W代ѝ?
?%uxxxx 格式QUnicode 字符Q编码的字符用十六进制编?xxxx ?Unicode 字符代替?
注意Qunescape Ҏ不能用于解码l一资源标识?(URI)。解该码可?decodeURI ?decodeURIComponent Ҏ?/p>
eval ҎQ检?JScript 代码q执行?/p>
eval(codeString)
必选项 codestring 参数是包含有?JScript 代码的字W串倹{这个字W串由 JScript 分析器进行分析和执行?/p>
说明Qeval 函数允许 JScript 源代码的动态执行。例?下面的代码创Z一个包?Date 对象的新变量 mydate Q?/p>
eval("var mydate = new Date();");
传递给 eval Ҏ的代码执行时的上下文和调?eval Ҏ的一?
encodeURI ҎQ将文本字符串编码ؓ一个有效的l一资源标识W?(URI)?/p>
encodeURI(URIString)
必选的 URIString 参数代表一个已~码?URI?/p>
说明QencodeURI Ҏq回一个编码的 URI。如果您编码结果传递给 decodeURIQ那么将q回初始的字W串。encodeURI Ҏ不会对下列字W进行编码:":"?/"?;" ?"?"。请使用 encodeURIComponent Ҏ对这些字W进行编码?/p>
要求Q版?.5或以上?/p>
decodeURI ҎQ返回一个已~码的统一资源标识W?(URI) 的非~码形式?/p>
decodeURI(URIstring)
必要?URIstring 参数代表一个已~码 URI 的倹{?/p>
说明Q?decodeURI Ҏ代替已经q时?unescape Ҏ?/p>
decodeURI Ҏq回一个字W串倹{?/p>
如果 URIString 无效Q那么将产生一?URIError?/p>
要求Q版?.5或以上?/p>
encodeURIComponent ҎQ将文本字符串编码ؓ一个统一资源标识W?(URI) 的一个有效组件?/p>
encodeURIComponent(encodedURIString)
必选的 encodedURIString 参数代表一个已~码?URI lg?/p>
说明QencodeURIComponent Ҏq回一个已~码?URI。如果您编码结果传递给 decodeURIComponentQ那么将q回初始的字W串。因?encodeURIComponent ҎҎ有的字符~码Q请注意Q如果该字符串代表一个\径,例如 /folder1/folder2/default.htmlQ其中的斜杠也将被编码。这样一来,当该~码l果被作求发送到 web 服务器时是无效的。如果字W串中包含不止一?URI lgQ请使用 encodeURI Ҏq行~码?/p>
要求Q版?.5或以上?/p>
decodeURIComponent ҎQ返回统一资源标识W?(URI) 的一个已~码lg的非~码形式?/p>
decodeURIComponent(encodedURIString)
必选的 encodedURIString 参数代表一个已~码?URI lg?/p>
说明QURIComponent 是一个完整的 URI 的一部分?
如果 encodedURIString 无效Q将产生一?URIError?/p>
要求Q版?.5或以上?/p>
for...in 语句Q对应于一个对象的每个Q或一个数l的每个元素Q执行一个或多个语句?/p>
for (variable in [object | array])
statements
参数Q-variable。必选项。一个变量,它可以是 object 的Q一属性或 array 的Q一元素?
Qobject, array。可选项。要在其上遍历的对象或数l?br /> Qstatement。可选项。相对于 object 的每个属性或 array 的每个元素,都要被执行的一个或多个语句。可以是复合语句?/p>
说明Q在循环的每ơP代前Qvariable 被赋?object 的下一个属性或 array 的下一个元素。然后可以在循环内的M语句中用它Q就好像正在使用 object 的该属性或 array 的该元素一栗?/p>
当在一个对象上q代Ӟ没有办法军_或控制把对象的成员赋l?variable 的次序。在数组内将按元素的ơ序执行q代Q也是Q????.....
CZQ下面示例说明了 for ... in 语句的用法,它把一个对象用作一个联合数l:
function ForInDemo() {
var a, key, s = ""; // 创徏某些变量
a = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"} // 初始化对?br /> for (key in a) { // q代属?br /> s += a[key] + "
";
}
return(s);
}
join ҎQ返回字W串|其中包含了连接到一L数组的所有元素,元素由指定的分隔W分隔开来?/p>
arrayObj.join(separator)
参数Q-arrayObj。必选项。Array 对象?br /> Qseparator。必选项。是一?String 对象Q作为最l的 String 对象中对数组元素之间的分隔符。如果省略了q个参数Q那么数l元素之间就用一个逗号来分隔?/p>
说明Q如果数l中有元素没有定义或者ؓ nullQ将其作为空字符串处理?/p>
CZQ下面这个例子说明了 join Ҏ的用法?
function JoinDemo() {
var a, b;
a = new Array(0,1,2,3,4);
b = a.join("-");
return(b);
}
pop ҎQ移除数l中的最后一个元素ƈq回该元素?/p>
arrayObj.pop( )
必选的 arrayObj 引用是一?Array 对象?/p>
说明Q如果该数组为空Q那么将q回 undefined?/p>
要求Q版?.5或以上?/p>
push ҎQ将新元素添加到一个数l中Qƈq回数组的新长度倹{?/p>
arrayObj.push([item1 [item2 [. . . [itemN ]]]])
参数Q-arrayObj。必选项。一?Array 对象?br /> Qitem, item2,. . . itemN。可选项。该 Array 的新元素?/p>
说明Qpush Ҏ以新元素出现的序dq些元素。如果参C一为数l,那么该数l将作ؓ单个元素d到数l中。如果要合ƈ两个或多个数l中的元素,请?concat Ҏ?/p>
要求Q版?.5或以上?/p>
reverse ҎQ返回一个元素顺序被反{?Array 对象?
arrayObj.reverse( )
必选项 arrayObj 参数?Array 对象?/p>
说明Qreverse Ҏ一?Array 对象中的元素位置q行反{。在执行q程中,q个Ҏq不会创Z个新?Array 对象?
如果数组是不q箋的,reverse Ҏ在数组中创建元素以便填充数l中的间隔。这h创徏的全部元素的值都?undefined?/p>
CZQ下面这个例子说明了 reverse Ҏ的用法:
function ReverseDemo() {
var a, l; // 声明变量?br /> a = new Array(0,1,2,3,4); // 创徏数组q赋倹{?br /> l = a.reverse(); // 反{数组的内宏V?br /> return(l); // q回l果数组?br />}
slice Ҏ (Array)Q返回一个数l的一Dc?/p>
arrayObj.slice(start, [end])
参数Q-arrayObj。必选项。一?Array 对象?
Qstart。必选项。arrayObj 中所指定的部分的开始元素是从零开始计的下标?
Qend。可选项。arrayObj 中所指定的部分的l束元素是从零开始计的下标?/p>
说明Qslice Ҏq回一?Array 对象Q其中包含了 arrayObj 的指定部分?
slice Ҏ一直复制到 end 所指定的元素,但是不包括该元素。如?start Q将它作?length + start处理Q此?length 为数l的长度。如?end Q就它作ؓ length + end 处理Q此?length 为数l的长度。如果省?end Q那?slice Ҏ一直复制到 arrayObj 的结。如?end 出现?start 之前Q不复制M元素到新数组中?/p>
CZQ在下面q个例子中,除了最后一个元素之外,myArray 中所有的元素都被复制?newArray 中:
newArray = myArray.slice(0, -1)
shift ҎQ移除数l中的第一个元素ƈq回该元素?/p>
arrayObj.shift( )
必选的 arrayObj 引用是一?Array 对象?/p>
说明Qshift Ҏ可移除数l中的第一个元素ƈq回该元素?/p>
要求Q版?.5或以上?/p>
unshift ҎQ将指定的元素插入数l开始位|ƈq回该数l?/p>
arrayObj.unshift([item1[, item2 [, . . . [, itemN]]]])
参数Q-arrayObj。必选项。一?Array 对象?br /> Qitem1, item2,. . .,itemN。可选项。将插入到该 Array 开始部分的元素?/p>
说明Qunshift Ҏ这些元素插入到一个数l的开始部分,所以这些元素将以参数序列中的次序出现在数组中?/p>
要求Q版?.5或以上?/p>
splice ҎQ从一个数l中U除一个或多个元素Q如果必要,在所U除元素的位|上插入新元素,q回所U除的元素?/p>
arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]])
参数Q-arrayObj。必选项。一?Array 对象?br /> Qstart。必选项。指定从数组中移除元素的开始位|,q个位置是从 0 开始计的?br /> QdeleteCount。必选项。要U除的元素的个数?br /> Qitem1, item2,. . .,itemN。必选项。要在所U除元素的位|上插入的新元素?/p>
说明Qsplice Ҏ可以U除?start 位置开始的指定个数的元素ƈ插入新元素,从而修?arrayObj。返回值是一个由所U除的元素组成的?Array 对象?/p>
要求Q版?.5或以上?/p>
1、可自定样式SetStyle()
2、带有onSroll功能
3、有setSldPointQ设|位|?接口
4、有getSldPoint(取得位置Q接?
5、可自己讄sliderBar的最大|不是sliderbar的长度,而是|
6、自定义微调功能QsetIncrement(10))Q默认ؓ5Q?
代码有点乱,接口不能清晰的看出来Q不好意思了Q先用着?br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> never Slider Bar </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="never-online, blueDestiny">
<META NAME="Keywords" CONTENT="javascript Slider Bar">
<META NAME="Description" CONTENT="javascript Slider Bar">
<style>
body { background-color:#fff; text-align:center; font-family:verdana; font-size:9pt; }
.sliderObj { width:350px; height:25px; background-color:#fff; border:1px solid #666666; }
.sliderBar { width:20px; background-color:#666666; border:1px solid #333; }
.sliderBtn { width:30px; background-color:#666666; color:#fff; border:1px solid #000000; }
.r-sliderObj { width:300px; height:25px; background-color:#fff; border:1px solid #CC0000; }
.r-sliderBar { width:20px; background-color:#CC0000; border:1px solid #333; }
.r-sliderBtn { width:20px; background-color:#CC0000; color:#fff; border:1px solid #000000; }
.g-sliderObj { width:300px; height:25px; background-color:#fff; border:1px solid #006600; }
.g-sliderBar { width:20px; background-color:#006600; border:1px solid #333; }
.g-sliderBtn { width:20px; background-color:#006600; color:#fff; border:1px solid #000000; }
.b-sliderObj { width:300px; height:25px; background-color:#fff; border:1px solid #003399; }
.b-sliderBar { width:20px; background-color:#003399; border:1px solid #333; }
.b-sliderBtn { width:20px; background-color:#003399; color:#fff; border:1px solid #000000; }
</style>
</HEAD>
<BODY>
<p>
<div id="s1"></div>
<p>
<div id="d1">r</div>
<p>
<div id="s2"></div>
<p>
<div id="d2">g</div>
<p>
<div id="s3"></div>
<p>
<div id="d3">b</div>
<p>
<div id="color" class="sliderObj"></div>
<SCRIPT LANGUAGE="JavaScript">
<!--
/*===============================================================
//
// Module : never SliderBar
// Script by : never-online, blueDestiny
// Updated : 2006-5-12
// Copyright : Miracle technology all reserved
// Website : http://www.never-online.net
// Email : blueDestiny@126.com
// Blog : http://blog.csdn.net/blueDestiny
// Comment : if you using never SliderBar please hold
// these copyrights.
//
// compatible : only for IE
// History : none
//
================================================================*/
function neverSliderBar(id,callback) { with(this) {
this.$ = document.getElementById || document.all;
this.sldID = id;
this.sldObj = null;
this.instance = this;
this.barStyle = "sliderBar";
this.objStyle = "sliderObj";
this.btnStyle = "sliderBtn";
this.sldBar = null;
this.sldBtnL = null;
this.sldBtnR = null;
this.sldPoint = null;
this.sldMoved = false;
this.sldClicked = false;
this.callback = callback;
this.sldObjOffset = null;
this.sldBarOffset = null;
this.callbackArg = Array.prototype.slice.call(arguments,2);
this.sldMax = 100;
this.sldIncrement = 5;
this.sldPoint = 0;
//instance.init.call(this,id);
}};
neverSliderBar.prototype.setObjStyle=function(classname) { with(this)
{
objStyle=classname;
}};
neverSliderBar.prototype.setMaxPoint=function(maxpoint) { with(this)
{
sldMax=maxpoint;
}};
neverSliderBar.prototype.setBtnStyle=function(classname) { with(this)
{
btnStyle=classname;
}};
neverSliderBar.prototype.setBarStyle=function(classname) { with(this)
{
barStyle=classname;
}};
neverSliderBar.prototype.setStyle=function() { with(this)
{
if (arguments[0]) barStyle=arguments[0];
if (arguments[1]) btnStyle=arguments[1];
if (arguments[2]) objStyle=arguments[2];
}};
neverSliderBar.prototype.setIncrement=function(increment) { with(this)
{
if (isNaN(parseInt(increment))) return;
sldIncrement = parseInt(increment);
}};
neverSliderBar.prototype.getSldPoint=function() { with(this)
{
sldBarOffset = Offset(sldBar);
sldObjOffset = Offset(sldObj);
var sldObjwidth = sldObjOffset.w-sldBarOffset.w;
var sldBarwidth = sldBarOffset.l-sldObjOffset.l;
var sldLocation = parseInt(sldBarwidth/sldObjwidth*sldMax);
return sldLocation;
}};
neverSliderBar.prototype.setSldPoint=function(point) { with(this)
{
if (isNaN(parseInt(point))) return;
if (point<0) point=0;
if (point>sldMax) point=sldMax;
var sldObjwidth = sldObjOffset.w-sldBarOffset.w;
var sldBarwidth = sldBarOffset.l-sldObjOffset.l;
sldPoint = parseInt(point);
var p = parseInt(sldPoint*sldObjwidth/sldMax)+sldObjOffset.l+1;
sldBar.style.left = p;
instance.getSldPoint();
}};
neverSliderBar.prototype.init=function() { with(this)
{
if ($(sldID + '__BtnL') && $(sldID + '__BtnR') && $(sldID + '__Bar')) {
sldBtnL = $(sldID + '__BtnL');
sldBar = $(sldID + '__Bar');
sldBtnR = $(sldID + '__BtnR');
}
else {
sldBtnL = document.createElement("BUTTON");
sldBtnL.id = sldID + '__BtnL';
sldBar = document.createElement("DIV");
sldBar.id = sldID + '__Bar';
sldBtnR = document.createElement("BUTTON");
sldBtnR.id = sldID + '__BtnR';
document.body.appendChild(sldBtnL);
document.body.appendChild(sldBar);
document.body.appendChild(sldBtnR);
}
//-------------------------------------------------------------------
sldObj = $(sldID);
sldObj.className = objStyle;
sldBarOffset = Offset(sldBar);
sldObjOffset = Offset(sldObj);
//-------------------------------------------------------------------
sldBtnL.value = "<<";
sldBtnL.className = btnStyle;
sldBtnL.style.position = "absolute";
//-------------------------------------------------------------------
sldBtnR.value = ">";
sldBtnR.className = btnStyle;
sldBtnR.style.position = "absolute";
//-------------------------------------------------------------------
sldBar.className = barStyle;
sldBar.style.position = "absolute";
sldBar.style.top = sldObjOffset.t;
sldBar.style.height = sldObjOffset.h;
sldBar.style.left = sldObjOffset.l;
instance.fixed();
//-------------------------------------------------------------------
sldObj.onmousedown = function() {instance.handleObjBefore()};
sldObj.onmouseup = function() {instance.handleObjAfter()};
//-------------------------------------------------------------------
sldBtnL.onmousedown = function() {instance.handleBtnClick('l')};
sldBtnR.onmousedown = function() {instance.handleBtnClick('r')};
sldBtnL.onfocus = function() {this.blur()};
sldBtnR.onfocus = function() {this.blur()};
//-------------------------------------------------------------------
sldBar.onmousedown = function() {instance.handleSldDragStart()};
sldBar.onmousemove = function() {instance.handleSldDrag()};
sldBar.onmouseup = function() {instance.handleSldDragEnd()};
}};
neverSliderBar.prototype.fixed=function() { with(this)
{
sldBarOffset = Offset(sldBar);
sldObjOffset = Offset(sldObj);
var sldBtnLOffset = Offset(sldBtnL);
sldBtnL.style.left = sldObjOffset.l-sldBtnLOffset.w;
sldBtnL.style.top = sldObjOffset.t;
sldBtnL.style.height = sldObjOffset.h;
//-------------------------------------------------------------------
sldBtnR.style.left = sldObjOffset.l+sldObjOffset.w;
sldBtnR.style.top = sldObjOffset.t;
sldBtnR.style.height = sldObjOffset.h;
//-------------------------------------------------------------------
sldBar.style.top = sldObjOffset.t;
sldBar.style.height = sldObjOffset.h;
//-------------------------------------------------------------------
var p = sldBarOffset.l;
if (p < sldObjOffset.l) sldBar.style.left=sldObjOffset.l;
var w = sldObjOffset.l+sldObjOffset.w-sldBarOffset.w;
if (p > w) sldBar.style.left = w;
window.setTimeout(function(){instance.fixed()},10)
}};
neverSliderBar.prototype.applyArg=function() { with(this)
{
if (typeof(callback)=='string') callback=eval(callback);
if (typeof(callback)=='function') {
var callbackArguments = [];
for(var i=0; i<callbackArg.length; i++)
callbackArguments[i] = callbackArg[i];
callbackArguments.push(instance.getSldPoint());
callback.apply(this,callbackArguments);
} else { return; }
}};
neverSliderBar.prototype.handleObjBefore=function() { with(this)
{
}};
neverSliderBar.prototype.handleObjAfter=function() { with(this)
{
}};
neverSliderBar.prototype.handleBtnClick=function(direction) { with(this)
{
direction = direction.toLowerCase();
sldPoint=instance.getSldPoint();
if(direction == 'l') {
instance.setSldPoint(this.sldPoint-sldIncrement);
}
else if (direction=='r') {
instance.setSldPoint(this.sldPoint+sldIncrement);
}
else {
return alert('not valid argument ' +direction);
}
instance.applyArg();
instance.getSldPoint();
}};
neverSliderBar.prototype.handleSldDragStart=function() { with(this)
{
sldBar.setCapture();
sldMoved = true;
sldBar.onlosecapture = function(){sldMoved=false;};
sldPoint = event.clientX-sldBarOffset.l;
}};
neverSliderBar.prototype.handleSldDrag=function() { with(this)
{
if(!sldMoved) return;
var p = event.clientX-sldPoint;
if (p <= sldObjOffset.l) {
sldBar.style.left = sldObjOffset.l;
}
else if (p >= (sldObjOffset.l+sldObjOffset.w-sldBarOffset.w)) {
sldBar.style.left = sldObjOffset.l+sldObjOffset.w-sldBarOffset.w;
}
else sldBar.style.left = p;
instance.applyArg();
instance.getSldPoint();
}};
neverSliderBar.prototype.handleSldDragEnd=function() { with(this)
{
sldBar.releaseCapture();
sldMoved=false;
}};
function Offset(e) {
var t = e.offsetTop;
var l = e.offsetLeft;
var w = e.offsetWidth;
var h = e.offsetHeight;
while(e=e.offsetParent) {
t+=e.offsetTop;
l+=e.offsetLeft;
}
return { t:t, l:l, w:w, h:h }
}
var r=new neverSliderBar("s1",callback,' <b>neverSliderBar</b> ');
r.sldMax=255;
r.setBtnStyle("r-sliderBtn");
r.setBarStyle("r-sliderBar");
r.setObjStyle("r-sliderObj");
r.init();
r.setSldPoint(100);
var g=new neverSliderBar("s2",callback,' <b>neverSliderBar</b> ');
g.sldMax=255;
g.setStyle("g-sliderBar","g-sliderBtn","g-sliderObj");
g.init();
g.setSldPoint(150);
var b=new neverSliderBar("s3",callback,' <b>neverSliderBar</b> ');
b.sldMax=255;
b.setBtnStyle("b-sliderBtn");
b.setBarStyle("b-sliderBar");
b.setObjStyle("b-sliderObj");
b.setIncrement(10);
b.init();
b.setSldPoint("200");
callback(' <b>neverSliderBar</b> ');
function callback(s) {
var $=document.getElementById;
var color_r=r.getSldPoint();
var color_g=g.getSldPoint();
var color_b=b.getSldPoint();
$("color").style.backgroundColor="rgb(" +color_r+ "," +color_g+ "," +color_b+ ")";
$("d1").innerHTML=s+color_r;
$("d2").innerHTML=s+color_g;
$("d3").innerHTML=s+color_b;
}
//-->
</SCRIPT>
<p>
power by never-online, blueDestiny, http://www.QingGui.com
</p>
</BODY>
</HTML>
2、取字符串长度方?/p>
3、求点数方?/p>
4、求整数ҎQ用到QҎ取法Q?
5、判断文本域对象是否惟空
6、两个Select对象(llist,rlist)互相操作
我的试环境?000sever ie6.0+sp4 MYIE1.31 (成功通过试Q?/strong>
关闭H口的途径常用4U:
1.双击左上角图?br />2.直接双击标题栏(MYIEQ?br />3.单击右上角关闭按?
4.alt+f4
2.工E目录下的WebForm1.aspx中内容全部删除,只留下顶部的一条语句:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="XMLTest.WebForm1" %>
3.修改WebForm1.aspx.cs中内容,在Page_Load中加?
XmlDocument doc=new XmlDocument();
String xmlfile=string.Empty;
xmlfile=Context.Request.PhysicalApplicationPath+(Request.QueryString["sel"].ToString()=="xml"?"\\hello.xml":"\\hello.xsl");
doc.Load(xmlfile);
Response.Write(doc.InnerXml);
4.在工E根目录下新增test.htm,q设为工E首?
<html>
<head>
<title></title>
</head>
<body>
<div id="resTree"></div>
<FONT face="宋体"></FONT><input type="button" value="执行" onclick="GetXml()"><BR>
<script language="JScript">
var srcTree,xsltTree,xt;
var http_request = false;
function GetXml()
{
srcTree = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
srcTree.async=false;
xsltTree= new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
xsltTree.async = false;
xt=new ActiveXObject("MSXML2.XSLTemplate");
resTree.innerHTML="";
makeRequest("WebForm1.aspx?sel=xml",GetXml_CB);
}
function makeRequest(url,callback) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = callback;
http_request.open('GET', url, true);
http_request.send(null);
}
function GetXml_CB() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
srcTree.loadXML(http_request.responseText);
makeRequest("WebForm1.aspx?sel=xsl",GetXsl_CB);
} else {
alert('There was a problem with the request.');
}
}
}
function GetXsl_CB(){
if (http_request.readyState == 4) {
if (http_request.status == 200) {
xsltTree.loadXML(http_request.responseText);
xt.stylesheet=xsltTree;
var proc=xt.createProcessor();
proc.input=srcTree;
proc.transform();
resTree.innerHTML=proc.output;
} else {
alert('There was a problem with the request.');
}
}
}
function makeRequest(url,callback) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = callback;
http_request.open('GET', url, true);
http_request.send(null);
}
</script>
</body>
</html>
5.q行工程Q看看效果吧!
hello.xml(注意:我的xml文档中ƈ没有指定对应的xsl解析文g?
<?xml version='1.0'?>
<breakfast-menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>Two of our famous Belgian Waffles
with plenty of real maple syrup.</description>
<calories>650</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>Light Belgian waffles covered with
strawberries and whipped cream.</description>
<calories>900</calories>
</food>
<food>
<name>Berry-Berry Belgian Waffles</name>
<price>$8.95</price>
<description>Light Belgian waffles covered
with an assortment of fresh berries
and whipped cream.</description>
<calories>900</calories>
</food>
<food>
<name>French Toast</name>
<price>$4.50</price>
<description>Thick slices made from our homemade
sourdough bread.</description>
<calories>600</calories>
</food>
<food>
<name>Homestyle Breakfast</name>
<price>$6.95</price>
<description>Two eggs, bacon or sausage, toast,
and our ever-popular hash browns.</description>
<calories>950</calories>
</food>
</breakfast-menu>
hello.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/breakfast-menu">
<xsl:for-each select="food">
<DIV STYLE="background-color:teal; color:white; padding:4px">
<SPAN STYLE="font-weight:bold; color:white"><xsl:value-of select="name"/></SPAN>
?<xsl:value-of select="price"/>
</DIV>
<DIV STYLE="margin-left:20px; margin-bottom:1em; font-size:10pt">
<xsl:value-of select="description"/>
<SPAN STYLE="font-style:italic">
<xsl:value-of select="calories"/> 嘿嘿
</SPAN>
</DIV>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xml文档只有Ua的数据,如果需要显C到html面中的话,一般需要用定制的xsl文档来解析,或者手工通过js来读取xml中的值显C到html中的dom树中Q当使用xsl文档来解析时Q相应的xml文档中必L定对应的xsl文档才能正常昄Q但当有些程序动态输出xml文档Ӟq没有指定相应的xsl文档Q这时就必须通过其它途径来加载相应的xsl文档来解析,当然Q在服务器端输出xml文档Ӟ通过一些xml api也可以实玎ͼ我这儿描q的是通过js来实现的一U方式。用q种方式的话Q就抛开了服务器q_的限Ӟ服务器端只需要输出相应的xml文档(.net/j2ee都可?Qƈ且将对应的xsl文档输出l客LQ可以输出流或直接在客户端加载xsl文档)?/p>
q里有几个需要注意的地方Q我们一般是使用Msxml2.Documentlg来加载xml文档的,但当动态用xsl解析xml文档Ӟ必须使用Msxml2.FreeThreadedDOMDocumentq种自由U程的组Ӟ同时使用MSXML2.XSLTemplate模板lg来加载xml,xsl数据Q通过MSXML2.XSLTemplate的transformҎQ就可以动态的用xsl来解析xml数据?另外QIE5开始,pȝ默认的xmllg是msxml2Q如果需要用更新的msxmllg需要安装更新的msxmllg包,q指定新的名Uͼ例如Msxml2.FreeThreadedDOMDocument.4.0Q现在最新的msxmllg?.0betaQ可在M$|站下蝲?/p>
Arguments
该对象代表正在执行的函数和调用它的函数的参数?/p>
[function.]arguments[n]
参数function Q选项。当前正在执行的 Function 对象的名字?n Q选项。要传递给 Function 对象的从0开始的参数值烦引?
说明
Arguments是进行函数调用时Q除了指定的参数外,q另外创建的一个隐藏对象。Arguments是一个类似数l但不是数组的对象,说它cM数组是因为其h数组一L讉K性质及方式,可以由arguments[n]来访问对应的单个参数的|q拥有数l长度属性length。还有就是arguments对象存储的是实际传递给函数的参敎ͼ而不局限于函数声明所定义的参数列表,而且不能昑ּ创徏 arguments 对象。arguments 对象只有函数开始时才可用。下边例子详l说明了q些性质:
//arguments 对象的用法?br />function ArgTest(a, b){
var i, s = "The ArgTest function expected ";
var numargs = arguments.length; // 获取被传递参数的数倹{?br /> var expargs = ArgTest.length; // 获取期望参数的数倹{?br /> if (expargs < 2)
s += expargs + " argument. ";
else
s += expargs + " arguments. ";
if (numargs < 2)
s += numargs + " was passed.";
else
s += numargs + " were passed.";
s += "\n\n"
for (i =0 ; i < numargs; i++){ // 获取参数内容?br /> s += " Arg " + i + " = " + arguments[i] + "\n";
}
return(s); // q回参数列表?br />}
在此d了一个说明arguments不是数组(Arrayc?的代?
Array.prototype.selfvalue = 1;
alert(new Array().selfvalue);
function testAguments(){
alert(arguments.selfvalue);
}
q行代码你会发现W一个alert昄1Q这表示数组对象拥有selfvalue属性,gؓ1Q而当你调用函数testAgumentsӞ你会发现昄的是“undefined”,说明了不是arguments的属性,即argumentsq不是一个数l对象?/p>
caller
q回一个对函数的引用,该函数调用了当前函数?br /> functionName.caller
functionName 对象是所执行函数的名U?br />说明
对于函数来说Qcaller 属性只有在函数执行时才有定义。如果函数是由顶层调用的Q那?caller 包含的就?null 。如果在字符串上下文中?caller 属性,那么l果?functionName.toString 一P也就是说Q显C的是函数的反编译文本?br />下面的例子说明了 caller 属性的用法Q?/p>
// caller demo {
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
alert("this is a top function");
}
}
function handleCaller() {
callerDemo();
}
callee
q回正被执行?Function 对象Q也是所指定?Function 对象的正文?/p>
[function.]arguments.callee
可选项 function 参数是当前正在执行的 Function 对象的名U?/p>
说明
callee 属性的初始值就是正被执行的 Function 对象?/p>
callee 属性是 arguments 对象的一个成员,它表C对函数对象本n的引用,q有利于匿名
函数的递归或者保证函数的装性,例如下边CZ的递归计算1到n的自然数之和。而该属?br />仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性,q个属性有时?br />用于验证q是比较好的。arguments.length是实参长度,arguments.callee.length?br />形参长度Q由此可以判断调用时形参长度是否和实参长度一致?/p>
CZ
//callee可以打印其本w?br />function calleeDemo() {
alert(arguments.callee);
}
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("验证形参和实参长度正!");
return;
} else {
alert("实参长度Q? +arguments.length);
alert("形参长度Q?" +arguments.callee.length);
}
}
//递归计算
var sum = function(n){
if (n <= 0)
return 1;
else
return n Qarguments.callee(n - 1)
}
比较一般的递归函数Q?/p>
var sum = function(n){
if (1==n) return 1;
else return n + sum (n-1);
调用Ӟalert(sum(100));
其中函数内部包含了对sum自n的引用,函数名仅仅是一个变量名Q在函数内部调用sum即相当于调用
一个全局变量Q不能很好的体现出是调用自nQ这时用callee会是一个比较好的方法?/p>
apply and call
它们的作用都是将函数l定到另外一个对象上去运行,两者仅在定义参数方式有所区别Q?/p>
apply(thisArg,argArray);
call(thisArg[,arg1,arg2…] ]);
x有函数内部的this指针都会被赋gؓthisArgQ这可实现将函数作ؓ另外一个对象的Ҏq行的目?/p>
apply的说?/p>
如果 argArray 不是一个有效的数组或者不?arguments 对象Q那么将D一?TypeError?br />如果没有提供 argArray ?thisArgM一个参敎ͼ那么 Global 对象被用作 thisArgQ?
q且无法被传递Q何参数?/p>
call的说?/p>
call Ҏ可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象?br />如果没有提供 thisArg参数Q那?Global 对象被用?thisArg
相关技巧:
应用call和applyq有一个技巧在里面Q就是用call和apply应用另一个函敎ͼc)以后Q当前的
函数Q类Q就具备了另一个函敎ͼc)的方法或者是属性,q也可以UC为“扎쀝。看下面CZ:
// l承的演C?br />function base() {
this.member = " dnnsun_Member";
this.method = function() {
window.alert(this.member);
}
}
function extend() {
base.call(this);
window.alert(member);
window.alert(this.method);
}
上面的例子可以看出,通过call之后Qextend可以l承到base的方法和属性?/p>
Z提一下,在javascript框架prototype里就使用apply来创Z个定义类的模式,
其实C码如下:
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
解析Q从代码?该对象仅包含一个方法:CreateQ其q回一个函敎ͼ即类。但q也同时是类?br />构造函敎ͼ其中调用initializeQ而这个方法是在类创徏时定义的初始化函数。通过如此途径Q?br />可以实现prototype中的cd建模?/p>
CZQ?/p>
var vehicle=Class.create();
vehicle.prototype={
initialize:function(type){
this.type=type;
}
showSelf:function(){
alert("this vehicle is "+ this.type);
}
}
var moto=new vehicle("Moto");
moto.showSelf();