Д. Флэнаган - javascript (Резанное)

901
Введение в JavaScript JavaScript – это интерпретируемый язык программирования с объектноориен тированными возможностями. С точки зрения синтаксиса базовый язык 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.

Upload: mcleon-leon

Post on 28-Jul-2015

268 views

Category:

Documents


6 download

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