Д. Флэнаган - javascript (Резанное)
TRANSCRIPT
JavaScriptJavaScript . Java Script C, C++ Java , if, while &&. . JavaScript , . . . JavaScript . Perl, C C++ Java. JavaScript , Self, C++ Java. Perl, JavaScript , , , Perl. JavaScript , , . , . JavaScript , , , . JavaScript , HTML . , JavaScript, , , . JavaScript , . JavaScript , , , . JavaScript , JavaScript.
JavaScript , . , JavaScript .
1.1. JavaScript JavaScript . JavaScript, , .
1.1.1. JavaScript Java JavaScript , Java, , Sun Microsystems. , . ( LiveScript JavaScript ). JavaScript Java ( . 12 23).
1.1.2. JavaScript JavaScript , , , , , . , JavaScript , . JavaScript , . JavaScript , , , , . , JavaScript , , . JavaScript, . JavaScript, , .
1.2. JavaScript , JavaScript . , .
(European Computer Manufacturers Association, ECMA).1 JavaScript 1.5 Netscape Mozilla Foundation, Jscript 5.5 Microsoft. , Netscape 4.5 Internet Explorer 4, . , . , ECMA 262 ECMAScript. , . JavaScript , Net scape Mozilla Foundation. JavaScript. JavaScript . Firefox 1.5, Mozilla Foundation, JavaScript 1.6. () , 7.7.10, E4X, . ECMA 262, JavaScript, ECMA , JavaScript, ECMA 357. JavaScript, E4X, ECMAScript for XML. XML , XML . E4X JavaScript 1.6 Firefox 1.5. E4X, 21 . ECMA 262, JavaScript 2.0. , . JavaScript 2.0. , , Microsoft JScript.NET, ActionScript 2.0 ActionScript 3.0, Adobe ( Macromedia) Flash. , Java Script 2.0, JavaScript 1.6 . , , . JavaScript 2.0 , , .1
ECMA 262, 3 ( http://www.ecma internatio nal.org/publications/files/ecma st/ECMA 262.pdf).
1.3. JavaScript JavaScript , JavaScript. , , JavaScript, , JavaScript, JavaScript. JavaScript JavaScript, JavaScript. JavaScript JavaScript (Document Object Model, DOM), . JavaScript , DOM . , , JavaScript . JavaScript , DHTML ( 16), , Ajax ( 20). 13 JavaScript. ECMA 262 Java Script, World Wide Web Consortium (W3C) DOM, , . ( 15, 16 17 .) W3C DOM Microsoft Internet Explorer; .
1.3.1. JavaScript , JavaScript, JavaScript . 1.1 JavaScript, , .
1.1. JavaScript var fact = 1; for(i = 1; i < 10; i++) { fact =
fact*i; document.write(i + "! = " + fact + "
"); }
, JavaScript, , . 1.1.
. 1.1. , JavaScript
, JavaScript HTML . 13. , , document.write().1 HTML HTML . JavaScript HTML , . , JavaScript : . JavaScript , , . 1.2 HTML , , . 1.2. HTML JavaScript
. 1.2 . onclick 1.2 JavaScript , , . on click alert(). . 1.2, alert() . 1.1 1.2 JavaScript. , 1
, .
. 1.2. JavaScript
HTML . 1.3 JavaScript . , . , HTML , , . . 1.3 HTML . , HTML . . Java Script : , , JavaScript , , . HTML , HTML . ,
. 1.3. JavaScript
onchange onclick . , , . Java Script calculate(). , calculate(). calculate() . , , , , , id. 1.3 , . JavaScript , HTML , CSS JavaScript , , JavaScript.1 1.3. JavaScript JavaScript /* : */ .result { font weight: bold; } /* class="result"*/ #payment { text decoration: underline; } /* id="payment" */ : 1
, HTML , CSS JavaScript , , , , . , , , . , 13.1.5 13.
1) ( ): 2) : 3) : : 4) : $ 5) : $ 6) : $ /* * JavaScript , . * : calculate(), * . * , , , * . */ function calculate( ) { // . , // . // . // . var principal = document.loandata.principal.value; var interest = document.loandata.interest.value / 100 / 12; var payments = document.loandata.years.value * 12; // . var x = Math.pow(1 + interest, payments); var monthly = (principal*x*interest)/(x 1); // . var payment = document.getElementById("payment"); var total = document.getElementById("total");
var totalinterest = document.getElementById("totalinterest"); // , . // , . if (isFinite(monthly)) { payment.innerHTML = monthly.toFixed(2); total.innerHTML = (monthly * payments).toFixed(2); totalinterest.innerHTML = ((monthly*payments) principal).toFixed(2); } // , , // , . else { payment.innerHTML = ""; total.innerHTML = ""; totalinterest.innerHTML = ""; } }
1.4. JavaScriptJavaScript , . JavaScript . Netscape JavaScript, JavaScript . Internet Ex plorer Microsoft JScript IIS Windows Scripting Host. Adobe JavaScript Flash . Sun JavaScript Java 6.0, Java ( , , 12). Netscape, Microsoft JavaScript , . , Netscape, Mozilla (http://www.mozilla.org/js/). Mozilla JavaScript 1.5: C SpiderMonkey, Java , , Rhino (). , JavaScript, , , . , , , .
1.5. JavaScript . Java Script . , . JavaScript . JavaScript , , , . JavaScript, . , , 1.1 : document.write(" "); for (i=0, j=1, k=0, fib =0; i "+result+"\n"; else expression = ""; // : message += " , :"; // , // . expression = prompt(message, expression); // // // if ( ), . (!expression) return;
// // . // . result = inspector(expression); } }
: inspect() 8.7 Window.prompt() ( ). , :function factorial(n) { // var inspector = function($) { return eval($); } inspect(inspector, " factorial()"); var result = 1; while(n > 1) { result = result * n; n ; inspect(inspector, "factorial( ) loop"); } inspect(inspector, " factorial()"); return result; }
8.8.4.2. Internet Explorer Microsoft Internet Explorer ActiveX DOM
. , , . , , JavaScript , (, ), , , JavaScript . . , , , , . , . . : http://msdn.microsoft.com/library/en us/ IETechCol/dnwebgen/ie_leak_patterns.asp.
8.9. Function() , function , . Function(). Function() , , . :var f = new Function("x", "y", "return x*y;");
, , :function f(x, y) { return x*y; }
Function() . . Java Script , . , . , . : Function() , . , Function(), . , Function(), : Function() . eval() ( ).
Function() . , . , , , , . (, , , , .) : Function(), , , , :var y = ""; function constructFunction() { var y = ""; return new Function("return y"); // ! } // "", , // Function(), . // , // "". alert(constructFunction()()); // ""
, JavaScript 7, , . . , Complex, , Complex . JavaScript , , Java, C++ C#.1 JavaScript , . JavaScript. , , JavaScript 2.0 .
9.1. 7 {}, :new Object()
, :1
JavaScript 2.0.
var array = new Array(10); var today = new Date( );
new . , , this. , new, , . , , . , , , this. , :// . // , "this". function Rectangle(w, h) { this.width = w; this.height = h; } // Rectangle. // , . var rect1 = new Rectangle(2, 4); // rect1 = { width:2, height:4 }; var rect2 = new Rectangle(8.5, 11); // rect2 = { width:8.5, height:11 };
, , this. , , Rectangle(), width height. , , Rectangle. , , , . , new Rectangle(1, 2), , , new init_rect(1, 2). , , this. , new. , this, .
9.2. 8 , , . , , , this. , , Rectangle. :function computeAreaOfRectangle(r) { return r.width * r.height; }
, . , , . :// Rectangle var r = new Rectangle(8.5, 11); // r.area = function() { return this.width * this.height; } // , var a = r.area();
, . , area . Rectangle():function Rectangle(w, h) { this.width = w; this.height = h; this.area = function( ) { return this.width * this.height; } }
:// U.S. Letter var r = new Rectangle(8.5, 11); var a = r.area();
, . . width height , area Rectangle (, , , , , ). , , . . , JavaScript , . , . , , JavaScript . , new . . new . prototype . prototype, . . constructor ,
. ( constructor 7, , constructor.) , , , . . Rectangle():// , // . function Rectangle(w, h) { this.width = w; this.height = h; } // , // . Rectangle.prototype.area = function() { return this.width * this.height; }
, width height, . , , , , . , . , . ; , . . , , , . . . , , . ( ). . for/in in. Object.hasOwnProperty():var r = new Rectangle(2, 3); r.hasOwnProperty("width"); // true: width "r" r.hasOwnProperty("area"); // false: area "r" "area" in r; // true: area "r"
9.2.1. , , . , JavaScript . p o, JavaScript , o p. , , p . .
, JavaScript . , , : , o.p, o p. , JavaScript p o . p , , . , . p o, , p. , o p, p . p, JavaScript o. p, o, , JavaScript p. , p () p . , . 9.1.
. 9.1.
, , , , . . ( ) . , . , , , .
9.2.2. , , . , String Date, , . , , String:// true, c String.prototype.endsWith = function(c) { return (c == this.charAt(this.length 1)) }
endsWith() String, :var message = "hello world"; message.endsWith('h') // false message.endsWith('d') // true
: , , Java Script . , , , , . JavaScript , , . : Object.pro totype. for/in, Object.prototype, JavaScript . {}, , . Object.prototype , , , , . , , JavaScript. JavaScript , Java , , ,
. , , , . , , JavaScript, . , Function.apply() Microsoft Internet Exp lorer 4 5 . , , :// Function.apply() , // , (Aaron Boodman). if (!Function.prototype.apply) { // // . eval() Function.prototype.apply = function(object, parameters) { var f = this; // var o = object || window; // , var args = parameters || []; // // o. // , o._$_apply_$_ = f; // eval(). // . // . var stringArgs = []; for(var i = 0; i < args.length; i++) stringArgs[i] = "args[" + i + "]"; // , // . var arglist = stringArgs.join(","); // var methodcall = "o._$_apply_$_(" + arglist + ");"; // eval() var result = eval(methodcall); // delete o._$_apply_$_; // return result; }; }
, Firefox 1.5 (. 7.7.10). Ar ray.map() , , :// Array.map() f // , . // map() , f
// // // if
. f() 3 . , , . . (!Array.prototype.map) { Array.prototype.map = function(f, thisObject) { var results = []; for(var len = this.length, i = 0; i < len; i++) { results.push(f.call(thisObject, this[i], i, this)); } return results; }
}
9.3. JavaScript JavaScript , , . , C++ Java. . JavaScript . , , JavaScript . JavaScript . ( ) , . JavaScript , , , Java C++. . JavaScript , Java C++.1 , . , , , , . , , , , . JavaScript , . , Java C++, . 2, . JavaScript1
2
, . Java C++ , , JavaScript.
, , , , . Java C++ . , , . . JavaScript , , , . JavaScript, , , . , . , . (. . ) . Java , . . Java Script. , Rectangle , rect. Java : , , . , JavaScript .
9.3.1. . , 10 , 10 . , Rectangle Rectang le width, . width . , . , , r , Rectangle, :r.width
JavaScript . , , JavaScript , / .
9.3.2. , , , . ( Java , JavaScript, Java .)
, . area() Rectangle . Rectangle :a = r.area( );
, , , this. , , , . . Java Script . , , , .
9.3.2.1. this , Java C++, JavaScript. Java C++ this. , , area Java :return width * height;
JavaScript this :return this.width * this.height;
this , with ( 6.18), :Rectangle.prototype.area = function( ) { with(this) { return width*height; } }
9.3.3. Java , , . , , . , , . Number.MAX_VALUE JavaScript, , MAX_VALUE Number. , . , , JavaScript, . , JavaScript
. , Rectangle.UNIT 1x1 :Rectangle.UNIT = new Rectangle(1,1);
Rectangle , JavaScript , , .
9.3.4. , , ; , . Date.parse() ( ) . Date, Date. , this , this . ( this .) , . , , , , . , Java Script . JavaScript, .
9.3.5. : Circle 9.1 , , . , , . 9.1. Circle// . function Circle(radius) { // r , // . this.r = radius; } // Circle.PI , . . . Circle.PI = 3.14159; // , . Circle.prototype.area = function( ) { return Circle.PI * this.r * this.r; } // Circle . Circle.max = function(a,b) {
if (a.r > b.r) return a; else return b; } // var c = new Circle(1.0); // c.r = 2.2; // var a = c.area(); // var x = Math.exp(Circle.PI); // var d = new Circle(1.2); // var bigger = Circle.max(c,d); // : Circle r area() PI Circle max()
9.3.6. : 9.2 Java Script, , . . 9.2. /* * Complex.js: * Complex . * , * , i 1. */ /* * * . * . " ", * . */ function Complex(real, imaginary) { this.x = real; // this.y = imaginary; // } /* * * ( ) . * , , * . , * this. * . */ // . // (0,0). Complex.prototype.magnitude = function() { return Math.sqrt(this.x*this.x + this.y*this.y); }; // . Complex.prototype.negative = function() {
return new Complex( this.x, this.y); }; // // . Complex.prototype.add = function(that) { return new Complex(this.x + that.x, this.y + that.y); } // // . Complex.prototype.multiply = function(that) { return new Complex(this.x * that.x this.y * that.y, this.x * that.y + this.y * that.x); } // Complex . // , Complex . Complex.prototype.toString = function() { return "{" + this.x + "," + this.y + "}"; }; // . Complex.prototype.equals = function(that) { return this.x == that.x && this.y == that.y; } // . // , Complex // . Complex.prototype.valueOf = function() { return this.x; } /* * , * * ( * ). , * this, . */ // . Complex.add = function (a, b) { return new Complex(a.x + b.x, a.y + b.y); }; // . Complex.multiply = function(a, b) { return new Complex(a.x * b.x a.y * b.y, a.x * b.y + a.y * b.x); }; // . // , "". // ( JavaScript , .) Complex.ZERO = new Complex(0,0); Complex.ONE = new Complex(1,0); Complex.I = new Complex(0,1);
9.3.7. , C++, (private) , . , , /. JavaScript ( 8.8), , . , . Rectangle, :function ImmutableRectangle(w, h) { // , // . // // . this.getWidth = function() { return w; } this.getHeight = function() { return h; } } // : . ImmutableRectangle.prototype.area = function( ) { return this.getWidth( ) * this.getHeight( ); };
(, , ), , (Douglas Crockford). http://www.crockford.com/ javascript/private.html.
9.4. Object JavaScript , . .
9.4.1. toString() toString() , toString() . , toString(), . , . . . , . ,
parse() , toString(), . Complex 9.2 toString(), toString() Circle:Circle.prototype.toString = function () { return "[ " + this.r + " (" + this.x + ", " + this.y + ").]"; }
toString() Circle :" 1 (0, 0)."
9.4.2. valueOf() valueOf() toString(), , Java Script , . , , , this. , . valueOf(), Object, , , . , Number Boolean, , valueOf() , . Number Boolean , . , . valueOf(). 9.2, , valueOf() Complex. . Complex , . , , :var var var var a b c d = = = = new Complex(5,4); new Complex(2,1); Complex.sum(a,b); // c {7,5} a + b; // d 7
valueOf() : valueOf() toString(). , valueOf() , , , toString(). Complex:alert("c = " + c); // valueOf(); "c = 7" alert("c = " + c.toString()); // "c = {7,5}"
9.4.3. JavaScript , . , , , , , .1 (, < >). , , . Java , JavaScript. , equals(). true, , . , , . , , . Complex 9.2 equals(). , . , , . , Complex , magnitude(). Circle X Y? , ? JavaScript , < = b a == b a != b a.compareTo(b) < 0 a.compareTo(b) 0 a.compareTo(b) >= 0 a.compareTo(b) == 0 a.compareTo(b) != 0
compareTo() Complex 9.2, :Complex.prototype.compareTo = function(that) { // // magnitude(), . // 1 1, // , // , . if (!that || !that.magnitude || typeof that.magnitude != "function") throw new Error(" Complex.compareTo()"); // , // , . // compareTo(). return this.magnitude() that.magnitude(); }
, , . Array.sort() , , compareTo(). compareTo() :complexNumbers.sort(new function(a,b) { return a.compareTo(b); });
, compare() , compareTo(). , , :Complex.compare = function(a,b) { return a.compareTo(b); };
:complexNumbers.sort(Complex.compare);
: compare() compareTo() Complex 9.2. , equals(), . equals() , Complex , . compareTo() , . 1+0i 0+1i compareTo(), equals() , . , equals() compa reTo() , . . compareTo(), equals():1// // . , Complex.prototype.compareTo = function(that) { var result = this.x that.x; // // if (result == 0) // ... result = this.y that.y; // // , // , return result; };
9.5. Java, C++ . , . , . . , . , JavaScript . JavaScript . JavaScript Object , , . , Object . Object. , . Object? , ; 1
< >. . . .
Object(). , Ob ject.prototype! Complex Com plex.prototype, Object.prototype. Complex, . , Complex.prototype. , , Object.prototype. : Complex , Object, Complex.prototype Object.prototype. , , 9.2, Complex.prototype toString(). Object.prototype , Complex , toString() Complex.proto type . , , Object. Java Script; . , . , Rectangle, , . , Rectangle Rectang le.prototype. 9.3 Rectanle PositionedRectangle. 9.3. JavaScript// . // function Rectangle(w, h) { this.width = w; this.height = h; } Rectangle.prototype.area = function( ) { return this.width * this.height; } // function PositionedRectangle(x, y, w, h) { // // width height . // call, // . // . Rectangle.call(this, w, h); // this.x = x; this.y = y; } // , // PositionedRectangle(), // Object.
// Rectangle, . PositionedRectangle.prototype = new Rectangle(); // , // width height, // Rectangle, . delete PositionedRectangle.prototype.width; delete PositionedRectangle.prototype.height; // // Rectangle(), constructor // . , PositionedRectangle // , // constructor PositionedRectangle.prototype.constructor = PositionedRectangle; // // , . PositionedRectangle.prototype.contains = function(x,y) { return (x > this.x && x < this.x + this.width && y > this.y && y < this.y + this.height); }
9.3, JavaScript , Object. , . . , constructor .1 , , , . PositionedRectangle, :var r = new PositionedRectangle(2,2,2,2); print(r.contains(3,3)); // print(r.area( )); // // : print(r.x + ", " + r.y + ", " + r.width + ", " + r.height); // 3 1
Rhino 1.6r1 ( JavaScript, Java) , constructor . Rhino , constructor, . PositionedRectangle constructor, Rectangle(). , instanceof Positi onedRectangle Rectangle.
print(r instanceof PositionedRectangle && r instanceof Rectangle && r instanceof Object);
9.5.1. Positioned Rectangle() . . , superclass :// . PositionedRectangle.prototype.superclass = Rectangle;
, . , , , superclass, this.superclass (), (). , , , 9.3. , :function PositionedRectangle(x, y, w, h) { this.superclass(w,h); this.x = x; this.y = y; }
: this. , call() apply() .
9.5.2. , , , (overrides) . , , . , toString() toString() Object. , , . . . , . . , Rectangle toString() ( ) :
Rectangle.prototype.toString = function( ) { return "[" + this.width + "," + this.height + "]"; }
toString() Rectangle, PositionedRectangle, , , . PositionedRectangle , toString() . , width height . :PositionedRectangle.prototype.toString = function() { return "(" + this.x + "," + this.y + ") " + // Rectangle.prototype.toString.apply(this); // }
toString() . : apply(), , . PositionedRectangle.prototype superclass, , :PositionedRectangle.prototype.toString = function( ) { return "(" + this.x + "," + this.y + ") " + // this.superclass.prototype.toString.apply(this); }
, superclass . , .
9.6. , . JavaScript , . JavaScript , ( ) . 9.4 , . 9.4. // . // . // , Object, Array, Date RegExp // . function borrowMethods(borrowFrom, addTo) { var from = borrowFrom.prototype; //
var to = addTo.prototype;
//
for(m in from) { // if (typeof from[m] != "function") continue; // , // to[m] = from[m]; // } }
, , . . 9.5 , , , . , , , . 9.5. , // . // toString(), . function GenericToString() {} GenericToString.prototype.toString = function( ) { var props = []; for(var name in this) { if (!this.hasOwnProperty(name)) continue; var value = this[name]; var s = name + ":" switch(typeof value) { case 'function': s += "function"; break; case 'object': if (value instanceof Array) s += "array" else s += value.toString( ); break; default: s += String(value); break; } props.push(s); } return "{" + props.join(", ") + "}"; } // equals(), . function GenericEquals() {} GenericEquals.prototype.equals = function(that) { if (this == that) return true; // // // // , this , that, : . === . ,
// , , // , , equals() true var propsInThat = 0; for(var name in that) { propsInThat++; if (this[name] !== that[name]) return false; } // , this var propsInThis = 0; for(name in this) propsInThis++; // this , // , if (propsInThis != propsInThat) return false; // . return true; }
Rectangle, toString() equals(), :// Rectangle function Rectangle(x, y, w, h) { this.x = x; this.y = y; this.width = w; this.height = h; } Rectangle.prototype.area = function( ) { return this.width * this.height; } // borrowMethods(GenericEquals, Rectangle); borrowMethods(GenericToString, Rectangle);
, , . ColoredRec tangle. Rectangle Colored:// , . , // , . function Colored(c) { this.color = c; } Colored.prototype.getColor = function() { return this.color; } // function ColoredRectangle(x, y, w, h, c) { this.superclass(x, y, w, h); // Colored.call(this, c); // Colored } // Rectangle ColoredRectangle.prototype = new Rectangle(); ColoredRectangle.prototype.constructor = ColoredRectangle; ColoredRectangle.prototype.superclass = Rectangle;
// Colored borrowMethods(Colored, ColoredRectangle);
ColoredRectangle Rectangle ( ), Colored. Rectangle Object GenericEquals GenericToString. , . ColoredRectangle Colored, ColoredRectangle Colored. instanceof , 9.7.3 , , .
9.7. JavaScript , JavaScript . JavaScript , . , typeof ( . 5.10.2). typeof , . , typeof null "ob ject", typeof undefined "undefined". "object", , "function", .
9.7.1. instanceof , , , instanceof, . , x , true:x instanceof Array
instanceof , , . : . , o o instanceof Object true. , instanceof , , true:typeof f == "function" f instanceof Function f instanceof Object
, , constructor. :var d = new Date(); // Date; Date Object
var isobject = d instanceof Object; // true var realobject = d.constructor==Object; // false
9.7.2. Object.toString() instanceof constructor , , , , , . Object.toString(). 7, Object toString() . , , . toString() , . ECMAScript , toString() :[object class]
class , . , class "Array", "Function", / "Date". Math "Math", Error "Error". JavaScript , JavaScript, class , (, "Window", "Document" "Form"). , , Circle Complex, , class "Object". toString() . toString() , , , . Ob ject.prototype apply() , :Object.prototype.toString.apply(o); // toString()
9.6 , . , toString() , classname , . 9.6. function getType(x) { // x null, "null" if (x == null) return "null"; // typeof var t = typeof x;
// , if (t != "object") return t; // , x . toString() // . var c = Object.prototype.toString.apply(x); // "[object class]" c = c.substring(8, c.length 1); // "[object" "]" // Object, . if (c != "Object") return c; // "Object", , x // . if (x.constructor == Object) return c; // "Object" // // classname, if ("classname" in x.constructor.prototype && // typeof x.constructor.prototype.classname == "string") // return x.constructor.prototype.classname; // , . return ""; }
9.7.3. : , , !. JavaScript , : , , . , JavaScript, : X, X, X().1 , . Rectangle, equals() GenericEquals. Rectangle GenericEquals. instanceof , ( 9.7). 9.7. // true, c.prototype // o. o , , // o . // : , // , . , // , false. function borrows(o, c) {1
Ruby. .
// o c, true if (o instanceof c) return true; // // // // // // if , . , , undefined, " ". undefined false, false, . (c == Array || c == Boolean || c == Date || c == Error || c == Function || c == Number || c == RegExp || c == String) return undefined;
if (typeof o == "function") o = o.prototype; var proto = c.prototype; for(var p in proto) { // , if (typeof proto[p] != "function") continue; if (o[p] != proto[p]) return false; } return true; }
borrows() 9.7 : true, o , c. : o c, , c. JavaScript () . 9.8 , . 9.8. // true, o // , c.prototype. // false. , // , . function provides(o, c) { // o c, "" c if (o instanceof c) return true; // , if (typeof o == "function") o = o.prototype; // // // if , undefined. . (c == Array || c == Boolean || c == Date || c == Error || c == Function || c == Number || c == RegExp || c == String) return undefined;
var proto = c.prototype; for(var p in proto) { // c.prototype // , if (typeof proto[p] != "function") continue; // o , false if (!(p in o)) return false;
// if // if
, , false (typeof o[p] != "function") return false; , false. (o[p].length != proto[p].length) return false;
} // , true. return true; }
provide() compareTo(), 9.4.3. , compareTo() , , compareTo(). Comparable:function Comparable( ) {} Comparable.prototype.compareTo = function(that) { throw "Comparable.compareTo() . !"; }
Comparable : , . , :// , o p // compareTo() if (o.constructor == p.constructor && provides(o, Comparable)) { var order = o.compareTo(p); }
: , , borrows() provides(), undefined, JavaScript, Array. , for/in. undefined, , , true. Array . , 7.8 ( ), , , . , , . 9.9. 9.9. , function isArrayLike(x) { if (x instanceof Array) return true; // if (!("length" in x)) return false; // length if (typeof x.length != "number") return false; // length , if (x.length < 0) return false; // if (x.length > 0) { // , length 1
if (!((x.length 1) in x)) return false; } return true; }
9.8. : defineClass() define Class(), , , , . 9.10. 9.10. /** * defineClass() JavaScript . * * . * JavaScript , * , . * , : * , . * * , , * : * * name: . * , classname . * * extend: . * Object(). * superclass . * * construct: . * . , * constructor . * * methods: , ( , * ) . * . * . * "classname", "superclass" "constructor" * . * * statics: , ( * ) . * . . * * borrows: . * * , * .
* , * , , * , . * : * , * . * , , * . * . * * provides: . * , * , * , . * , , * "" , * . , * . * ( ) * . , * . **/ function defineClass(data) { // . // . var classname = data.name; var superclass = data.extend || Object; var constructor = data.construct || function( ) {}; var methods = data.methods || {}; var statics = data.statics || {}; var borrows; var provides; // , // . if (!data.borrows) borrows = []; else if (data.borrows instanceof Array) borrows = data.borrows; else borrows = [ data.borrows ]; // . if (!data.provides) provides = []; else if (data.provides instanceof Array) provides = data.provides; else provides = [ data.provides ]; // , . var proto = new superclass(); // . for(var p in proto) if (proto.hasOwnProperty(p)) delete proto[p]; // , . for(var i = 0; i < borrows.length; i++) { var c = data.borrows[i]; borrows[i] = c; // c
for(var p in c.prototype) { if (typeof c.prototype[p] != "function") continue; proto[p] = c.prototype[p]; } } // // , for(var p in methods) proto[p] = methods[p]; // "constructor", // "superclass" "classname" proto.constructor = constructor; proto.superclass = superclass; // classname , . if (classname) proto.classname = classname; // , . for(var i = 0; i < provides.length; i++) { // var c = provides[i]; for(var p in c.prototype) { // if (typeof c.prototype[p] != "function") continue; // if (p == "constructor" || p == "superclass") continue; // // . , if (p in proto && typeof proto[p] == "function" && proto[p].length == c.prototype[p].length) continue; // throw new Error(" " + classname + " "+ c.classname + "." + p); } } // constructor.prototype = proto; // for(var p in statics) constructor[p] = data.statics[p]; // return constructor; }
9.11 , defineClass(). 9.11. defineClass()// Comparable , // , "" Comparable. var Comparable = defineClass({ name: "Comparable", methods: { compareTo: function(that) { throw "abstract"; } } }); // equals() var GenericEquals = defineClass({
name: "GenericEquals", methods: { equals: function(that) { if (this == that) return true; var propsInThat = 0; for(var name in that) { propsInThat++; if (this[name] !== that[name]) return false; } // , this var propsInThis = 0; for(name in this) propsInThis++; // , if (propsInThis != propsInThat) return false; // , . return true; } } }); // Rectangle, Comparable var Rectangle = defineClass({ name: "Rectangle", construct: function(w,h) { this.width = w; this.height = h; }, methods: { area: function() { return this.width * this.height; }, compareTo: function(that) { return this.area( ) that.area( ); } }, provides: Comparable }); // Rectangle, // , , // equals(). var PositionedRectangle = defineClass({ name: "PositionedRectangle", extend: Rectangle, construct: function(x,y,w,h) { this.superclass(w,h); // this.x = x; this.y = y; }, methods: { isInside: function(x,y) { return x > this.x && x < this.x+this.width && y > this.y && y < this.y+this.height; } }, statics: { comparator: function(a,b) { return a.compareTo(b); } }, borrows: [GenericEquals] });
JavaScript , . JavaS cript . Java Script , JavaScript .1 , JavaScript. JavaScript (JavaScript Archive Network, JSAN) Perl (Compre hensive Perl Archive Network, CPAN), , JavaScript , CPAN Perl. JSAN http://www.openjsan.org. JavaScript , , JavaScript , . . , , 1
JavaScript . , JavaScript. JavaScript (. 13). load(), .
: , . . JavaScript, , , , . . , .
10.1. JavaScript , , , . , , , , . . JavaScript 1, JavaScript . provides() defineClass(), 9.8 9.10 . . JavaScript , . , :// , // var Class = {}; // Class.define = function(data) { /* */ } Class.provides = function(o, c) { /* */ }
: ( ) JavaScript . , . JavaScript : . : , .1
, , namespace C++ Tcl ( JavaScript ). . . .
, , .
, Class, Class.js, , :/** * Class.js: . * * "Class". * Class , * . **/
JavaScript , . , , Class ? . , . . Class.js, . , utilities/Class.js flanagan/Class.js. , . , Class, , flanagan.Class. :/** * flanagan/Class.js: . * * "flanagan", * . , * Class flanagan. * flanagan.Class. **/ var flanagan; // "flanagan" if (!flanagan) flanagan = {}; // , flanagan.Class = {} // flanagan.Class // flanagan.Class.define = function(data) { /* */ }; flanagan.Class.provides = function(o, c) { /* */ };
flanagan . , , , flanagan.Date. , flanagan var . , , , unde
fined. . , undefined. . , Flanagan, , , , . , Java, , . , (.com ) , JavaScript . davidflanagan.com, com/davidflanagan/Class.js com.davidflanagan.Class. JavaScript , com.davidflanagan, davidflanagan.com. JavaScript , . . , : , . 10.1 com.david flanagan.Class. , ; , com.davidflanagan.Class com com.davidflanagan, . , . 10.1. // "com", // , , var com; if (!com) com = {}; else if (typeof com != "object") throw new Error(" com , "); // if (!com.davidflanagan) com.davidflanagan = {} else if (typeof com.davidflanagan != "object") throw new Error("com.davidflanagan , "); // , com.davidflanagan.Class if (com.davidflanagan.Class) throw new Error("com.davidflanagan.Class "); // //
com.davidflanagan.Class = { define: function(data) { /* */ }, provides: function(o, c) { /* */ } };
10.1.1. , , , , . , . , com . , :var com; // if (!com || !com.davidflanagan || !com.davidflanagan.Class) throw new Error("com/davidflanagan/Class.js ");
, VERSION , , . , .
10.1.2. Class, 10.1, . . , JavaScript . 10.2 , , . Class define(). ( , , 9.10.) 10.2. /** * com/davidflanagan/Complex.js: , * * com.davidflanagan.Complex() * com/davidflanagan/Class.js **/ // Class var com; // if (!com || !com.davidflanagan || !com.davidflanagan.Class) throw new Error("com/davidflanagan/Class.js "); // , // com.davidflanagan , . // Complex com.davidflanagan.Complex = com.davidflanagan.Class.define({ name: "Complex", construct: function(x,y) { this.x = x; this.y = y; },
methods: { add: function(c) { return new com.davidflanagan.Complex(this.x + c.x, this.y + c.y); } }, });
, . 10.3 , , . 10.3. , /** * com/davidflanagan/Shapes.js: , * * com.davidflanagan.shapes * com/davidflanagan/Class.js **/ // Class var com; // if (!com || !com.davidflanagan || !com.davidflanagan.Class) throw new Error("com/davidflanagan/Class.js "); // var define = com.davidflanagan.Class.define; // // // if , com.davidflanagan , . (com.davidflanagan.shapes) throw new Error(" com.davidflanagan.shapes ");
// com.davidflanagan.shapes = {}; // , // com.davidflanagan.shapes.Circle = define ({ /* */ }); com.davidflanagan.shapes.Rectangle = define({ /* */ }); com.davidflanagan.shapes.Triangle = define ({ /* */});
10.1.3. ( ). , , , . , . , , , . , , .
, , :(function() { // . // // // , // . })( ); // .
. . JavaScript : HTML , . , . , , HTML JavaScript , , . ( Java Script 13.1.5), , HTML JavaScript . , , . 10.5 , . onload, . ( 17.)
10.2. , com.davidflanagan.Class, , com.davidflanagan.Class.define(). , , . JavaScript , . , com.davidflana gan.Class :// . var define = com.davidflanagan.Class.define;
, .
. , , , . , , . : define . , , . :var defineClass = com.davidflanagan.Class.define;
. , , , defineClass(), define(). , . :// . // , . . , , . var Class = {}; // . Class.define = com.davidflanagan.Class.define;
, . : , , . , , , . , , . , Class.define() , , com.davidflanagan.Class.counter . , :// . // , . Class.counter = com.davidflanagan.Class.counter;
, , :// , com.davidflanagan.Class.counter = 0; // , com.davidflanagan.Class.getCounter = function() { return com.davidflanagan.Class.counter; }
, , .
. getCounter(). JavaScript , counter, , getCounter() . , . , , , . ( , 10.2.2.)
10.2.1. , , . , , . JavaScript , , . , . . , . , , . , , . getCounter(), , counter , _counter. , . , JSAN, . , . JSAN JSAN , , , .
10.2.2. 8.8 , , .1 1
. 8, , .
, . , , . . , , . , . , , . , , . , , . 10.4. , . 10.4. // . // . var com; if (!com) com = {}; if (!com.davidflanagan) com.davidflanagan = {}; com.davidflanagan.Class = {}; // . // , // , . // // com.davidflanagan.Class // : , // . (function( ) { // // function define(data) { counter++; /* */ } function provides(o, c) { /* */ } // , . // var counter = 0; // // , function getCounter( ) { return counter; } // , , // , , // var ns = com.davidflanagan.Class; ns.define = define; ns.provides = provides;
ns.getCounter = getCounter; })( ); //
10.3. , . Module.createNamespace() . :// Module.createNamespace("com.davidflanagan.Class"); // com.davidflanagan.Class.define = function(data) { /* */ }; com.davidflanagan.Class.provides = function(o, c) { /* */ };
Module.require() ( ) , . :// Complex , Class Module.require("com.davidflanagan.Class", 1.0);
Module.importSymbols() . :// Module // importSymbols Module.importSymbols(Module); // , // , // Complex importSymbols(com.davidflanagan.Complex); // com.davidflanagan.Class.define() Class var Class = {}; importSymbols(com.davidflanagan.Class, Class, "define");
, Module.registerInitializationFunction() , .1 JavaScript, , . ( ) , Modu le.runInitializationFunctions(). Module 10.5. , . .1
17.6.
10.5. /** * Module.js: * * , * JSAN. * Module. */ // , var Module; if (Module && (typeof Module != "object" || Module.NAME)) throw new Error(" 'Module' "); // Module = {}; // Module.NAME = "Module"; // Module.VERSION = 0.1; // // , // . // , Module.EXPORT = ["require", "importSymbols"]; // , . // , , // . Module.EXPORT_OK = ["createNamespace", "isDefined", "registerInitializationFunction", "runInitializationFunctions", "modules", "globalNamespace"]; // Module.globalNamespace = this; // // Module.modules = { "Module": Module };// Module [name] >namespace. /** * * * . * * , . * * NAME . * version, VERSION. * * Module.modules */ Module.createNamespace = function(name, version) { // . // // .
if (!name) throw new Error("Module.createNamespace(): "); if (name.charAt(0) == '.' || name.charAt(name.length 1) == '.' || name.indexOf("..") != 1) throw new Error("Module.createNamespace(): : " + name); // var parts = name.split('.'); // // , . var container = Module.globalNamespace; for(var i = 0; i < parts.length; i++) { var part = parts[i]; // , // . if (!container[part]) container[part] = {}; else if (typeof container[part] != "object") { // , , var n = parts.slice(0,i).join('.'); throw new Error(n + " , "); } container = container[part]; } // , , , . var namespace = container; // // // if , , NAME. (namespace.NAME) throw new Error(" "+name+" ");
// namespace.NAME = name; if (version) namespace.VERSION = version; // Module.modules[name] = namespace; // return namespace; } /** * , . * true, , false . */ Module.isDefined = function(name) { return name in Module.modules; }; /** * , * . * , , * . * , , , .
*/ Module.require = function(name, version) { if (!(name in Module.modules)) { throw new Error(" " + name + " "); } // , if (!version) return; var n = Module.modules[name]; // , , // , . if (!n.VERSION || n.VERSION < version) throw new Error(" " + name + " " + n.VERSION + " " + version + " ."); }; /** * . * , * . * * , * EXPORT . , EXPORT_OK * , from. * * , * * , . * EXPORT EXPORT_OK, * , . */ Module.importSymbols = function(from) { // , . // , if (typeof from == "string") from = Module.modules[from]; if (!from || typeof from != "object") throw new Error("Module.importSymbols(): " + " "); // // , , // . var to = Module.globalNamespace; // var symbols = []; // var firstsymbol = 1; // // , if (arguments.length > 1 && typeof arguments[1] == "object") { if (arguments[1] != null) to = arguments[1]; firstsymbol = 2; } // for(var a = firstsymbol; a < arguments.length; a++)
symbols.push(arguments[a]); // , , // , . if (symbols.length == 0) { // EXPORT, . if (from.EXPORT) { for(var i = 0; i < from.EXPORT.length; i++) { var s = from.EXPORT[i]; to[s] = from[s]; } return; } // , EXPORT_OK , // else if (!from.EXPORT_OK) { for(s in from) to[s] = from[s]; return; } } // , . // EXPORT / EXPORT_OK, // , , // . , // . var allowed; if (from.EXPORT || from.EXPORT_OK) { allowed = {}; // . // . if (from.EXPORT) for(var i = 0; i < from.EXPORT.length; i++) allowed[from.EXPORT[i]] = true; if (from.EXPORT_OK) for(var i = 0; i < from.EXPORT_OK.length; i++) allowed[from.EXPORT_OK[i]] = true; } // for(var i = 0; i < symbols.length; i++) { var s = symbols[i]; // if (!(s in from)) // throw new Error("Module.importSymbols(): " + s + " "); if (allowed && !(s in allowed)) // , throw new Error("Module.importSymbols(): " + s + " " + " ."); to[s] = from[s]; // } }; // // . Module.registerInitializationFunction = function(f) {
// Module._initfuncs.push(f); // onload , . Module._registerEventHandler(); } // . // JavaScript . // . Module.runInitializationFunctions = function() { // , , // . for(var i = 0; i < Module._initfuncs.length; i++) { try { Module._initfuncs[i](); } catch(e) { /* */} } // , . . . Module._initfuncs.length = 0; } // , Module._initfuncs = []; // , // onload, // . // . Module._registerEventHandler = function() { var clientside = // "window" in Module.globalNamespace && "navigator" in window; if (clientside) { if (window.addEventListener) { // W3C DOM window.addEventListener("load", Module.runInitializationFunctions, false); } else if (window.attachEvent) { // IE5+ window.attachEvent("onload", Module.runInitializationFunctions); } else { // IE4 , onload, // . window.onload = Module.runInitializationFunctions; } } // , // . Module._registerEventHandler = function() {}; }
, . RegExp JavaScript , String RegExp , .1 JavaScript ECMAScript v3. Java Script 1.2 , ECMAScript v3, JavaScript 1.5. JavaScript Perl. , , JavaScript 1.2 Perl 4, JavaScript 1.5 Perl 5. , . String RegExp, .
11.1. JavaScript RegExp. RegExp RegExp(), . , , , , (/). , JavaScript , :1
. , , , , , ! regexp, RE.
var pattern = /s$/;
RegExp pattern. RegExp , s. ( .) RegExp():var pattern = new RegExp("s$");
RegExp , RegExp() . . JavaScript , Perl, Perl , , JavaScript. . , , , . /java/ , "java". , . , /s$/ . , s, . , $, , . , , s. , JavaScript . , , Perl, OReilly Programming Perl (Larry Wall), (Tom Christiansen) (Jon Orwant).1 OReilly Mastering Regular Expressions (Jeffrey E. F. Friedl).2
11.1.1. , . JavaScript , (\).3 , \n . . 11.1.1
2
3
, , Perl, 3 . . . : , 2002. , 3 . . . : , 2008. . . . .
11.1.
\0 \t \n \v \f \r \xnn \uxxxx \cX NUL (\u0000) (\u0009) (\u000A) (\u000B) (\u000C) (\u000D) Latin, nn; , \x0A , \n Unicode , xxxx; , \u0009 , \t
^X; , \cJ \n
:^ $ . * + ? = ! : | \ / ( ) [ ] { }
. , . , , , . 1, @, . , \, . , , , , \. , , , . , , : /\\/.
11.1.2. . , . , /[abc]/ a, b c. 1
. . . .
, , , . ^ , . /[^abc]/ , a, b c. . /[a z]/, Latin /[a zA Z0 9]/. , JavaScript (escape) . , \s , (whitespaces) Unicode, \S , Unicode. . 11.2 . ( : ASCII Unicode . Unicode , , /[\u0400 \04FF]/ .) 11.2. [...] [^...] . \w \W \s \S \d \D [\b] , , , Unicode ASCII . [a zA Z0 9_] , ASCII . [^a zA Z0 9_] Unicode , Uni code. : \w \S ASCII . [0 9] , ASCII . [^0 9] ( )
: . \s , \d , , /[\s\d]/ . . , \b . , . , , : /[\b]/.
11.1.3. , /\d\d/ /\d\d\d\d/, , , , , , . , , . , , , . , . , + . . 11.3 . 11.3. {n,m} {n,} {n} ? + *a
, n, m , n n ; . {0,1} . {1,} .a {0,}
?, * , : . ? * .
:/\d{2,4}/ /\w{3}\d?/ /\s+java\s+/ /[^"]*/ // // // // // // , "java" ,
* ?. , , . , /a*/ "bbbb", a!
11.1.3.1. , . 11.3, , . , . JavaScript 1.5 ( Perl 5, JavaScript 1.2) , . ( ) : ??, +?, *? {1,5}?. , /a+/ a. "aaa", . /a+?/ a . , a. . /a*b/, a, b. "aaab", . /a*?b/. b, a. "aaab" b. , . , , . , , .
11.1.4. , , . | . , /ab|cd|ef/ ab, cd, ef, /\d{3}|[a z]{4}/ , . : , . , , . ab /a|ab/, . . , |, *, +, ? . , /java(script)?/ java, script, /(ab|cd)+|ef)/ ef, ab cd. .
, , , . ( , , .) , , . /[a z]+\d+/. , . (/[a z]+(\d+)/), . , . , . \. . , \1 , \3 . : , . , ([Ss]cript) \2:/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/
, , . , , . , . , (. . ):/['"][^'"]*['"]/
:/(['"])[^'"]*\1/
\1 . , , . , . , . . :/(['"])[^\1]*\1/
, /. JavaScript 1.5 ( JavaScript 1.2) . ( ) (?: ). , , :/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/
(?:[Ss]cript) , ?. , \2 , (fun\w*). . 11.4 , . 11.4. , | (...) . , . . , *, +, ?, | . . , , . . , , . , n. (, ). . , (?:, .
(?:...) \n
11.1.5. , . , \s . , . , \b \w ( ASCII ) \W ( ), ASCII .1 , \b, , , . , . . . , ^ $, . , JavaScript, , /^JavaScript$/. Java ( , JavaScript) /\sJava\s/, 2 . . , Java, , . 1
2
( ), \b . , . . . .
, , , , . \s ( ) \b. : /\bJava\b/. \B , . /\B[Ss]cript/ JavaScript postscript script Scripting. JavaScript 1.5 ( JavaScript 1.2) . (?= ), , , , . , JavaScript, , , /[Jj]ava([Ss]cript)?(?=\:)/. JavaScript JavaScript: The Definitive Guide, Ja va Java in a Nutshell, . . . (?!, , , . , /Java(?!Script)([A Z]\w*)/ Java, ASCII , Java Script. JavaBeans, Javanese, JavaScrip, JavaScript JavaScripter. . 11.5 . 11.5. ^ $ \b . . , . . \w \W \w . ( , [\b] .) , . . , p, . . , p.
\B (?=p)
(?!p)
11.1.6. , . .
, , . JavaScript 1.2 . i , , g , . . . . , java ( Java, JAVA . .), /\bjava\b/i. , g: /\bjava\b/gi. JavaScript 1.5 m, . , , , ^ $, , , . , /Java$/im java, Java\nis fun. . 11.6 . , g String RegExp, . 11.6. i g m , . , . . , . . ^ , $ .
11.1.7. Perl, JavaScript , ECMAScript v3 Perl 5. Perl, ECMAScript, : s ( ) x ( ); \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z \G; (? ')"); f1.document.write("");
/ :f1.document.write("");
XHTML CDATA .
13.2.7. JavaScript , ( ) , . , , JavaScript , ! , HTML . :
:
JavaScript, Microsoft , Internet Explorer. event for . event , for , (ID), , . , . IE, . , , .
13.3. HTMLJavaScript , , , HTML . . , , . JavaScript HTML ( ), . , , , , HTML , :
onclick. onclick JavaScript . , . ( ), JavaScript , . Java Script ,
, . JavaScript JavaScript HTML . , JavaScript . 17 , HTML , JavaScript . JavaScript HTML , JavaScript , . Java Script , src . JavaScript , . 17, . 17 , : onclick , , . , . onclick false, , , , ( ) ( Submit). onmousedown, onmouseup onclick, , . . onmouseover, onmouseout , . onchange , . , , , . onload . , (, ) . onload , , . . , .
1.3. HTML . : calculate(), .
13.4. JavaScript URL JavaScript URL javascript:. , URL JavaScript , JavaScript. URL , /* */, //. URL , , :javascript:var now = new Date(); ":" + now;
URL , JavaScript . HTML , , , . URL JavaScript JavaScript , , . :javascript:alert("Hello World!")
URL , JavaScript , . . , . javascript: URL . , URL . , void . URL javascript: :void 0;
, , URL , :javascript:window.open("about:blank"); void 0;
void URL , Window.open(), , , :[object Window]
URL javascript: , URL . . JavaScript HTML . javascript: HTML , URL . href . , JavaScript . URL javascript: , , onclick. ( , onclick URL javascript: HTML ; , .) URL javascript: action JavaScript . URL javascript: , Window.open() ( . 14), URL .
13.4.1. URL javascript: , JavaScript, (bookmarklet). . href , URL javascript:. JavaScript , : JavaScript
: , , , (//) . :
JavaScript
, , , , , , . . Firefox . JavaScript, , , . , bookmarklets. , .
13.5. JavaScript JavaScript HTML . , JavaScript JavaScript.
13.5.1. JavaScript , , . , , ( defer IE ). JavaScript . , defer, document.write() ( 15). , , , . , HTML , , . HTML . , . , . , onload . , , document.write() . , . document.write(). , , ( , 15)
, , . , , , , . document.write() , , . , IE defer . , , , onload.
13.5.2. onload , (, ) , onload JavaScript , onload Window. onload onload . JavaScript onload ( , 17). onload, , , , . onload , JavaScript . Java Script , , , , , onload. , . onload , , document.write(). , , , .
13.5.3. URL JavaScript , onload JavaScript . , , . URL JavaScript , , , , javascript: href.
, , , . , , . document.write() , , . , , , . , write() . ( 14.8.)
13.5.4. onunload , onunload, JavaScript . onunload onunload, , 17. onunload , onload . , JavaScript , onunload , , , . onunload . , .
13.5.5. Window , URL JavaScript Window. JavaScript . , , , . onload , , onload , . , , Window : , , . . , . , , , , , .
Window , JavaScript . Window , . Window , . , . JavaScript , , .
13.5.6. JavaScript JavaScript , JavaScript . JavaScript . , , . : , , . , , . , . . JavaScript . , , , . , , , .1 , , . , , , . , , , setTimeout() setInterval(), , (. 14).
1
, Firefox, . , , , .
13.5.7. JavaScript , , window.write(). , DOM 15, . , . JavaScript . , JavaScript , , , , ( , , ). , , , onload, JavaScript onload . , onload, 17.7. , , onload. onload. ( ) , . IE defer src, Firefox DOMContentLoad, , , . JavaScript , , ? JavaScript , , . , . , ( ) , onload. , , . , , .
13.6. , Ja vaScript , . , JavaScript ECMAScript v3. , , . , HTML , , CSS DOM. Ja vaScript, (Applicati on Programming Interface, API), JavaScript . , JavaScript. JavaScript . : Internet Explorer Windows Mac OS1; Firefox Windows, Mac OS Linux; Safari Mac OS Opera Windows, Mac OS Linux. , , , 27 , . , 27 , . , . , . JavaScript . , , . , JavaScript. , : http://www.quirksmode.org/dom/ (Piter Paul Koch). DOM W3C DOM. http://webdevout.net/browser_support.php (David Hammond). quirksmo de.org, ( 1
IE Mac OS , , IE Windows.
) . DOM HTML, CSS ECMAScript. , . , , .
13.6.1. JavaScript . , , , . Netscape Microsoft. API JavaScript, . , , . , Microsoft , , CSS DOM, . ( ), , Netscape Firefox, Microsoft . , , , . , , . , HTTP , Ajax ( . 20). Microsoft 7 Internet Explorer, CSS. IE 7 , , , . . , Safari Firefox , ( . 22). ( , , Microsoft ), WHATWG (whatwg.org), HTML DOM.
13.6.2. JavaScript , , . . , , , . ,
, . , , ( , IE). : Firefox 1.0, Firefox 1.5, IE 5.5, IE 6.0, Safari 2.0, Opera 8 Opera 8.5. , . , .
13.6.3. ( ) , . , , , , , . , , , . , . , 17 , :if (element.addEventListener) { // W3C element.addEventListener("keydown", handler, false); element.addEventListener("keypress", handler, false); } else if (element.attachEvent) { // IE element.attachEvent("onkeydown", handler); element.attachEvent("onkeypress", handler); } else { // element.onkeydown = element.onkeypress = handler; }
20 : , , ! . 20.1:// XMLHttpRequest, HTTP._factories = [ function() { return new XMLHttpRequest(); }, function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, function() { return new ActiveXObject("Microsoft.XMLHTTP"); } ]; // , HTTP._factory = null;
// XMLHttpRequest. // // , // , // . , // . HTTP.newRequest = function() { /* */ }
DOM, , , . DHTML , :if (document.getElementById) { // W3C DOM API, // DHTML , W3C DOM API } else if (document.all) { // IE 4 API, // DHTML , IE 4 API } else if (document.layers) { // Netscape 4 API, // DHTML (, ) // Netscape 4 API } else { // DHTML , // DHTML }
, W3C DOM document.getElementById(). , , , . , , , . , , . Microsoft addEventHandler(), W3C , , addEventHand ler() . document.all, , . document.all Microsoft IE 4. JavaScript . document.getElementById(). ( ) , , IE :if (document.all) { // IE } else {
// }
, document.all, Firefox , Firefox , IE. all , Firefox . , , Firefox docu ment.all, if , all , Firefox.if (document.all) alert("IE"); else alert("Firefox");
, , ! , , , . .
13.6.4. . , , , , W3C IE. , , , . , , ( ). Navigator, 14. , , (browser sniffer), (client sniffer). 14.3. , Netscape IE . , , . , , , User Agent, , JavaScript .
13.6.5. Internet Explorer , , , IE.
IE . , , IE JavaScript , . , HTML. , , . HTML . IE. IE 6 . < > HTML , IE , . , .
JavaScript IE, , C/C++, #ifdef/#endif. JavaScript IE /*@cc_on @*/. ( cc cc_on condition compilation, . . .) , IE:/*@cc_on @if (@_jscript) // JS , IE . alert("In IE"); @end @*/
@if, @else @end, , JavaScript IE . @if (@_jscript). JScript Java Script, Microsoft, @_jscript IE true. JavaScript , IE, :/*@cc_on @if (@_jscript)
// , // JavaScript . IE // , . alert(' Internet Explorer'); @else*/ // JavaScript , // IE. // , IE. alert(' Internet Explorer'); /*@end @*/
HTML JavaScript , IE.
13.7. , JavaScript . JavaScript : JavaScript , . , , , , . JavaScript , , JavaScript . , JavaScript , . ( , , , , JavaScript, , JavaScript .) JavaScript , . JavaScript , , Ja vaScript , ( ), JavaScript . , , ( ) , . , , , . , JavaScript . , , , , . 17, ,
, onmouseover onmousedown, JavaScript , , onfocus onchange. , . , . , JavaScript , . . , . , JavaScript , , .
13.8. JavaScript . JavaScript .
13.8.1. JavaScript JavaScript , JavaScript . , , , , . JavaScript , . , JavaScript . File JavaScript . . , JavaScript HTTP FTP , . JavaScript . , . , . , : JavaScript , , ,
, , . JavaScript , . self.close(), . JavaScript , , . ( , . .) ( 100 ) . , . , ; , , , . , , , , . value HTML FileUpload . , (, ). , , . , . , ( , ) . (same origin policy) .
13.8.2. , JavaScript . , , , . JavaScript . , , ( , JavaScript , 14.8).
, HTTP XMLHttpRequest. JavaScript , , HTTP , , , ( XMLHttpRequest 20). , URL , . , , . , , . , , HTTP, , HTTPS, . , : , . , A ( src ) B. . B, . C ( A), . , , , , Document ( . 15). , . (, Firefox 1.0 history.back() , IE 6 .) , , , , . , , . , . (, , ) , . . . . , . , home.example.com , developer.example.com, orders.exam ple.com catalog.exam ple.com. , domain: Document. domain
, . , . , domain "home.example.com", "examp le.com", "home.example" "ample.com". , do main , , , "com" . ( ) , domain, , . , , orders.example.com catalog.example.com, docu ment.domain "example.com", .
13.8.3. ActiveX JavaScript , , , . JavaScript , ActiveX IE . . 20 , HTTP ActiveX, 19 22 Java Flash. , ActiveX Java , , . Java , , ; . : , , . Java Flash, , JavaScript . ActiveX . IE ActiveX, Windows . .
13.8.4. (cross site scripting), XSS, , HTML
. XSS , . , JavaScript , XSS . XSS , , HTML . , JavaScript , : var name = decodeURIComponent(window.location.search.substring(6)) || ""; document.write(" " + name);
window.location.search.substring, , ?. document.write() . , URL :http://www.example.com/greet.html?name=
. , URL :http://www.example.com/greet.html?name=%3Cscript%3Ealert('')%3C/script%3E
URL ( %3C %3E )! , . :http://siteA/greet.html?name=%3Cscript src=siteB/evil.js%3E%3C/script%3E
, . B ( C) ( ) A, B. evil.js B, A , A. (, , ). A. , cookies, A ( ), B. B. XSS HTML , . greet.html, , , :
name = name.replace(//g, ">");
, . , . , . CERT Advisory: http://www.cert.org/ad visories/CA 2000 02.html.
13.8.5. , . JavaScript , alert(), , , , kill Unix Windows, . . ( Firefox) . , window.setInterval(). , . . , . . !
13.9. JavaScript JavaScript JavaScript, . , , JavaScript: , HTML , . , . Firefox Greasemonkey (http://greasemonkey.mozdev.org). , , , .
, Greasemonkey, JavaScript JavaScript . SVG SVG (Scalable Vector Graphics ) XML , JavaScript . , JavaScript HTML , . Ja vaScript , SVG , XML . , 15 17, SVG, , SVG HTML . SVG http://www.w3.org/TR/ SVG. B DOM SVG. 22 JavaScript , HTML SVG HTML . JavaScript SVG , JavaScript , JavaScript , SVG. XUL XUL (XML User interface Language) XML , . Firefox XUL . SVG, XUL Ja vaScript . SVG, , 15 17, XUL, JavaScript XUL , , Java Script . XUL http://www.mozilla.org/ projects/xul http://www.xulplanet.com. ActionScript ActionScript , JavaScript ( ECMAScript, ) Flash . JavaScript ActionScript . Flash XML, HTML, Flash . 19, 22 23 , , Ja vaScript Flash . ActionScript , JavaScript ActionScript .
13 Window , JavaScript . , Window JavaScript . Window, , . , : JavaScript URL , , URL , , , JavaScript , , JavaScript ,
, , , . JavaScript , , , . ,
(. 15), . , , , , , . , , . , , . , . . , JavaScript , , .
14.1. . JavaScript , JavaScript setTimeout(), clearTimeout(), setInterval() clearIn terval(). Win dow, , Window , . setTimeout() Window . setTimeout() , clearTimeout(), . setInterval() setTimeout(), , . setTimeout(), setInterval() , clearIn terval(), . setTimeout() setInterval() , JavaScript . ( ) . , IE 4, , JavaScript . setTimeout() setInterval() . , , setTimeout(). , clearTimeout(). setTimeout() 14.7. ,
, setInterval(), , . 14.4 14.6. , setTime out(), , 0 . , . setTimeout() , , , . (. 17), (. 15), , , . , Window.
14.2. Location History Location History . URL ( ) .
14.2.1. URL location ( ) Location URL , . href Location , URL . toString() Location href, location.href location. , protocol, host, pathname search, URL ( Location ). search Location . URL , , , . URL . URL URL . CGI , , , , JavaScript . 14.1 getArgs(), search URL . 14.1. URL /* * URL * name=value . * . :
* * var args = getArgs(); // URL * var q = args.q || ""; // , , * // * var n = args.n ? parseInt(args.n) : 10; */ function getArgs( ) { var args = new Object(); var query = location.search.substring(1); // var pairs = query.split("&"); // for(var i = 0; i < pairs.length; i++) { var pos = pairs[i].indexOf('='); // "name=value" if (pos == 1) continue; // var argname = pairs[i].substring(0,pos); // var value = pairs[i].substring(pos+1); // value = decodeURIComponent(value); // , args[argname] = value; // } return args; // }
14.2.2. , location Window Location, . URL URL . , URL location :// Document.getElementById, // , . if (!document.getElementById) location = "staticpage.html";
, URL , location , . URL , , , . 14.7, , location. , Window , . , URL location . Location , . reload() . replace() URL . URL URL location . replace(), URL URL , . , replace(),
, URL location. , (, ), replace() , . , location Window, Location, location Document, , Location. document.location docu ment.URL, (. . ). document.location location.href. , document.location URL , location.href URL .
14.2.3. History history Window History . History URL . ; , , , . History . , History . back() forward() ( ), . , . , go(), ( ) () . back() forward() History 14.7 . Netscape Mozilla back() forward() Window. , . win dow.back() history.back().
14.3. Window, Screen Navigator , , . Window, Screen Navigator, , , . .
14.3.1. ( Internet Explorer) Window, :// var windowWidth = window.outerWidth; var windowHeight = window.outerHeight; // var windowX = window.screenX var windowY = window.screenY // , // . , // , .. var viewportWidth = window.innerWidth; var viewportHeight = window.innerHeight; // // // , var horizontalScroll = window.pageXOffset; var verticalScroll = window.pageYOffset;
: . , , , . , , , . . . HTML . ( ), , . 15 16. , Window, , Internet Explorer. , IE, HTML . , IE 6, document.documentElement, document.body. 14.2. Geometry , , . 14.2. /** * Geometry.js: *
* * * * getWindowX/Y() : * getViewportWidth/Height() : * getDocumentWidth/Height() : * getHorizontalScroll() : * getVerticalScroll() : * * : * , getWindowWidth/Height() * * : , */ var Geometry = {}; if (window.screenLeft === undefined) { // IE Geometry.getWindowX = function() { return window.screenLeft; }; Geometry.getWindowY = function() { return window.screenTop; }; } else if (window.screenX) { // Firefox Geometry.getWindowX = function() { return window.screenX; }; Geometry.getWindowY = function() { return window.screenY; }; } if (window.innerWidth) { // , IE Geometry.getViewportWidth = function() { return window.innerWidth; }; Geometry.getViewportHeight = function() { return window.innerHeight; }; Geometry.getHorizontalScroll = function() { return window.pageXOffset; }; Geometry.getVerticalScroll = function() { return window.pageYOffset; }; } else if (document.documentElement && document.documentElement.clientWidth) { // IE 6 DOCTYPE Geometry.getViewportWidth = function() { return document.documentElement.clientWidth; }; Geometry.getViewportHeight = function() { return document.documentElement.clientHeight; }; Geometry.getHorizontalScroll = function() { return document.documentElement.scrollLeft; }; Geometry.getVerticalScroll = function() { return document.documentElement.scrollTop; }; } else if (document.body.clientWidth) { // IE4, IE5 IE6 DOCTYPE Geometry.getViewportWidth = function() { return document.body.clientWidth; }; Geometry.getViewportHeight = function() { return document.body.clientHeight; }; Geometry.getHorizontalScroll = function() { return document.body.scrollLeft; }; Geometry.getVerticalScroll = function() { return document.body.scrollTop; }; } // .
// , . if (document.documentElement && document.documentElement.scrollWidth) { Geometry.getDocumentWidth = function() { return document.documentElement.scrollWidth; }; Geometry.getDocumentHeight = function() { return document.documentElement.scrollHeight; }; } else if (document.body.scrollWidth) { Geometry.getDocumentWidth = function() { return document.body.scrollWidth; }; Geometry.getDocumentHeight = function() { return document.body.scrollHeight; }; }
14.3.2. Screen screen Window Screen, . width height . , , , . availWidth availHeight ; , , . Firefox ( IE) Screen availLeft availTop. . , , , ( ), . Screen 14.4 .
14.3.3. Navigator navigator Window Navigator, , . Navigator Netscape Navigator, Internet Explorer. ( , IE clientInformation navigator. , .) Navigator Internet Explorer Netscape. , . . . . , (, ). , , ( 17).
if (window.addEventListener) { // addEventListener() , . // , // Netscape, Mozilla Firefox. } else if (window.attachEvent) { // , attachEvent(), . // IE . } else { // . // , DHTML. }
. , . Navigator . Navigator , : appName . IE "Microsoft Internet Explorer", Firefox , Netscape ( Mozilla Netscape), "Netscape". appVersion / . : , , . , Netscape 6 Mozilla Firefox 5.0. , IE 4 6 4.0, 4 . userAgent , HTTP USER AGENT. , app Name appVersion, . , , . appCodeName . Netscape Mozilla. IE . platform , . JavaScript 1.2.
. 14.1. Navigator
JavaScript Navi gator :var browser = " :\n"; for(var propname in navigator) { browser += propname + ": " + navigator[propname] + "\n" } alert(browser);
, . 14.1, IE 6. . 14.1, Navigator , , . , appVersion. Navigator parseInt() String.indexOf(). 14.3 , Navigator browser. , navigator. (client sniffer), . (, http://www.mozilla.org/docs/web developer/ sniffer/browser_type.html.) . 14.3. /** * browser.js: * * "browser", * , "navigator". */ var browser = { version: parseInt(navigator.appVersion), isNetscape: navigator.appName.indexOf("Netscape") != 1,
isMicrosoft: navigator.appName.indexOf("Microsoft") != 1 };
, : Navigator . , Firefox 1.0 appName "Net scape", appVersion 5.0. Safari, Mozilla, ! IE 6.0 appCodeName "Mozilla", appVersion 4.0. : , , , . , , .
14.4. Window , . , , , , . , .
14.4.1. open() Window. window.open() , , . . open() 1, , . JavaScript , ( ) , . open() Window, . open() URL , . ( null ), . open() . , target . , open() , .1
, Mozilla Firefox. . . .
open() , . , , , , . . , . , , , , , JavaScript :var w = window.open("smallwin.html", "smallwin", "width=400,height=350,status=yes,resizable=yes");
: , . Window.open() . , , , . , , ; , . , , open(). open() , . , , URL , , (true) (false). . open() Window, . JavaScript , Window , . ? Java Script ? opener Window , . , JavaScript , opener null.
14.4.2. open() close(). Window, :w.close();
JavaScript , , :window.close();
window close() Window close() Document. , JavaScript .
, ( ) . , . Window . , closed. true, . , , , , , , .
14.4.3. Window , . , , . , JavaScript , , . , , , . , . moveTo() . moveBy() , . resizeTo() re sizeBy() . .
14.4.4. focus() blur() . focus() , blur() . , focus() , , . window.open(), . , open() . open() focus().
14.4.5. Window , . scrollBy() , , scrollTo() . ,
. HTML (. 15) , offsetLeft offsetTop, X Y ( 16.2.3 , ). , scrollTo() , . focus() (, ), . , . : , , , . : scrollIntoView() HTML . , , , , . scrollIntoView() , focus(), HTML , , . . , . hash Location. , top , :window.location.hash = "#top";
. , , , . , , . ( ) , Location.replace():window.location.replace("#top");
14.4.6. Window 14.4 open(), close() moveTo() Window, .
setInterval() , . Screen . 14.4. var bounce = { x:0, y:0, w:200, h:200, // dx:5, dy:5, // interval: 100, // win: null, // timer: null, // setInterval() // start: function() { // bounce.x = (screen.width bounce.w)/2; bounce.y = (screen.height bounce.h)/2; // , // URL javascript: // bounce.win = window.open('javascript:"!"', "", "left=" + bounce.x + ",top=" + bounce.y + ",width=" + bounce.w + ",height=" +bounce.h+ ",status=yes"); // setInterval() nextFrame() // . // , // clearInterval(). bounce.timer = setInterval(bounce.nextFrame, bounce.interval); }, // stop: function() { clearInterval(bounce.timer); if (!bounce.win.closed) bounce.win.close(); },
// //
// . setInterval() nextFrame: function() { // if (bounce.win.closed) { clearInterval(bounce.timer); return; } // , if ((bounce.x+bounce.dx > (screen.availWidth bounce.w)) || (bounce.x+bounce.dx < 0)) bounce.dx = bounce.dx; // , if ((bounce.y+bounce.dy > (screen.availHeight bounce.h)) || (bounce.y+bounce.dy < 0)) bounce.dy = bounce.dy;
// bounce.x += bounce.dx; bounce.y += bounce.dy; // bounce.win.moveTo(bounce.x,bounce.y); // bounce.win.defaultStatus = "(" + bounce.x + "," + bounce.y + ")"; } }
14.5. Window . alert() , . confirm() OK . prompt() . , , . , , . , , alert(), confirm() prompt(), . , , . JavaScript alert() , ( 15.9). : , , . , . JavaScript , alert(), confirm() prompt(). , , ; JavaScript , , , . confirm() prompt() , . . , .1 , , 1
. . . .
. 14.2. confirm()
, , , , . : , , . alert() . confirm() 14.5, , . 14.2. 14.5. confirm()function submitQuery() { // , . // // . var message = "\n\n\n\n" + "_________________________________________________\n\n" + " , ,\n" + " .\n" + "_________________________________________________\n\n\n" + " OK, ,\n" + " , ."; // // , if (!confirm(message)) return; /* , */ }
14.6. , . , , , URL , . , , status.
, . :? .
, JavaScript onmouseover. status true, , , ( URL ). . (, ), status . Window defaultStatus, , ( , URL ). (, Firefox 1.0 default Status , status). defaultStatus . , , defaultSta tus setInterval(), , . , . , setInterval(), 14.6. 14.6. , var WastedTime = { start: new Date( ), // displayElapsedTime: function() { var now = new Date(); // // var elapsed = Math.round((now WastedTime.start)/60000); // window.defaultStatus = " " + elapsed + " ."; } } // setInterval(WastedTime.displayElapsedTime, 60000);
14.7. onerror Window . , ,
. ( : onerror(), . . onerror Window. oner ror() IE .) . , . , self myname . , URL JavaScript , . , . . , . JavaScript 1.5 on e