Академический Документы
Профессиональный Документы
Культура Документы
OREILLY* Ifxnoof. p r e s s
High Performance
JavaScript
Nicholas Zakas
REILLY*
JavaScript
-'
20J2
JavaScript.
.
.
.
.
.
.
.
-. 199034, -, 16 , 7,
. (812) 380-5007, www.symbol.ru. N 000054 25.12.98.
26.06.2012. 70x100 V16*
. 16 . . 2457.
Konica Minolta
, . -, . 1, . 6
.: (495) 926-63-96, www.bukivedi.com.info@ bukivedi.com
- ,
, -
........................................................................................................
1. ................................................................................. 21
...............................................................................22
................................................................................... 24
............................................................26
.................................................................................26
sc rip t................................................................ 27
XMLHttpRequest.............................31
.............................32
......................................................................................................36
2. ............................................................................................. 37
.................................................................. 38
. . . .39
...........................41
............................................. 44
..........................................................46
, ............................................. 47
................................................................................................. 50
................................................................................................... 50
...................................................................................52
....................................................................................... 54
............................................... 55
......................................................................................................57
3. D O M .................................................................................58
DOM ........................................................................ 58
.................................................................... 59
DOM ................................................... 59
innerHTML DOM.............................61
.....................................................................................65
HTML-......................................................................................... 66
DOM ....................................................................................... 71
............................................................75
?........................................................75
. . . . 76
.......................................................................................78
............................................. 81
............................................................................ 82
IE :hover..................................................................................................... 82
................................................................83
..................................................................................................... 85
4. .............................. 87
.................................................................................................................. 87
................................................................................................. 88
...................................................................... 89
..................................................................94
.......................................................................................95
if-else sw itch.......................................................................... 95
if- e ls e ............................................................97
.....................................................................................99
............................................................................................................ 101
................................................101
............................................................ 103
......................................................................................................104
................................................................................................105
....................................................................................................108
5. ..........................................................109
....................................................................................... 110
(+) - (+ = )..................................................110
.................................................................... 113
String.prototype.concat()...........................................................................115
......................................................116
..................................................117
......................................................................................................118
.............................................................................121
.................................127
...........................................................................127
.................. 131
................................................................................................. 132
.............................132
.......................... 135
.................................................................................136
....................................................................................................138
6. ...........................................................................139
................ 139
............................................................................. 141
- ?.................................................................143
............................................................................... 145
....................................................................................... 145
....................................................................................... 148
........................................... 148
....................................................................................... 150
................................. 152
.............................................................. 154
.......................................................................155
........................................... 155
........................ 156
.......................................................................157
................................................................ 157
....................................................................................................159
7. A jax...................................................................................................................... 160
............................................................................................. 160
............................................................................................161
....................................................................................... 168
..............................................................................................171
XM L.............................................................................................................. 171
JSON.............................................................................................................. 175
HTML............................................................................................................ 179
............................................................ 181
...................................184
Ajax...................... 185
...............................................................................185
Ajax........................ 188
................................................................................................... 189
8. .....................................................................191
..............................................191
/......................................... 193
...................................194
...............................................................................195
................................................... 196
.................................................................. 197
...................................................................................197
.................................................................................. 200
................................................................................................... 202
10
9.
JavaScript .............................................................................. 203
Apache A n t ....................................................................................................... 204
JavaScript-..................................................................205
JavaScript-...................................... 206
JavaScript-............................................................. 209
.................. 211
JavaScript-...................................................................... 211
JavaScript-................................................................213
, .......................................214
.............................. 215
JavaScript-pecypcoB............................................................215
JavaScript-............................................... 216
................................................................................................... 218
10. ................................................................................................. 219
JavaScript-..................................................... 220
YUI P ro filer......................................................................................................221
.....................................................................................225
F ireb u g ..............................................................................................................226
..................................................... 227
........................................................... 228
N e t ................................................................................................. 229
Internet Explorer .................................... 230
- S a fa ri..................................................................233
Profiles...........................................................................................233
Resources.......................................................................................236
Chrome....................................................... 237
.............................. 238
Page Speed......................................................................................................... 239
Fiddler................................................................................................................ 241
YSlow..................................................................................................................243
dynaTrace Ajax Edition.................................................................................. 245
................................................................................................... 248
.................................................................................. 249
1996 Netscape Navigator
JavaScript, .
,
. -
. -,
, .
JavaScript
-.
, ,
, JavaScript
.
. ,
, , 30-60 ,
, , -
. , Java
Script .
. , ,
.
,
.
-
.
. , JavaScript.
, ,
, .
, JavaScript,
, ,
. Internet Explorer 4 HTML (-
12
)
, JavaScript
.
(Document Object Model, DOM),
HTML, In
ternet Explorer 5, Netscape 6 Opera.
-262.
, DOM ( )
JavaScript, -.
API,
JavaScript, JavaScript,
, .
-
JavaScript
JavaScript, 1996
.
JavaScript ,
JavaScript.
Internet Explorer 6,
,
- - .
, IE6 ,
, . -, 2001 ,
IE6,
JavaScript, , 2005 .
JavaScript IE6,
. ,
,
. - ,
,
.
: - ,
JavaScript .
,
.
, -
.
13
,
.
,
,
. ,
, ,
.
, .
JavaScript
,
.
JavaScript
JavaScript 2008 . Google ,
Chrome. ,
JavaScript
V8. JavaScript V8
(Just-In-Time, JIT),
JavaScript
.
JavaScript.
Java
Script. Safari 4 JIT- JavaScript
Squirrel Fish Extreme ( Nitro),
a Firefox 3.5 - TraceMonkey,
.
JavaScript
, . -
. .
, JavaScript ,
. ,
, ,
14
. ,
, ,
, -
-
.
JavaScript
,
.
, ,
JavaScript,
, , DOM,
. ,
(ECMAScript),
JavaScript,
.
JavaScript
. DOM, ,
, JavaScript .
,
JavaScript.
JavaScript. , 1,
JavaScript-
. 2 -8
,
. 9
JavaScript-
, 10
, ,
.
:
3 DOM, (Stoyan Stefanov)
5 , (Steven
Levithan)
7 Ajax, (Ross Harmes)
9
JavaScript, (Julien Lecomte)
10 , (Matt Sweeney)
15
-,
-.
,
.
JavaScript
1
- JavaScript .
JavaScript
.
,
, .
,
JavaScript.
,
,
.
2 , JavaScript-
. ,
, , ,
, ,
.
3 DOM (Stoyan Stefanov),
-. , -
DOM JavaScript.
, DOM,
,
.
4 ,
,
, ,
. ,
, ,
.
- ,
5
(Steven Levithan),
. -
16
,
,
.
6
. JavaScript-
, .
,
.
7 Ajax (Ross Harmes)
.
,
Ajax
XMLHttpRequest .
8
,
JavaScript.
JavaScript- ,
.
. 9
JavaScript (Julien Lecomte)
,
.
, ,
HTTP .
JavaScript- -
.
(Matt Sweeney)
10 . , JavaScript
,
HTTP,
.
-
JavaScript,
-.
17
,
, .
,
,
, ,
, .
,
.
,
, .
,
.
.
.
.
,
. ,
, .
-
OReilly. ,
.
.
,
.
18
b a ta
, ,
:
OReilly Media
1005 Gravenstein Highway N orth
Sebastopol, CA 95472
800-998-9938 ( )
707-829-0515 ()
707-829-0104 ()
,
:
http://www.oreilly.com/catalog/9780596802790
19
:
bookquestions@oreilly.com
, ,
OReilly :
http://www.oreilly.com
:
(Matt Sweeney), (Stoyan Stefanov),
(Steven Levithan), (Ross Harmes)
(Julien Lecomte).
, - .
,
, (Steve Souders), (Tenni Theurer)
(Nicole Sullivan). ,
-,
.
, ,
(Ryan Grove), (Oliver Hunt), (Matthew Russell), (Ted Roden),
(Remy Sharp) (Venkateswaran Udayasankar). ,
.
OReilly Yahoo!,
. Yahoo! ,
2006 , Yahoo! Press
.
JavaScript , ,
,
. JavaScript,
, JavaScript- .
JavaScript ,
-
. JavaScript-,
.
, <script>
, ,
. ,
, -
. ,
.
document.write()
( ).
:
<html>
<head>
<title>Script Example</title>
</head>
<body>
<P>
<script type="text/javascript">
document.write("The date is " + (new Date()).toDateString());
</script>
</p>
22
1.
</body>
</html>
HTML 4 , <script> HTML-
<head> <body>
. <script>,
JavaScript-,
<head> <link>, CSS-,
. ,
,
. :
<html>
<head>
<title>Script Example</title>
<-- -->
<script type=text/javascript" src="file1.js"x/script>
<script type=text/javascript" src="file2. js"x/script>
<script type=,,text/javascript" src="file3. js"x/script>
clink rel=stylesheet" type="text/css" href="styles.css">
</head>
<body>
<p>Hello world!</p>
</body>
</html>
23
,
, : <head>
JavaScript-, .
<script>
,
. ,
,
<body>. ,
, ,
, -
-
. , ,
, ,
. . 1.1 ,
.
filel.js
Q ]
__
|
| ^
file2.js
1. . \
file3.js
styles.css
. 1.1. JavaScript-
. 1.1 .
JavaScript- .
filel.js
file2.js.
filel.js.
,
. ,
, .
.
Internet Explorer 8, Firefox 3.5, Safari 4 Chrome 2
JavaScript.
, <script> <script>
. , , JavaScript , .
, ,
JavaScript-,
24
1.
. ,
.
.
,
<script>
<body>, . :
<html>
<head>
<title>Script Example</title>
<link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<p>Hello world!</p>
<-- -->
<script type="text/javascript" src="file1.js,,></script>
<script type="text/javascript" src="file2.js"x/script>
<script type=text/javascript" src="file3.js"x/script>
</body>
</html>
<script>
HTML-.
,
,
. , Yahoo!
Exceptional Performance, JavaScript-:
.
<script>
,
<script> . ,
. HTML <script>,
;
.
, (Steve Souders) ,
, <link>,
___I-4. ,
.
,
.
<link>.
25
JavaScript-. HTTP-
, 100
,
25 .
, .
- -
JavaScript-.
,
<script>.
( 9)
, ,
Yahoo!.
Yahoo!
Yahoo! User Interface (YUI)
(Content Delivery Network, CDN).
-
YUI, URL-
. , URL-
: http://yui.yahooapis.com/combo?2.7.0/build/yahoo/yahoomin.js&2.7.0/build/event/event-min.js.
URL- 2.7.0
yahoo-min.js event-min.js.
URL-. <script> (
) <script>,
:
<html>
<head>
<title>Script Example</title>
clink rel='stylesheet" type="text/css" href="styles.css>
</head>
<body>
<p>Hello world!</p>
<-- -->
<script type="text/javascript" src="
http://yui.yahooapis.com/combo?2.7.O/build/yahoo/yahoo-min.js&
2.7.0/build/event/event-min.js "></script>
</body>
</html>
,
<script>, JavaScript-,
JavaScript.
26
1.
JavaScript
( HTTP-, )
,
.
HTTP- -
-.
,
,
.
,
,
HTTP-. ,
, .
,
.
, ,
load window.
.
HTML 4
<script> defer. defer , ,
, DOM,
. defer
Internet Explorer 4+ Firefox 3.5+,
.
defer <script> (
) . ,
.
:
<script type="text/javascript" src="file1.js" deferx/script>
27
, defer
:
<html>
<head>
<title>Script Defer Example</title>
</head>
<body>
<script defer>
alertCdefer");
</script>
<script>
alert("script");
</script>
<script>
window.onload = function(){
alertC'load");
>;
</script>
</body>
</html>
.
, defer,
: defer, script load. ,
defer, : script, defer load.
, <script> defer
,
onload.
Internet Explorer Firefox 3.5,
.
, , .1
script
(Document Object Model, DOM)
JavaScript-
HTML-. <script>
:
DOM, ,
. <script>
DOM:
1 Internet Explorer 8 ( ) Firefox 3.6
HTML5 defer.
<script> defer
src. ,
.
Internet Explorer 8
.
28
1.
var script = document.createElement("script");
script.type = "text/javascript;
script.src = filel.js";
document.getElementsByTagName("head")[0].appendChild(script);
<script> filel.js.
, . ,
,
.
<head> , ,
(
HTTP-, ).
<script>
<head>, <body>,
. Internet Explorer
operation aborted ( ),
<body> .1
<script>,
( Firefox Opera,
,
<script>).
, ,
.
,
. ,
<script>.
Firefox, Opera, Chrome Safari 3+ load,
<script> src .
, ,
:
var script = document.createElement("script")
script.type = "text/javascript";
// Firefox, Opera, Chrome, Safari 3+
script.onload = function(){
alert("Script loaded!");
>;
script.src = "filel.js";
document.getElementsByTagName("head")[0].appendChild(script);
1 The dreaded
operation aborted error : http://www.nc2online.net/blog/2008/03/17/
the-dreaded-operationaborted-error/.
29
Internet Explorer ,
readystatechange. <script>
readyState,
. readyState
:
"uninitialized
.
"loading
.
"loaded"
.
"interactive"
, .
"complete"
.
Microsoft readyState
,
<script>, ,
.
"loaded" "complete". Internet Explorer
,
readyState -
<script> "loaded"
"complete", "complete",
"loaded".
readystatechange
( ,
):
var script = document.createElement("script")
script.type = "text/javascript";
// Internet Explorer
script.onreadystatechange = function(){
if (script.readyState == "loaded" || script.readyState == "complete"){
script.onreadystatechange = null;
alert("Script loaded.");
>
>;
script.src = "filel.js";
document.getElementsByTagName("head")[0].appendChild(script);
JavaScript-.
- IE:
30
1.
function loadScript(url, callback){
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState){ // IE
script.onreadystatechange = function(){
if (script.readyState=="loaded" || script.readyState=="complete"){
script.onreadystatechange = null;
callback();
>
>;
> else { //
script.onload = function(){
callback();
>;
>
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
>
: URL- JavaScript-
, , JavaScript- .
,
<script>.
src
<script> .
loadScript():
loadScript("filel.js", function(){
alert("File is loaded!");
>);
JavaScript-, ,
. Firefox Opera ,
.
,
.
, , :
loadScript("file1.js", function(){
loadScript("file2.js", function(){
loadScript("file3.js", function(){
alert("All files are loaded!");
>);
>);
>);
file2.js,
filel.js, file3.js>
31
file2.js.
,
.
,
,
.
, (
,
).
,
.
XMLHttpRequest
XMLHttpRequest
(XHR) .
XMLHttpRequest, JavaScript-
<script>. :
var xhr = new XMLHttpRequest();
xhr.open(get", "filel.js", true);
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status < 30 0 || xhr.status == 304){
var script = document.createElement("script");
script.type = "text/javascript";
script.text = xhr.responseText;
document.body.appendChild(script);
>
>
>;
xhr.send(null);
GET- filel.js.
onreadystatechange , readyState
4, HTTP- (
200 299 , 304
, ).
<script>, text
responseText, .
<script> .
<script> ,
.
JavaScript- .
32
1.
<script>, ,
.
,
.
, JavaScript-
, , ,
CDN.
XHR
-.
JavaScript
:
, ,
, .
( loadScriptQ),
.
, JavaScript-. :
<script type="text/javascript" src="loader. js"x/script>
<script type="text/javascript">
loadScript("the-rest,js", function(){
Application.init();
>);
</script>
</body>. .
-, , ,
. -, JavaScript-
DOM ,
(
window.onload) ,
.
, loadScriptQ
HTTP-.
:
<script type="text/javascript">
function loadScript(url, callback){
var script = document.createElement("script")
script.type = "text/javascript";
33
if (script.readyState){ // IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" ||
script.readyState == "complete"){
script.onreadystatechange = null;
callback();
>
>;
} else { //
script.onload = function(){
callback();
>;
>
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
>
loadScript("the-rest.js", function(){
Application.init();
>);
</script>
, YUI Compressor
( 9), .
,
, loadScriptQ
.
YUI 3
YUI 3. YUI 3
, YUI:
<script type="text/javascript"
src="http://yui.yahooapis. com/combo?3.0.0/build/yui/yui-min. js"x/script>
10 (6
gzip)
YUI Yahoo! CDN. ,
DOM,
use() YUI ("dom") ,
,
:
YUI().use("dom", function(Y){
Y.DOM.addClass(document.body, "loaded");
>);
34
1.
YUI
use().
, "dorif
URL-,
, <script>,
.
,
YUI ,
.
LazyLoad
(Ryan Grove) Yahoo! Search
- LazyLoad ( http://github.com/rgrove/lazyload/). LazyLoad
loadScriptQ.
LazyLoad 1,5 (
, ).
:
<script type="text/javascript" src="lazyload-min. js"x/script>
<script type="text/javascript">
LazyLoad.js("the-rest.js", function(){
Application.init();
>);
</script>
LazyLoad JavaScript-
. JavaScript-,
LazyLoad.js() URL-:
<script type=,,text/javascript" src="lazyload-min.js"x/script>
<script type="text/javascript">
LazyLoad.js([first-file.js, "the-rest.js"], function(){
Application.init();
>);
</script>
,
, .
HTTP-,
,
.
LazyLoad
CSS-. ,
CSS-
.
35
LABjs
LABjs (http://labjs.com,/)> (Kyle Simpson)
(Steve Souders).
. , LABjs
- 4,5 ( ,
),
. :
<script type="text/javascript" src=lab.js"x/script>
<script type="text/javascript">
SLAB.script("the-rest.js")
.wait(function(){
Application.init();
});
</script>
>);
</script>
LABjs
.
<script> (
, ) .
, - .
LABjs wait
.
first-file.js therest.js. , wait
scriptQ:
<script type="text/javascript" src="lab.js></script>
<script type="text/javascript">
SLAB.script("first-file.js").wait()
36
1.
.script("the-rest. js")
.wait(function(){
Application.init ();
>);
</script>
first-file.js
the-rest.js>
.
JavaScript- -
,
, ,
. <script>,
,
( )
, .
JavaScript-:
<script>
</body>. ,
, .
. <script>
,
. ,
JavaScript-.
JavaScript-, :
defer <script> ( Internet Exp
lorer Firefox 3.5+).
<script>
.
JavaScript- XHR
.
,
-
JavaScript.
2
, .
. JavaScript
. ,
,
. Java
Script , :
,
- . JavaScript
, , ,
, , ,
null undefined.
,
var.
Array,
.
,
.
.
.
38
2.
,
.
. 2.1 200000
.
, Java
Script, Firefox 3, Internet Explorer Safari 3.2,
,
JavaScript.
:
,
. Firefox 3,
. ,
,
.
, .
100
90-
80-
0
|
60-
C\J
1 50-
Jo L40
'
1 30
i 20-
<>
Q.
10 -
0-
ill
. 2.1. 200000 ,
JavaScript ,
. JavaScript
,
, , this.
39
JavaScript
, ,
,
.
JavaScript ,
Function. ,
, ,
, , Ja
vaScript .
[[Scope]], -262,
(http://www.ecma-internationaLorglpublicationslstandardslEcma-262.htm).
[[Scope]] ,
, .
, .
,
/,
.
, ,
, . ,
:
function add(num1, num2){
var sum = num1 + num2;
return sum;
>
add()
: ,
.
, , , window, navigator document.
. 2.2
(
; ).
add)
[[Scope]]
^
this
window
window
()
document
()
add
()
. 2.2. add()
40
2.
add
. ,
:
var total = add(5, 10);
add ,
.
, .
,
.
, .
,
.
, [[Scope]]
.
.
,
.
, , arguments
this.
.
. . 2.3
.
0
1
------>
this
window
arguments
[5,10]
num1
num2
10
sum
undefined
this
window
window
()
document
()
add
()
total
undefined
. 2.3. add()
41
,
, ,
.
.
.
, ;
,
. ,
. ,
.
, ,
sum, num1 num2.
.
,
. ,
, ,
.
- ;
, ,
.
,
. ,
,
(
JavaScript
). ,
,
.
. 2.4 2.5
.
1 .
-
,
. JavaScript,
Chrome Safari 4,
,
42
2.
160
140
IE8
1 120
Safari 3.2
I
|
80
60
Firefox 3
Firefox 3.5
00
40
20
Opera 10
Chrome
Safari 4
. 2.4.
. 2.5.
43
,
,
JavaScript.
,
. :
function initUI(){
var bd = document.body,
links = document.getElementsByTagName("a"),
i = 0,
len = links.length;
while(i < len){
update(links[i++]);
>
document.getElementById("go-btn").onclick = function(){
start();
>;
bd.className = "active";
>
document,
.
,
.
,
. , ,
:
function initUI(){
var doc = document,
bd = doc.body,
links = doc.getElementsByTagName("a"),
i = 0,
len = links.length;
while(i < len){
update(links[i++]);
>
doc.getElementByldCgo-btn^.onclick = function(){
start();
>;
bd.className = "active";
44
2.
initUIQ
document doc.
.
doc , document,
. ,
,
,
, -
.
,
. ,
. with.
with
. ,
, ,
. , initUIQ
:
function initUI(){
with (document){ // !
var bd = body,
links = getElementsByTagName("a"),
i = 0,
len = links.length;
while(i < len){
update(links[i++]);
>
getElementByldCgo-btn^.onclick = function(){
start();
>;
bd.className = "active";
>
}
initUIQ with,
document.
,
.
with,
.
45
,
. ,
, - (. 2.6).
with
body
()
getElementByld
()
getElementsByTagName
()
this
inHUIO
. J
window
arguments
[]
bd
undefined
links
undefined
undefined
len
undefined
this
window
window
()
document
()
add
()
total
undefined
. 2.6. with
document with
, document,
.
document,
, bd.
with. ,
document
.
with JavaScript,
;
catch try-catch. try
, catch,
-
46
2.
, . catch
. :
try {
methodThatMightCauseAnError();
} catch (){
alert(ex.message); //
>
, catch
.
try-catch ,
. , try-catch,
.
try-catch
JavaScript. , ,
,
.
catch
,
. ,
,
catch, :
try {
methodThatMightCauseAnError();
> catch (){
handleError(ex); //
>
handleErrorQ ,
catch.
, ,
.
,
.
with, catch try-catch,
, evalQ,
.
(
). :
47
function execute(code) {
eval(code);
function subroutine(){
return window;
>
var w = subroutine();
// w?
>;
executeQ ,
evalQ. w
code.
w window,
:
execute("var window = {};")
evalQ executeQ
window, w
, window.
, ,
, ,
window .
JavaScript,
Nitro Safari,
, , ,
.
,
.
.
, ,
.
, .
,
,
JavaScript,
.
(Douglas Crockford),
-.
.
48
2.
,
:
function assignEvents(){
var id = xdi9592;
document.getElementById("save-btn").onclick = function(event){
saveDocument(id);
>
assignEventsQ
DOM. ,
assignEventsQ,
id,
. id ,
.
assignEventsQ ,
id.
;
. ,
[[Scope]] (. 2.7).
this
[[Scope])
3/
assignEventsQ
_>
------
0
1
window
arguments
[]
id
"xdi9592"
* this
window
window
()
document
()
assignEvents
()
saveDocument
()
. 2.7.
assignEventsf)
[[Scope]]
, ,
. -
49
.
,
[[Scope]] . ,
, , . -
,
Internet Explorer. IE DOM
JavaScript-,
( 3).
, ,
,
[[Scope]],
(. 2.8).
() '
[[Scope]]
this
window
arguments
[]
event
()
(assignEvents) i
this
window
------
arguments
[]
------
id
"xdi9592"
1
2
this
window
window
()
document
()
assignEvents
()
saveDocument
()
. 2.8.
, , id saveDocument,
,
.
:
,
50
2.
.
,
.
, ,
, :
.
JavaScript - , ,
,
DOM BOM (Browser Object Model -
).
.
, , J a
vaScript .
. Java
Script ,
. ,
, , ,
, - .
,
,
, ,
. , ,
JavaScript.
JavaScript . -
, ,
, .
- ,
. -
,
-.
.
Firefox, Safari Chrome
_proto__;
. , ,
51
};
alert(book.toStringO); // "[object Object]"
_proto_
title
"High Performance
JavaScript*
hasOwnProperty
()
isPrototypeOf
()
propertylsEnumerable
()
publisher
"Yahoo! Press"
null
toLocaleString
()
toString
()
valueOf
()
. 2.9.
. book.toStringO,
toString
. book toString,
-,
toStringO. , book
.
hasOwnPropertyO, .
,
, in. :
52
2.
var book = {
title: "High Performance JavaScript",
publisher: "Yahoo! Press"
};
alert(book.hasOwnPropertyC'title"));
// true
alert(book.hasOwnPropertyCtoString")); // false
alert("title" in book);
// true
alert("toString" in book); // true
, hasOwnPropertyQ title,
true, title ;
toString, false,
.
in,
true, ,
.
. Object
, toStringQ.
,
. :
function Book(title, publisher){
this.title = title;
this.publisher = publisher;
>
Book.prototype.sayTitle = function(){
alert(this.title);
};
var bookl = new Book("High Performance JavaScript", "Yahoo! Press");
var book2 = new Book("JavaScript: The Good Parts", "Yahoo! Press");
alert(book1 instanceof Book);
// true
alert(book1 instanceof Object); // true
bookl.sayTitle();
// "High Performance JavaScript"
alert(book1.toStringO); // "[object Object]"
Book
Book. (_proto__) bookl Book.proto
type, Book.prototype - Object.
,
bookl 2 .
. 2.10.
53
_proto_
Book prototype
title
"High Performance
JavaScript"
publisher
"Yahoo! Press"
_proto_
Book.prototype
_proto_
hasOwnProperty
()
isPrototypeOf
()
sayTitle
_proto_
()
Book
title
"JavaScript:
TheGood Parts"
publisher
"Yahoo! Press"
null
propertylsEnumerable ()
toLocaleString
()
toString
()
valueOf
()
. 2.10.
, Book
.
t i tle publisher, .
, book1.toString(),
, toString
. ,
,
. . 2.11
.
350-|
1 300
15
250
2-
3-
200
S
31" 150
1 100
50
&
. 2.11.
54
2.
,
JavaScript, ,
- Internet Explorer Firefox 3.5 -
. ,
,
,
.
, JavaScript- , ,
: window.location.href.
JavaScript
. . 2.12
.
,
, . location.href
, window, location, href,
, , ,
window.location.href.toStringQ. , ,
, -
.
250
200 -
150
100
50-
Firefox 3.5
Chrome
Safari 4
. 2.12.
55
(object, name)
(object["name"]). Safari - ,
,
,
.
, ,
, . ,
, .
,
:
function hasEitherClass(element, classNamel, className2){
return element.className == classNamel || element.className == className2;
>
element.class
Name. ,
,
.
,
:
function hasEitherClass(element, classNamel, className2){
var currentClassName = element.className;
return currentClassName == classNamel || currentClassName == className2;
>
. -
,
.
.
,
,
.
,
.
,
.
, , , YUI,
. :
56
2.
function toggle(element){
if (YAHOO.util.Dom.hasClass(element, "selected")){
YAHOO.util.Dom.removeClass(element, "selected");
return false;
} else {
YAHOO.util.Dom.addClass(element, "selected");
return true;
}
}
YAHOO.util.Dom
.
.
, .
,
YAHOO, u til. Dom :
function toggle(element){
var Dom = YAHOO.util.Dom;
if (Dom.hasClass(element, "selected")){
Dom.removeClass(element, "selected");
return false;
} else {
Dom.addClass(element, "selected");
return true;
}
}
.
, .
:
.
this ,
this
window. this
, JavaScript
,
.
57
, JavaScript-,
. ,
: , ,
. .
,
.
,
,
.
,
.
,
.
with,
.
catch
try-catch, .
,
.
,
.
, JavaScript-
, ,
.
, .
,
-,
.
3
DOM
(Stoyan Stefanov)
DOM
-.
DOM,
,
. :
DOM
DOM,
DOM
DOM ,
.
DOM
(Document Object Model, DOM) -
(API) XML HTML-. HTML, - XML- DOM API , .
API,
,
JavaScript.
, --
D O M
59
, DOM
JavaScript.
DOM
JavaScript. Internet Explorer, , Java
Script JS cript
jscript.dll, DOM
, mshtml.dll ( Trident).
, VBScript,
DOM
Trident. Safari DOM
WebCore ,
WebKit, JavaScriptCore ( SquirrelFish).
Google Chrome
WebCore WebKit,
JavaScript V8. Firefox
JavaScript SpiderMonkey (
TraceMonkey),
Gecko.
?
, ,
.
, DOM JavaScript ( Script) , (
(John H rvatin), Microsoft, MIX09, http://videos.visitmix.com/
MIX09/T53F). , ECMAScript
DOM,
.
DOM, .
ECMAScript.
,
,
.
DOM
DOM , .
,
.
,
, HTML.
60
3. D O M
,
DOM, :
function innerHTMLLoop() {
for (var count = 0; count < 15000; count++) {
document.getElementById('here').innerHTML += 'a';
}
>
.
,
:
innerHTML, .
,
:
function innerHTMLLoop2() {
var content = '';
for (var count = 0; count < 15000; count++) {
content += a';
>
document. getElementById(here).innerHTML += content;
}
. . 3.1
. Y (
273
263
250-
155
150112
122
101
98
100 -
43
50-
43
I ~~ I
34
20
- JZ
L 1
* $>
. 3.1. ,
ECMAScript: innerHTMLLoop2()
innerHTMLLoopf)
61
D O M
) ,
.
innerHTMLLoop2() IE6 155
innerHTMLLoopQ.
,
DOM
. , :
DOM ECMAScript
.
innerHTML DOM
-
: ,
, innerHTML,
DOM, document.createElementQ?
- ,
-? , , ,
innerHTML ,
, WebKit (Chrome Safari).
1000 :
HTML
innerHTML DOM.
DOM,
document.createElementQ document.createTextNodeQ.
,
(Content Manage
ment System, CMS). . 3.2.
id
yes?
name
my name is #1
my name is #2
u rl
action
edit
delete
http://cxample.orp/2 .html
1
delete
innerHTML:
function tablelnnerHTMLO {
var i, h = [<table border="1" width="100%">'];
62
3.
h.push(<thead>);
h.push('<trxth>id<\/thxth>yes?<\/thxth>name<\/thxth>url<\/th>' +
<th>action<\/thx\/t r> );
h.push('<\/thead>');
h.push(<tbody>);
for (i = 1; i <= 1000; i++) {
h. push( <trxtd>);
h.push(i);
h.push( ,<\/tdxtd>);
h.push('And the answer is... ' + (i % 2 ? 'yes' : no));
h. push( '<\/tdxtd>');
h.push('my name is #' + i);
h. push( '<\/tdxtd>');
h.push('<a href="http://example.org/' + i +
'.html">http://example.org/' + i + '.html<\/a>);
h. push( '<\/tdxtd>');
h.push('<ul>);
h.pushC <li><a href="edit. php?id= + i + ,,>edit<\/ax\/li>');
h.pushC <li><a href="delete.php?id=" + i + '">delete<\/ax\/li>');
h.push('<\/ul>');
h.push('<\/td>');
h.push('<\/tr>');
h.push(<\/tbody>');
h.push(<\/table>');
document. getElementById(here'). innerHTML = h.join( );
};
, DOM,
:
function tableD0M() {
var i, table, thead, tbody, tr, th, td, a, ul, li;
tbody = document.createElement('tbody');
for (i = 1; i <= 1000; i++) {
tr = document.createElement('tr');
td = document.createElement('td');
td.appendChild(document.createTextNode((i % 2) ? 'yes'
no'));
tr.appendChild(td);
td = document.createElement(td');
td.appendChild(document.createTextNode(i));
tr.appendChild(td);
td = document.createElement('td');
td.appendChild(document.createTextNode('my name is #' + i));
tr.appendChild(td);
D O M
= document.createElement('');
a.setAttributeChref', 'http://example.org/' + i + .html);
a.appendChild(document.createTextNode('http://example.org/' + i +
'.html'));
td = document.createElement(td);
td.appendChild(a);
tr.appendChild(td);
ul = document.createElement('ul');
a = document.createElement('a');
a.setAttributeChref', 'edit.php?id=' + i);
a.appendChild(document.createTextNode('edit'));
li = document.createElement('li');
li.appendChild(a);
ul.appendChild(li);
a = document.createElement('a');
a.setAttributeChref', 'delete.php?id=' + i);
a. appendChild(document.createTextNode('delete'));
li = document.createElement li');
li.appendChild(a);
ul.appendChild(li);
td = document.createElement('td');
td.appendChild(ul);
tr.appendChild(td);
tbody.appendChild(tr);
}
tr = document.createElement('tr');
th = document.createElement('th');
th.appendChild(document.createTextNode('yes?'));
tr.appendChild(th);
th = document.createElement('th');
th.appendChild(document.createTextNode('id'));
tr.appendChild(th);
th = document.createElement('th');
th.appendChild(document.createTextNode('name'));
tr.appendChild(th);
th = document.createElement('th');
th.appendChild(document.createTextNode('url'));
tr.appendChild(th);
th = document.createElement('th');
th.appendChild(document.createTextNode('action'));
tr.appendChild(th);
thead = document.createElement('thead');
thead.appendChild(tr);
table = document.createElement('table');
table.setAttribute('border', 1);
table.setAttribute('width', *100%');
table.appendChild(thead);
63
64
3. D O M
table.appendChild(tbody);
document.getElementById('here).appendChild(table);
};
HTML-
innerHTML DOM
. 3.3. innerHTML
( IE6 innerHTML
3,6 ) .
, WebKit,
: DOM
. ,
, ,
.
innerHTML
,
HTML-.
,
,
, ,
.
D O M
65
DOM DOM . , -
element.cloneNodeQ ( element )
document.createElementQ.
,
.
:
2% IE8, IE6 IE7
5,5% Firefox 3.5 Safari 4
6% Opera ( Opera 10)
10% Chrome 2 3% Chrome 3
,
element.cloneNodeQ:
function tableClonedDOM() {
var i, table, thead, tbody, tr, th, td, a, ul, li,
oth = document.createElement('th'),
otd = document.createElement('td'),
otr = document.createElement('tr'),
oa = document.createElement('a'),
oli = document.createElement('li'),
oul = document.createElement(ul');
tbody = document.createElement(tbody');
for (i = 1; i <= 1000; i++) {
tr = otr.cloneNode(false);
td = otd.cloneNode(false);
td.appendChild(document.createTextNode((i % 2) ? 'yes' : 'no'));
tr.appendChild(td);
td = otd.cloneNode(false);
td.appendChild(document.createTextNode(i));
tr.appendChild(td);
td = otd.cloneNode(false);
td.appendChild(document.createTextNode(my name is #' + i));
tr.appendChild(td);
// ... ...
}
// ... ...
66
3. D O M
HTML-
HTML- - , ,
DOM. ,
:
document.getElementsByNameQ
document. getElementsByClassNameQ
document.getElementsByTagName()
HTML-:
document.images
<img> .
document.links
.
document. forms[0]. elements
.
HTMLCollection,
.
( , push() sliceQ),
length
. , document.images[1]
. DOM,
HTML- ,
(http://
www.w3.org/TR/DOM-Level-2-HTML/htmLhtml#ID-75708506).
HTML- ,
,
,
( length ).
.
, ,
:
//
var alldivs = document.getElementsByTagName(div);
for (var i = 0; i < alldivs.length; i++) {
document.body.appendChild(document.createElement('div'))
}
<div> .
67
D O M
<div> <div>,
. ,
, alldivs.length,
, ,
.
HTML-
,
- ,
(. 3.4).
200 - |
191
150114
10079
58x
50 14,2x 14,9x
2x
' ^
&
3,5x
5,7
3,5
. 3.4. ,
HTML-
4,
length .
length ,
length ,
.
, coll,
.
, HTML-
:
function toArray(coll) {
for (var i = 0, a = [], len
a[i] = coll[i];
}
return a;
68
3.
:
var coll = document.getElementsByTagName('div');
var ar = toArray(coll);
:
//
function loopCollection() {
for (var count = 0; count < coll.length; count++) {
/ * * /
}
}
//
function loopCopiedArrayO {
for (var count = 0; count < arr.length; count++) {
/ * * /
)
)
length
,
.
,
:
function loopCacheLengthCollection() {
var coll = document.getElementsByTagName(div'),
len = coll.length;
for (var count = 0; count < len; count++) {
/ * */
}
}
, loopCopiedArrayO.
,
,
length .
,
,
, .
,
,
,
.
toArrayO, ,
.
D O M
69
,
,
?
:
DOM ,
DOM .
- length
,
.
.
document,
,
. length
.
//
function collectionGlobal() {
var coll = document, getElementsByTagNaine( 'div'),
len = coll.length,
name = '';
for (var count = 0; count < len; count++) {
name = document.getElementsByTagName('div')[count].nodeName;
name = document.getElementsByTagName('div')[count].nodeType;
name = document.getElementsByTagName('div')[count]. tagName;
}
return name;
};
//
function collectionLocalO {
var coll = document.getElementsByTagName('div'),
len = coll.length,
name = '';
for (var count = 0; count < len; count++) {
name = coll[count].nodeName;
name = coll[count].nodeType;
name = coll[count].tagName;
}
return name;
70
3.
//
function collectionNodesLocal() {
var coll = document.getElementsByTagName(div),
len = coll.length,
name = '',
el = null;
for (var count = 0; count < len; count++) {
el = coll[count];
name = el.nodeName;
name = el.nodeType;
name = el.tagName;
}
return name;
};
. 3.5
.
,
, -
,
.
350 -I
300250200
150100 50-
X XX
X
><! w
0 5 <.
csT csT
LO CVI
X- (X,><
*
- 1^.10 ^
\ \ ^ ^
&
&
. 3.5.
D O M
71
DOM
DOM
. ,
,
API.
DOM
DOM , ,
.
, childNodes
nextSibling.
:
function testNextSibling() {
var el = document.getElementById('mydiv*),
ch = el.firstChild,
name = **;
do {
name = ch.nodeName;
} while (ch = ch.nextSibling);
return name;
};
function testChildNodes() {
var el = document.getElementById(mydiv),
ch = el.childNodes,
len = ch.length,
name = ;
for (var count = 0; count < len; count++) {
name = ch[count].nodeName;
}
return name;
};
, childNodes - ,
.
length,
.
. IE nextSibling
, childNodes. IE6 nextSibling 16
, IE7 - 105 . , ,
, DOM
IE next
Sibling.
.
72
3.
-
DOM, childNodes, firstChild nextSibling, ,
(
).
, ,
,
.
DOM.
,
, .
, ,
, ,
. DOM . 3.1.
3.1. DOM,
(HTM L-)
children
childNodes
childElementCount
childNodes.length
firstElementChild
firstChild
lastElementChild
lastChild
nextElementSibling
nextSibling
previousElementSibling
previousSibling
, . 3.1,
Firefox 3.5, S afari 4, Chrome 2 Opera 9.62. 6 7 Inter
net Explorer children.
children ,
childNodes, .
, HTML
, children. children
, childNodes,
1,5 3 .
IE, children
, childNodes, - 24
IE6 124 IE7.
API
DOM, getElementByldQ getElementsByTagNameQ. ,
D O M
73
,
.
CSS- - CSS. JavaScript- ,
CSS-,
DOM- querySelectorAllQ.
, , JavaScript
DOM .
:
var elements = document.querySelectorAll(#menu a');
elements
<>, id=menu". querySelectorAllQ CSS-
NodeList - , , ,
. , ,
HTML-,
.
(
), HTML-
.
querySelectorAllQ, :
var elements = document.getElementById(menu).getElementsByTagName();
elements HTML-,
,
, querySelectorAllQ.
querySelectorAll() ,
. ,
<div> warning, notice,
querySelectorAll() :
var errs = document.querySelectorAll('div.warning, div.notice');
querySelectorAllQ, .
, <div>
, .
var errs = [],
divs = document.getElementsByTagName('div'),
classname = ;
for (var i = 0, len = divs.length; i < len; i++) {
classname = divs[i].className;
74
3. D O M
if (classname === 'notice' || classname === 'warning') {
errs.push(divs[i]);
}
}
,
querySelectorAll() 2 -6 (. 3.6).
81
7.
6-
4,88
5
.
4
0m
1X -
Q-
2,46
2
2 -
!*
3,45
Jb
2,1
</
. 3.6. API
, getElementsbyTagNamef)
API , : Internet
Explorer 8, Firefox 3.5, S afari 3.1, Chrome 1 Opera 10.
, . 3.6,
document.querySelectorAllQ
, . ,
API , JavaScript-,
,
API. , ,
.
querySelector(), , .
DOM,
document.querySelector('.myclass ),
elref. querySelector(myclass), elref - DOM.
75
- HTML,
JavaScript, CSS, -
:
DOM
.
DOM.
, ,
DOM, (
DOM
). ,
, CSS,
, , ,
. ,
() .
DOM ,
( ),
,
,
, .
, ,
. (reflow).
, (repaint).
DOM
. ,
.
( ), .
-.
, , .
?
, ,
. , :
DOM
(, -
, , , . .)
76
3. DOM
, ,
.
,
.
- ,
,
,
. ( )
.
,
,
:
,
,
.
, .
,
.
,
(
,
):
//
var computed,
tmp = '',
bodystyle = document.body.style;
if (document.body.currentStyle) { // IE, Opera
computed = document.body.currentStyle;
77
} else { // W3C
computed = document.defaultView.getComputedStyle(document.body,
>
//
//
bodystyle.color = *red';
tmp = computed.backgroundColor;
bodystyle.color = 'white';
tmp = computed.backgroundlmage;
bodystyle.color = 'green';
tmp = computed.backgroundAttachment;
<body>,
. - backgroundColor, backgro
undlmage backgroundAttachment -
.
, ,
.
,
,
.
,
:
6
5,27
5-
3-
2,72
2,3
1,83 1,87
2,55 2,54
1,94
. 3.7,
78
3. D O M
bodystyle.color = red;
bodystyle.color = 'white';
bodystyle.color = 'green';
tmp = computed.backgroundColor;
tmp = computed.backgroundlmage;
tmp = computed.backgroundAttachment;
,
. 3.7.
,
, .
DOM .
:
var el = document.getElementByld( 'mydiv');
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';
,
.
.
,
(,
). -
, ,
. ,
DOM ,
.
DOM .
cssText:
var el = document.getElementById('mydiv');
el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';
cssText, ,
,
79
,
cssText:
el.style.cssText +=
border-left: 1px;;
CSS- .
,
. CSS-
;
, ,
- .
var el = document.getElementByld(mydiv);
el.className = 'active';
DOM
DOM
,
:
1. .
2. .
3. .
-
1 3. ,
2 .
DOM :
, .
,
DOM .
,
.
,
:
<ul id="mylist>
<li><a href=http://phpied.com">Stoyan</a></li>
<li><a href="http://]ulienlecomte.com>Julien</a></li>
</ul>
, ,
, :
var data = [
80
3.
"name": "Nicholas",
"url": "http://nczonline.net"
},
{
"name": "Ross",
"url": "http://techfoolery.com"
}
];
,
:
function appendDataToElement(appendToElement, data) {
var a, li;
for (var i = 0, max = data.length; i < max; i++) {
a = document.createElement(a');
a.href = data[i].url;
a.appendChild(document.reateTextNode(data[i].name));
li = document.createElement(li');
li.appendChild(a);
appendToElement.appendChild(li);
}
};
,
, :
var ul = document.getElementByld(mylist);
appendDataToElement(ul, data);
data
DOM
. ,
,
<ul> ,
display, :
var ul = document.getElementById(mylist');
ul.style.display = none;
appendDataToElement(ul, data);
ul.style.display = block';
-
.
- document,
- .
,
, .
,
DOM :
81
, ,
:
var old = document.getElementById('mylist');
var clone = old.cloneNode(true);
appendDataToElement(clone, data);
old.parentNode.replaceChild(clone, old);
(
), ,
DOM
.
,
, -
.
,
.
, ,
,
, , .
,
.
myElement
100x100 500x500 .
:
//
myElement.style.left = 1 + myElement.offset Left + *px;
myElement.style.top = 1 + myElement.offsetTop + 'px';
if (myElement.offsetLeft >= 500) {
stopAnimation();
>
,
,
.
,
,
82
3. D O M
>
/
.
,
.
,
.
, .
,
, ,
.
, .
:
1. ,
, ,
.
2. . ,
.
.
3.
,
, .
IE :hover
7 IE CSS :hove
( ).
. IE8.
83
, 500-1000 5
tr:hover
, ,
, .
, CPU 80-90% .
,
.
,
(
onclick), .
- (
JavaScript),
.
DOM ,
,
onload ( DOMContentReady) -
-,
.
, , ,
,
. ,
( ,
, ,
100 ),
.
DOM
. ,
,
.
, ,
.
DOM
:
IE,
.
, . 3.8.
84
3. D O M
v c h tm l
<d:V>
<u! id-'menu*
<li>
<li>
<li>
< /u l>
______ </>_________________________________________
. 3.8. DOM
menu #1, click
<>. D O M
<li>, <ul>, <div> . .
window.
,
.
, , . 3.8,
Ajax.
JavaScript,
. JavaScript
,
,
( ), Ajax-
.
,
click <ul> id-'menu",
click,
.
document.getElementById(menu).onclick = function(e) {
//
= || window.event;
var target = e.target || e.srcElement;
var pageid, hrefparts;
//
// , click
if (target.nodeName !== ) {
return;
>
85
//
hrefparts = target.href.split('/);
pageid = hrefparts[hrefparts.length - 1];
pageid = pageid.replace(.html', *');
//
ajaxRequest(xhr.php?page=' + pageid, updatePageContents);
//
//
if (typeof .preventDefault === 'function') {
.preventDefault();
e.stopPropagation();
} else {
e.returnValue = false;
e.cancelBubble = true;
>
>;
,
; ,
, .
, ,
, .
, ,
:
( );
(
);
(,
, ,
).
DOM
-.
, ECMAScript DOM,
. ,
DOM, :
DOM
JavaScript.
DOM, .
HTML-,
. -
86
3. DOM
length
, ,
.
API, , querySelectorAllQ firstElementChild.
;
, DOM
,
.
.
.
4
, .
, ,
.
.
, ,
JavaScript
.
, ,
, JavaScript ,
,
,
.
.
, ,
,
. , JavaScript
, ,
.
88
4.
-262,
JavaScript, .
- for, ,
- :
for (var i=0; i < 10; i++){
//
>
for JavaScript
. for :
, ,
. for,
, .
true, .
.
for .
, var
for , ,
. JavaScript
,
for
.
- while. while -
,
:
var i = 0;
while(i < 10){
//
i++;
>
. true,
; . for
while, .
- do-while. do-while
JavaScript,
, -
:
var i = 0;
do {
//
} while (i++ < 10);
89
do-while ,
.
- for-in.
:
. :
for (var prop in object){
//
>
prop (
) . ,
.
, .
.
, JavaScript, for-in
.
for-in
,
. for-in
, .
for-in,
. , ,
,
, :
var props = [propl, "prop2"],
i = 0;
while (i < props.length){
process(object[props[i++]]);
>
,
. while
.
, , .
for-in .
90
4.
for-in,
,
.
, .
, ?
:
,
.
,
, ,
.
, ,
.
.
:
//
for (var i=0; i < items.length; i++){
process(items[i]);
>
var j=0;
while (j < items.length){
process(items[j++]);
>
var k=0;
do {
process(items[k++]);
} while (k < items.length);
:
1. (items, length) .
2. ^ < items, length) .
3. (i < items,
length == true).
4. (i++).
5. (items[i]).
6. (process(items[i])).
91
, .
,
processQ ,
,
, .
, ,
. 2,
,
.
items, length. .
,
.
,
, :
//
for (var 1=0, len=items.length; i < len; i++){
process(items[i]);
}
var j=0,
count = items.length;
while (j < count){
process(items[j++]);
}
var k=0,
num = items.length;
do {
process(items[k++]);
} while (k < num);
length .
.
25%
( 50% Internet Explorer).
,
.
,
.
92
4.
, . JavaScript
:
//
}
var j = items.length;
while (j ){
process(items[j]);
}
var k = items.length-1;
do {
process(items[k]);
} while (k);
.
.
true, ,
, true,
false. ,
(
true),
(
true).
.
50-60% .
,
:
1. (i == true) .
2. ^--).
3. (items[i]).
4. (process(items[i])).
, ,
.
m '
, ,
, ().
, (),
.
93
, . ,
,
, .
,
.
(D uffs Device)1.
- ,
. ,
JavaScript (Jeff Greenberg).
, :
// : (Jeff Greenberg)
var iterations = Math.floor(items.length / 8),
startAt = items.length % 8,
i
= 0;
do {
switch(startAt){
case 0: process(items[i++]);
case 7: process(items[i++]);
case 6: process(items[i++]);
case 5: process(items[i++]);
case 4: process(items[i++]);
case 3: process(items[i++]);
case 2: process(items[i++]);
case 1: process(items[i++]);
}
startAt = 0;
} while (iterations--);
,
process().
.
, startAt,
processQ
. , 12 ,
processQ 4 ,
- 8 , 12.
switch
:
1
http://ru.wikipedia.org/wiki/ycmpoiLcmeo _ - . .
94
4.
// : (Jeff Greenberg)
var iterations = items.length % 8;
i
= items.length - 1;
while(iterations){
process(items[i--]);
iterations--;
}
iterations = Math.floor(items.length / 8);
while(iterations){
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
iterations--;
}
,
switch
.
.
1000 ,
.
1000
.
, , 500000 ,
70%.
-262
, forEachQ.
. ,
forEachQ ,
: , .
:
items.forEach(function(value, index, array){
process(value);
});
forEachQ Firefox, Chrome Safari. ,
JavaScript- :
95
// YUI 3
Y.Array.each(items, function(value, index, array){
process(value);
});
// jQuery
jQuery.each(items, function(index, value){
process(value);
});
// Dojo
dojo.forEach(items, function(value, index, array){
process(value);
});
// Prototype
items.each(function(value, index){
process(value);
});
// MooTools
$each(items, function(value, index){
process(value);
});
,
.
,
.
,
.
, ,
. if-else
switch JavaScript ,
.
-
, .
if-else switch
, if-else switch
:
, if-else
switch. -
96
4.
. if-else
, switch -
. :
if (found){
//
} else {
//
}
switch(found){
case true:
//
break;
default:
//
}
, ,
if-else , switch.
:
if (color == "red"){
//
} else if (color == ,,blue,,){
//
} else if (color == "brown"){
//
} else if (color == "black"){
//
} else {
//
}
switch (color){
case "red":
//
break;
case "blue":
//
break;
case "brown":
//
break;
case "black":
//
break;
default:
//
}
switch .
97
, switch
, if-else,
.
if-else. ,
if-else
switch -
.
, if-else ,
,
.
, switch.
if-else
if-else
,
.
,
. :
if (value < 5) {
//
} else if (value
//
} else {
//
}
,
value 5.
10,
,
.
, if-else
.
if-else
if-else. if-else
-
. :
if (value == 0){
return resultO;
} else if (value == 1){
return resultl;
} else if (value == 2){
return result2;
98
4.
} else if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else if (value == 5){
return result5;
} else if (value == 6){
return result6;
} else if (value == 7){
return result7;
} else if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return resultIO;
}
if-else 10 .
, value
0 10.
,
if-else, :
if (value < 6){
if (value < 3){
if (value == 0){
return resultO;
} else if (value == 1){
return resultl;
} else {
return result2;
}
} else {
if (value == 3){
return result3;
} else if (value == 4){
return result4;
} else {
return result5;
}
}
} else {
if (value < 8){
if (value == 6){
return result6;
} else {
return result7;
99
} else {
if (value == 8){
return result8;
} else if (value == 9){
return result9;
} else {
return resultIO;
}
}
}
if-else
value.
,
.
value
0 10
if-else.
,
(
,
switch).
,
if-else switch, ,
.
, if-else switch,
, ,
.
,
, if-else
switch, (. 4.1).
if-else switch,
,
.
, switch ,
:
switch(value){
case 0:
return resultO;
case 1:
return resultl;
case 2:
return result2;
case 3:
100
4.
return
case 4:
return
case 5:
return
case 6:
return
case 7:
return
case 8:
return
case 9:
return
default:
return
result3;
result4;
result5;
result6;
result7;
result8;
result9;
resultIO;
}
, switch
, .
, :
//
var results = [resultO, result1, result2, result3, result4, result5, result6,
result7, result8, result9, resultIO]
//
return results[value];
---- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1------- 1
10
11
. 4.1.
if-else switch Internet Explorer 7
101
.
.
:
, ,
.
,
(
). switch ,
.
.
,
. ,
:
function facto rial(n){
if (n == 0){
return 1;
} else {
return n * factorial(n-1);
>
>
,
, .
,
.
JavaScript
. Internet
Explorer,
,
.
( Safari 2, , 100 ).
. 4.2 .
,
:
102
4.
37448
35000 30000
2
a
25000 -
21837 21837
20000
.
150002
100005000 -
10000 10000
3000 3000
1789
2232
500
0-
< < /
< /
. 4.2.
, , ,
, ,
JavaScript,
t ry-catch. . Firefox InternalError, Safari Chrome - RangeError, Internet Explorer
Error. (Opera
, Java
Script.)
JavaScript-:
try {
recurse();
} catch (){
alert("Too much recursion!");
>
103
, ,
( Firefox Firebug
; Safari/Chrome
JavaScript). Internet Explorer - IE
JavaScript,
, alertQ,
.
*
JavaScript-, . ,
,
.
,
.
. - ,
factorial) ,
. :
function recurse(){
recurse();
>
recurse();
. , ,
:
function first(){
secondO;
>
function second(){
first();
>
first();
, ,
.
.
.
,
104
4.
.
, ,
, ,
,
, .
.
, ,
.
,
.
,
.
JavaScript :
function merge(left, right){
var result = [];
while (left.length > 0 && right.length > 0){
if (left[0] < right[0]){
result.push(left.shift());
} else {
result.push(right.shift());
>
>
return result.concat(left).concat(right);
>
function mergeSort(items){
if (items.length == 1) {
return items;
>
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle);
return merge(mergeSort(left), mergeSort(right));
}
,
, m e r g e S o r t Q
105
.
.
; ,
.
, :
// merge()
function mergeSort(items){
if (items.length == 1) {
return items;
>
var work = [];
for (var i=0, len=items.length; i < len; i++){
work.push([items[i]]);
>
work.push([]); //
for (var lim=len; lim > 1; lim = Math.floor((lim+1)/2)){
for (var j=0,k=0; k < lim; j++, k+=2){
work[j] = merge(work[k], work[k+1]);
>
work[j] = [];//
>
return work[0];
>
mergeSort() ,
, .
,
. -
.
-
. ,
. ,
,
,
. - ,
,
.
106
4.
, .
f a c to r ia l),
. :
var fact6 = factorial(6);
var fact5 = factorial(5);
var fact4 = factorial(4);
,
factorial() 18 .
,
. 6 -
6 5, 5
. , 4 .
,
.
, factorial() ,
:
function memfactorial(n){
if (!memfactorial.cache){
memfactorial.cache = {
"": 1,
"I":
>;
>
if (!memfactorial.cache.hasOwnProperty(n)){
memfactorial.cache[n] = n * memfactorial(n-1);
>
return memfactorial.cache[n];
>
f actorial()
cache,
.
0 1.
cache
.
.
,
factorialQ:
107
,
memfactorialQ.
,
, .
,
. ,
memoize(), .
:
function memoize(fundamental, cache){
cache = cache 11 {};
var shell = function(arg){
if (!cache.hasOwnProperty(arg)){
cache[arg] = fundamental(arg);
>
return cache[arg];
};
return shell;
>
memoizeQ :
, .
,
;
. shellQ,
(fundamental) ,
, .
shellQ,
, :
// factorial
var memfactorial = memoize(factorial, { "": 1, "1": 1 });
//
var fact6 = memfactorial(6);
var fact5 = memfactorial(5);
var fact4 = memfactorial(4);
,
,
memoize() ,
.
108
4.
shell() . ,
,
, .
, JavaScript
.
, JavaScript ,
.
for, while do-while
,
.
for-in,
.
-
, ,
.
switch ,
if-else,
.
if-else switch.
;
.
,
,
.
,
.
(Steven Levithan)
JavaScript
. , , Ajax,
, JavaScript-
HTML.
,
, , , ,
. - .
JavaScript
, .
,
, 1
,
.
,
, ,
.
1 - ,
.
(, , )
.
110
5.
.
,
(, HTML-
XML-),
.
?
, (. 5.1).
5.1.
+=
str = "";
str += "b";
str += "";
array.joinQ
string. concatQ
str = "a";
str = str.concat("b", "c");
,
,
.
.
(+) - (+=)
, , IE7
, ,
.
,
.
.
:
str += "one" + "two";
:
1. .
2. "onetwo" .
111
3.
St .
4. str.
,
, .
(
1 2 )
str .
10-40% :
str += "one";
str += "two";
,
, :
str = str + "one" + "two";
// str = ((str + "one") + "two")
,
str,
, ,
.
(, str = "one" + str + "two"),
.
. , IE,
, ,
(. 5.1).
,
.
s1 = "one";
s2 = "two";
s3 = s2 + s1;
s1----------------------------- H
s2------------------------------H
s3------------------------------------------------------------------ )
. 5.1. :
s3 si s2;
s2
IE. IE 8
( )
IE7 .
112
5.
IE.
IE 8 ,
. (
) ,
, ,
.
IE8
-
, -
. ,
, toStringO ,
length DOM.
IE7
,
.
. IE, IE 8 ,
,
( ,
).
, largest = largest + s1 + s2
IE7
largest - , s1, s2. largest += s1 + s2, ,
,
largest . s1 + s2
,
.
Firefox
, Firefox
. , :
function foldingDemoO {
var st = "compile" + "time" + "folding";
str += "this" + "works" + "too";
str = str + "but" + "not" + "this";
}
ale rt(foldingDemo. toStringO);
/* Firefox :
function foldingDemoO {
113
} */
,
,
. ,
, ,
,
, .
-* &
__
YUI Compressor
.
JavaScript 9.
Ar ray. prototype, join
-,
. -,
.
, , ,
IE7 .
,
,
:
var str = "I'm a thirty-five character string.",
newStr =
appends = 5000;
while (appends--) {
newStr += str;
>
5000 35 .
. 5.2 1 , IE7.
5000 ,
.
, IE7,
1 . 5.2 5.3
10 IE7, Windows ,
(: 2 Core 2 Duo; : 1 ).
114
5.
.
.
. 5.2. IE7
+=
- (
IE 8)
,
. ,
, ,
; 226 5000 -
, ,
, 32
20000
.
,
:
var str = "Im a thirty-five character string.",
strs = [],
newStr,
appends = 5000;
while (appends--) {
strs[strs.length] = str;
}
newStr = strs.join("");
. 5.3 IE7.
115
40
30
30-
20
20-
10-
10
5000
10000
15000
20000
. 5.3. IE7
.
, ,
,
.
String.prototype.concat()
concatQ
,
.
,
, .
//
str = str.concat(sl);
//
str = str.concat(s1, s2, s3);
// ,
str = String.prototype.concat.apply(str, array);
, concatQ
+ +=
IE, Opera Chrome. ,
concatQ
116
5.
, ,
( Opera)
,
+ +=, IE7
.
(
, ,
),
.
, .
. ,
, ,
, ,
, . ,
.1
- ,
.
, , , ,
.
: ,
.
,
. ,
, Regular Expressions
Cookbook2 (http://oreilly.com/catalog/9780596520694/) (OReilly),
(Jan Goyvaerts) (Steven
Levithan) ( !),
JavaScript
.
1
.
2 .
. - . . - .: -, 2009.
117
, , .
,
:
1:
(
RegExpQ)
,
. ,
.
2:
, .
lastlndex 1,
4 (- )
.
,
,
, ,
. ,
~, IE Chrome ,
,
,
. :
,
,
( , ,
Chrome).
3:
.
- ,
1 lastlndex () test()
/ (global - ).
, ,
match(), replace(), searchQ split(),
.
118
5.
.
4:
,
.
,
, 2 ,
. ,
(
) ,
.
,
.
3 - .
(
JavaScript)
. ,
.
.
,
, ,
, , ,
.
.
,
,
. 1
, .
( *, +? {2,})
,
, (
|) .
1 , [a-z],
, \s ,
,
.
119
,
,
.
,
,
.
- ,
,
,
. ,
,
.
,
.
/h(ello|) hippo/.test("hello there, happy hippo");
hello hippo
happy hippo. h,
.
(11|) .
(
) ello
.
.
, h
hippo t .
,
,
( h)
.
, ,
, ,
,
. h
, 14- ,
h happy.
. ello
,
, ,
happy hippo (. 5.4).
.
120
5.
/h(ello|) hippo/
14- :
/h(ello|appy) hippo/
I__ f ----------
. 5.4.
,
, .
var str = "<p>Para 1 .</>" +
"<img src=smiley.jpg>" +
"<p>Para 2.</p>" +
"<div>Div. </div>";
/<p>.*<\/p>/i.test(str);
<> .
.*. ,
, ( )
- ,
.
, !
,
,
<.
,
.
< , <
</div>. \ / (
) ,
. ,
, </>
. , -
121
, , ,
, .
, *
( ) *?.
.
/<>.*?<\/>/ .*?,
< \ / > . ,
*?
, ,
. <
,
.*?
- . ,
< \ / > ,
, .
,
,
, ,
(. 5.5).
, , , ,
. ,
, HTML .
, .
, ,
JavaScript,
, ,
[\s\S].
/<html>[\s\S]*?<head>[\s\S]*?<title>[\s\S]*?<\/title>[\s\S]*?<\/head>
[\s\S]*?<body>[\s\S]*?<\/body>[\s\S]*?<\/html>/
,
HTML,
,
. </html>, ,
[\s\S]*? , ,
,
[\s\S]*?,
122
5.
. ,
[\s\S]*?, </body>,
<\/body> ,
</body>,
. ,
,
[\s\S]*?, ..
<> 1. </>
:
/<>.^?<>/ i
11
1. <
2. <
3. <>
2. <
3. <>
4. <>
5. <>
6. <>
7. <jD>Pa
8. <>
9. <>
10. <>
11 .<>
12. <>
13. <>
14. <>
15. <>
16. <>
123
1.</>
1. </> []
1.</
1. </ []
1. </
1 .</ []
1 .<
1 . < []
1.
1.<
11</
1.</
1.</>
5678
16
1 23
4 5 6 78
4. <> [ ]
5. <> []
6. <>
7. <> []
8. <>
9. <> []
10. <>
11. <> []
12. <>
13. <> []
14. <>
15. <> []
16. <> 1
17. <> 1 []
18. <> 1.
19. <> 1.<
20. <> 1.</
21. <> 1. </
22. <> 1. </>^
123
5678
22
. 5.5.
:
,
. , ,
. .*?,
123
,
[~"\\]*, ,
, .
HTML .
,
[~<], [\s\S],
.
, ,
(
) [\s\S] ( ).
, ,
[\s\S] ,
. ,
,
:
/<html>(?:(?! <head>)[\s\S])* <head>(?:(?!<title>)[\s\S])*<title>
(?:(?!<\/title>)[\s\S])*<\/title>(?:(?!<\/head>)[\s\S])*<\/head>
(?:(?!<body>)[\s\S])*<body>(?:(?!<\/body>)[\s\S])*<\/body>
(?:(?!<\/html>)[\s\S])*<\/html>/
HTML, .
,
,
.
, ,
HTML-
, ,
. , ,
.
, .NET, Java, Onigurum a, PCRE Perl,
. - (?>. ..),
, -
.
, ,
.
,
124
5.
HTML-: [\s\S]*?
HTML- ,
HTML-
.
,
, [\s\S]*?
.
, JavaScript
,
. , ,
,
:
.1 ,
;
.
,
. , :
(?=(, ))\1
,
.
,
.
, ,
HTML-, :
/<html>(?=([\s\S]*?<head>))\1(?=([\s\S]*?<title>))\2(?=([\s\S]*?
<\/title>))\3(?=([\s\S]*?<\/head>))\4(?=([\s\S]*?<body>))\5
(?=([\s\S]*?<\/body>))\6[\s\S]*?<\/html>/
, </html>
[\s\S]*?
, , -
.
,
, .
, ,
, ,
.
1 ,
ECMAScript.
125
,
. ,
,
(, (+)*).
.
.
,
, HTML-,
:
/ < ( ? : >... ] " , ] * )*>/
, , ,
,
HTML.
, /< >]*>/,
>
.
,
,
, .
,
*.
,
.
:
,
. , +
,
-
, , - .
.
.
<,
>, ,
-
126
5.
(
) ,
<.
, . !
.
,
,
/(++)+/ , .
/+/,
,
,
.
10
(""),
+ 10 .
,
+ .
, ,
,
+ , ,
. ,
,
.
+ , - ?
+ , - ,
?
+ , - ,
? , ,
,
.
0 (2 ), - , -
. 10
1024 ,
20 . 35
, Chrome, IE, Firefox Opera
10 ( ),
34 , ,
. Safari,
( Safari
,
).
-
127
.
, /+/,
. , ,
,
,
.
,
/((?=(++))\2)+/, .
, ,
.
,
, .
.
, .
,
, . ,
,
.
.
.
.
, ,
. ,
, - (
,
), .
,
128
5.
.
(~ $)> (,
\u263A), (, [a-z] ,
\d) (\). ,
, , /one |two/,
. Firefox
, \s\s*,
\s+ \s{ 1, >.
, .
,
. ,
.
( ),
"[""]*.
, |,
.
( ,
).
.
cat|bat
[cb]at
red|read
rea?d
red|raw
r(?:ed|aw)
(l\r|\n)
[\s\S]
, (
[\s\S], [\d \D], [\w\W] [\0-\uFFFF])
(?:. |\|\| \u2028|\2029). ,
( , ,
).
129
,
(
), .
,
,
. ,
.
, Chrome Firefox
,
.
.
,
- ,
(?:...) (...).
,
.
,
, , ,
, regex.(), $&
.
Firefox,
.
,
, .
, ,
, /" ( ]*)"/
/"[''"]*"/
.
.
, ,
.
,
130
5.
, ,
-
. , /~(ab|cd)/
. , IE Chrome
,
.
/("abpcd)/,
~ , IE
,
.
, ,
, .
(
) ,
,
, .
Ope
ra 9.x ,
Opera 10.
,
,
.
,
.
,
,
, .
.
, , :
while (/regexl/.test(strl)) {
/2/.exec(str2);
>
:
var regexl = /regexl/,
regex2 = /regex2/;
while (regexl.test(strl)) {
regex2.exec(str2);
>
131
. ,
,
,
,
. ,
,
,
.
.
. , ,
. ,
, ,
:
endsWithSemicolon = /;$/.test(str);
, - , ,
,
.
. , ,
($),
. ,
. (
), .
, ,
:
endsWithSemicolon = str.charAt(str.length - 1) ==
,
, , ,
,
.
charAt(),
. slice(), substr() substring()
,
. ,
indexOfQ
lastlndexOfQ.
132
5.
,
.
. ECMAScript 5
trimQ (
), Java
Script .
trim( ) ,
.
,
,
.
trimQ, JavaScript-, . ,
: - -
.
, .
if (!St ring.prototype.trim) {
String, prototype, trim = functionQ {
return this.replace(/~\s+/. "").replace(/\s+$/, "");
}
}
// ...
//
// (\t) (\).
var str = " \t\n test string ".trim();
alert(str == "test string"); // "true"
if, ,
trimQ,
,
JavaScript.
, .
/\s+$/ /\s\s*$/
Firefox 35% (
133
)1.
, Firefox
,
.
.
, , /~\s\s*/
,
(
).
trimQ
,
, . . 5.2
trim() .
, ,
(
),
.
// trim 2
String.prototype.trim = function() {
return this.replace(/~\s+|\s+$/g,
}
, , .
/ (global - ),
, (
, ,
). ,
, ,
,
.
// trim 3
String.prototype.trim = function() {
return this.replace(/~\s*([\s\S]*?)\s*$/,
}
(
) .
.
,
1 Firefox 2, 3 3.5.
134
5.
( ),
.
*?
, [\s\S]
.
,
\s*$.
-
, ,
.
Ope
ra 9.x .
Opera 9.64 10 100
, .
Opera 10,
, .
// trim 4
String.prototype.trim = function() {
return this.replace(/~\s*([\s\S]*\S)?\s*$/, "Si);
}
,
.
,
\S. -
,
,
?.
[\s\S]*
, ,
.
,
\S
( ).
,
, , ,
. ,
, IE, Safari, Chrome Opera 10
.
,
, .
,
( - ),
135
. ,
Firefox Opera 9,
.
// trim 5
String.prototype.trim = function() {
return this.replace(/~\s*(\S*(\s+\S+)*)\s*$/, $1");
}
,
,
.
,
,
,
,
.
,
, ,
.
,
(\s+\S+) (?:\s+\S+),
20-45% Opera, IE Chrome
S afari Firefox.
. ,
,
.
,
.
:
// trim 6
String.prototype.trim = function() {
var start = 0,
end = this.length - 1,
ws = " \n\r\t\f\x0b\xa0\u1680\u180e\u2000\u2001\u2002\u2003
\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f
\u205f\u3000\ufeff;
while (ws.indexOf(this.charAt(start)) > -1) {
start++;
}
while (end > start && ws.indexOf(this.charAt(end)) > -1) {
end--;
}
return this.slice(start, end + 1);
136
5.
ws ,
ECMAScript 5.
- ,
.
,
,
.
,
.
,
, .
,
, .
,
:
.
,
.
.
// trim 7
String.prototype.trim = function() {
var str = this.replace(/~\s+/.
end = str.length - 1,
ws = /\s/;
while (ws.test(str.charAt(end))) {
end--;
}
return str.slice(0, end + 1);
}
(
). ,
137
.
,
.
t rim() .
, ,
,
. ,
, ,
.
.
,
;
.
. 5.2.
5.2. trim()
Trim l b Trim 2
Trim 3
()
Trim 4
Trim 5C
Trim 6 Trim 7
IE7
80/80
315/312 547/539
36/42
218/224
14/1015 18/409
IE8
70/70
252/256 512/425
26/30
216/222
4/334
Firefox 3
20/144
Firefox 3.5
18/50
27/29
541/554
2/140
5/80
32/33
510/514
<0,5/29 4/18
69/68
12/205
Safari 4
37/37
Opera 9.64
Opera 10
75/75
94/100 360/370
46/46
514/514
2/186
12/198
Chrome 2
78/78
66/68
59/59
140/142
1/37
24/55
100/101
100 (40 );
10
, - 1000.
/\s\s*$/.
.
138
5.
, ,
, .
,
IE7
.
, IE7 ,
.
+ += .
.
, ,
, .
, , :
,
,
,
,
.
,
,
(.
).
,
.
.
( - , ).
, ,
, ,
.
6
,
- -.
-;
,
.
,
,
- ,
.
1 ,
. ,
JavaScript-
.
,
JavaScript,
, .
,
- ,
.
,
JavaScript
140
6.
,
( ) (
- ).
,
, .
,
.
JavaScript,
, (
3). ,
.
,
:
<html>
<head>
<title>Browser Ul Thread Example</title>
</head>
<body>
<button onclick="handleClick()">Click Me</button>
<script type="text/javascript">
function handleClick(){
var div = document.createElement("div");
div.innerHTML = "Clicked!";
document.body.appendChild(div);
}
</script>
</body>
</html>
. -
, , -
handleClick() ,
, , .
, .
.
JavaScript. handleClickQ
<div> <body>,
.
JavaScript
,
JavaScript, . 6.1.
,
, .
141
,
.
- ,
, ,
,
.
,
JavaScript, ,
,
, .
handleClickQ
<div>
handleClickQ
<div>
handleClick()
. 6.1.
,
JavaScript-.
,
. :
( 4)
.
,
,
,
.
, . 6 . 2 .
142
6.
| ........Yes'.........
Mo
. 6.2. ,
Internet Explorer 5
. ,
,
.
,
.
. ,
,
,
. ,
:
Internet Explorer 4
5
; Windows
H KEY_C U RREN T_U SER\Softw are\M icrosoft\InternetExplorer\Styles\M axScriptStatem ents.
Firefox
10 ;
( about :config
) dom .m ax_script_run_time.
S afari
5 ; ,
, Develop ()
Disable Runaway JavaScript Timer ( Runaway JavaScript
Timer).
Chrome ,
.
.
143
Opera
JavaScript,
,
, Opera,
.
,
.
,
(
).
, ,
. ,
.
, , -
, ,
, . ,
, .
- ?
,
, ,
. ,
,
, . (Brendan Eich),
JavaScript, - : [],
, - ...
- ,
JavaScript- ?
, - .
, JavaScript-,
100 . ,
(Robert Miller) 1968 .1 ,
(Jakob Nielsen),
, Usability Engineering
144
6.
, 1 : wwwMseit.com/papers/responsetime.htmL
2 Card, S. ., G.G. Robertson, and J.D. Mackinlay, The information visualizer:
An information workspace, Proc. ACM CHI91 Conf. (New Orleans: 28 April2 May), 181-188. : http:// tal.acm.org/citation.cfm?id=
108874.
145
.
100 .
, (
, JavaScript,
10).
,
100 .
,
. JavaScript-
,
. JavaScript-.
JavaScript
setTimeout() setlntervalQ, :
, , ( ),
. setTimeoutQ
, , setlntervalQ
,
.
. setTimeoutQ setlnter
valQ JavaScript,
JavaScript-. :
function greetingQ{
alert("Hello world!");
}
setTimeout(greeting, 250);
greeting() 250 .
JavaScript-. , ,
,
,
; , , ,
,
. :
146
6.
var button = document.getElementById("my-button);
button.onclick = function(){
oneMethod();
setTimeout(function(){
document.getElementById("notice"),style.color = "red";
>, 250);
>;
,
oneMethodQ . ,
notice ,
250 . 250
setTimeoutQ, .
setTimeoutQ >
, ,
+ 250.
. 6.3.
0;
onclickQ
0
V, ........................................... ^
50
100
350
setTimeoutQ
. 6.3. setTimeoutf) ,
JavaScript-
, , ,
, ,
. ,
,
,
,
onclick :
147
var button = document.getElementByldCmy-button");
button.onclick = function(){
oneMethod();
setTimeout(function(){
document.getElementByldC'notice").style.color = "red";
>, 50);
anotherMethod();
>;
anotherMethodQ 50 ,
, ,
, onclick .
onclick, . . 6.4.
[ - I
onclick()
,]
J
onclickQ
onclickQ
0
50
100
........................................... *
setTimeoutQ
150
. 6.4. , , ,
, set Timeout (),
,
,
. ,
,
. ,
.
,
, .
148
6.
?'
9V
setlnterval() setTimeoutQ,
,
JavaScript-.
, , ,
setlnterval(), .
JavaScript
.
250 , ,
250 setTimeout().
,
.
.
Windows 15 ,
15 , ,
0 15
. 15
Internet Explorer ,
, ,
25 ( 15 30 ),
15 .
,
.
10 .
,
, , .
,
4, ,
.
, , ,
. ,
:
for (var i=0, len=items.length; i < len; i++){
process(items[i]);
}
-
processQ, items
149
}
}, 25);
,
. setTimeout() ,
. todo.shiftQ
.
processQ.
. todo ,
. ,
, setTimeout()
arguments, callee. ,
.
, callback().
.
25 ,
.
, , .
:
150
6.
function processArray(items, process, callback){
var todo = items.concat(); //
setTimeout(function(){
process(todo.shift());
if (todo.length > 0){
setTimeout(arguments.callee, 25);
> else {
callback(items);
>
>, 25);
>
processArrayQ, , ,
,
: ,
,
.
:
var items = [123, 789, 323, 778, 232, 654, 219, 543, 321, 160];
function outputValue(value){
console.log(value);
>
processArray(items, outputValue, function(){
console.log("Done!);
>);
processArrayQ
. ,
, ,
.
. ,
, -
.
,
, - .
.
, -
151
, .
,
,
. ,
. :
function saveDocument(id){
//
openDocument(id)
writeText(id);
closeDocument(id);
// ,
updateUI(id);
}
,
,
. ,
,
:
function saveDocument(id){
var tasks = [openDocument, writeText, closeDocument, updateUI];
setTimeout(function(){
//
var task = tasks.shift();
task(id);
//
if (tasks.length > 0){
setTimeout(arguments.callee, 25);
}
}, 25);
}
tasks
. ,
, ,
, .
,
:
function multistep(steps, args, callback){
var tasks = steps.concat(); //
setTimeout(function(){
152
6.
//
var task = tasks.shift();
task.apply(null, args || []);
//
if (tasks.length > 0){
setTimeout(arguments.callee, 25);
} else {
callback();
}
}, 25);
}
multistepO : ,
,
.
:
function saveDocument(id){
var tasks = [openDocument, writeText, closeDocument, updateUI];
multistep(tasks, [id], function(){
alertf'Save completed!);
});
}
, multistepO
,
id. ,
,
.
. 1000 ,
1 .
25 ,
(25 4- 1)1000 = 26000 26 .
50
25 ? (1000/50)44425
4- 4-1000 = 1500 1,5 ,
,
50 .
, .
100 ,
JavaScript, . -
153
JavaScript 50 ,
,
,
.
Date.
:
var start = +new Date(),
stop;
someLongProcess();
stop = +new Date();
if(stop-start < 50){
alert("Just about right.");
} else {
alert(Taking too long.");
}
Date
,
, Date
. (+) Date
,
.
, .
processArrayQ
, :
function timedProcessArray(items, process, callback){
var todo = items.concat(); //
setTimeout(function(){
var start = +new Date();
do {
process(todo.shift());
} while (todo.length > 0 && (+new Date() - start < 50));
if (todo.length > 0){
setTimeout(arguments.callee, 25);
} else {
callback(items);
}
}, 25 );
154
6.
do-while
.
,
, .
Firefox 3 1000
, processQ , 38-43 ;
processArrayQ
25000 .
.
,
.
,
,
.
.
,
.
, ,
. (Neil
Thomas) Google Mobile ,
Gmail iPhone Android .1
, -
-
-.
,
,
.
( 100 200 ),
, Gmail
.
, -
.
,
.
1 http://googlecode.blogspot.comt/2009,/07/
gmail-for-mobile-html5-series-using.html.
155
JavaScript ,
.
(Web Workers API) ,
, ,
. Web
Workers API HTML 5,
(http://www.w3.org/TR/
workers/).
Firefox 3.5, Chrome 3 Safari 4.
- ,
Worker ,
JavaScript. ,
, ,
, ,
.
,
. , JavaScript-
, ,
,
.
,
DOM -
, ,
,
JavaScript.
:
navigator, : appName, appVersion, userAgent platform.
location ( , window, ,
).
self, .
importScriptsQ JavaScript-,
.
, ECMAScript,
Object, Array, Date .
XMLHttpRequest().
156
6.
setTimeoutQ setlntervalQ.
close(), .
,
JavaScript. JavaScript, ,
. ,
URL- JavaScript-:
var worker = new Worker(code.js");
. ,
,
.
-
. -
,
postMessageQ,
.
onmessage. :
var worker = new Worker("code.js");
worker.onmessage = function(event){
alert(event.data);
};
worker.postMessage("Nicholas");
message.
onmessage data,
.
-
postMessageQ:
// code.js
self.onmessage = function(event){
self.postMessage("Hello, " + event.data + "!");
};
onmessage worker.
- .
postMessageQ
: (, ,
, null undefined), Object Array;
.
,
157
.
,
,
.
.
Safari 4
postMessageQ .
,
Firefox 3.5.
JavaScript-
importScriptsQ,
URL- JavaScript-, .
importScripts() ,
.
,
. :
// code.js
importScripts("file1.js", "file2.js");
self.onmessage = function(event){
self.postMessage(Hello, " + event.data + !");
};
JavaScript-,
.
,
.
, -
,
.
JSON ( JSON
7). , ,
500 . ,
JavaScript- ,
.
,
158
6.
.
-:
var worker = new Worker("jsonparser.js");
// ,
worker.onmessage = function(event){
// JS0N,
var jsonData = event.data;
// JSON
evaluateData(jsonData);
>;
// JSON
worker.postMessage(jsonText);
,
JSON :
// jsonparser.js
// JS0N
self.onmessage = function(event){
// JS0N event.data
var jsonText = event.data;
//
var jsonData = JSON.parse(jsonText);
//
self.postMessage(jsonData);
};
, JSON.parseQ 500
,
,
.
, ,
, .
JSON
postMessageQ.
event.data onmessa
ge . JSON
postMessageQ
.
onmessage event.data.
, Fire
fox 3.5 , Safari 4 Chrome 3
.
159
-
,
. :
(
)
100 , ,
, . , ,
.
JavaScript
,
. ,
,
JavaScript, .
,
JavaScript ,
. :
JavaScript-
100 .
.
- ,
JavaScript-.
,
.
,
.
-
,
JavaScript
.
-,
.
,
.
7
Ajax
(Ross Harmes)
Ajax
JavaScript-.
.
,
.
HTTP-.
,
.
,
.
Ajax -
;
.
,
.
.
161
:
XMLHttpRequest (XHR)
<script>
<if rame>
Comet
XHR
JavaScript-
: XHR,
<script>
XHR. Comet <if rame> (
)
, .
XMLHttpRequest
,
XMLHttpRequest (XHR),
.
. (GET POST)
, , ,
,
. :
var url = /data.php';
var params = [
id=934875,
,limit=20
];
var req = new XMLHttpRequestO;
req.onreadystatechange = function() {
if (req.readyState === 4) {
var responseHeaders = req.getAllResponseHeaders(); //
var data = req.responseText;
//
// ...
}
}
req.open(GET, url + ? + p a r a m s . j o i n ( , true);
req.setRequestHeader(X-Requested-With', 'XMLHttpRequest'); //
//
req.send(null); //
162
7. Ajax
, URL- . 4
readyState ,
.
3 readyState.
:
req.onreadystatechange = function() {
if (req.readyState === 3) {
// ,
var dataSoFar = req.responseText;
}
else if (req.readyState === 4) { //
var data = req.responseText;
}
}
- ,
XHR, .
XHR ,
, IE
readyState 3,
. ,
, , XML; ,
.
, XHR
.
.
POST GET XHR.
XHR,
, , POST GET. ,
( ),
GET. GET- ,
.
POST- ,
URL- 2048
. , Internet
Explorer URL-
.
163
<script>
XHR: .
;
JavaScript <script>
source URL- .
var scriptElement = document.createElement('script);
scriptElement.src = *http://any-domain.com/javascript/lib.js';
document.getElementsByTagName(head)[0].appendChild(scriptElement);
<script>
, XHR.
.
GET - POST .
;
,
. ,
.
.
.
<script>, JavaScript.
XML-
JSON; , ,
.
var scriptElement = document.createElement('script');
scriptElement.src = 'http://any-domain.com/javascript/lib.js';
document.getElementsByTagName('head')[0].appendChild(scriptElement);
function jsonCallback(data) {
// ...
}
lib.js jsonCallback:
jsonCallback({ "status: 1, "colors": [ "#fff", "#000, "tfffOOOO" ] });
,
.
JavaScript; ,
.
,
.
<script> XHR
JSON.
. JavaScript
164
7. Ajax
, , ,
<script>,
. :
,
. ,
, .
XHR
XHR
;
, HTTP-.
( CSS, HTML,
JavaScript , base64)
,
. JavaScript-
MIME-
, .
.
:
var req = new XMLHttpRequest();
req.open(GET*, rollup.images.php*, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
splitlmages(req.responseText);
}
};
req.send(null);
.
rollup_images.php,
splitlmagesQ.
:
// base64.
Simages = (kitten.jpg, sunset.jpg, 'baby.jpg);
foreach (Simages as Simage) {
$image_fh = fopen($image, );
$image_data = fread($image_fh, filesize(Simage));
fclose($image_fh);
$payloads[] = base64_encode($image_data);
165
}
}
// .
Snewline = chr(1); // ,
// base64
echo implode(Snewline, Spayloads);
base64.
,
1 , .
splitImagesQ:
function splitlmages(imageString) {
var imageData = imageString.split("\u0001");
var imageElement;
for (var i = 0, len = imageData.length; i < len; i++) {
imageElement = document.createElement(img');
imageElement.src = data:image/jpeg;base64,' + imageData[i];
document.getElementByld(container).appendChild(imageElement);
}
}
.
, .
base64
;
URL- data: MIME- image/jpeg.
,
HTTP-. 20
100 ; ,
HTTP-.
.
JavaScript-, CSS-,
HTML .
, JavaScript-
. ,
JavaScript, CSS
, :
function handleImageData(data, mimeType) {
var img = document.createElement(img);
166
7. Ajax
img.src = 'data:' + mimeType + ;base64, + data;
return img;
}
function handleCss(data) {
var style = document.createElement(style*);
style.type = text/css;
var node = document.createTextNode(data);
style.appendChild(node);
document.getElementsByTagName(head)[0].appendChild(style);
}
function handleJavaScript(data) {
eval(data);
}
, ,
. ,
readyState 3:
var req = new XMLHttpRequestQ;
var getLatestPacketlnterval, lastLength = 0;
req.open(GET, rollup.images.php, true);
req.onreadystatechange = readyStateHandler;
req.send(null);
function readyStateHandler{
if (req.readyState === 3 && getLatestPacketlnterval === null) {
//
getLatestPacketlnterval = window.setInterval(function() {
getLatestPacket();
}, 15);
}
if (req.readyState === 4) {
//
clearlnterval(getLatestPacketlnterval);
//
getLatestPacket();
}
}
function getLatestPacket() {
167
}
readyState 3,
. 15
.
, -,
.
XHR ,
.
http://techfoolery.com/mxhr/.
,
, ,
, . - CSS-
,
. ,
JavaScript-.
, .
3
readyState URL- data: Internet Exp
lorer. Internet Explorer 8 ,
Internet Explorer 6 7
.
, , ,
:
,
(
), .
, JavaScript- CSS, ,
HTTP-;
,
,
.
HTTP- Ajax,
. ,
100 -
168
7. Ajax
.
,
4 10
.
, http://
techfoolery.com/mxhr/.
, .
,
, ,
.
, : XHR
.
XMLHttpRequest
XHR -
, .
GET- POST-,
HTTP-. .
XHR ,
URL-.
POST-:
var url = /data.php;
var pa rams = [
id=934875\
'limit=20'
];
var req = new XMLHttpRequestO;
req.onerror = function() {
// .
};
req.onreadystatechange = function() {
if (req.readyState == 4) {
// .
}
};
req.open(POST, url, true);
req.setRequestHeader(Content-Type, 'application/x-www-form-urlencoded);
var data = params.join(&");
req. setRequestHeader(Content-Length", data, length);
req.send(data);
169
,
. , XHR
.
,
, :
function xhrPost(url, params, callback) {
var req = new XMLHttpRequest();
req.onerror = function() {
setTimeout(function() {
xhrPost(url, params, callback);
}, 00);
};
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (callback && typeof callback === function) {
callback();
}
}
};
req.open(POST, url, true);
req.setRequestHeader(Content-Type, application/x-www-form-urlencoded);
var data = params.join( ) ;
req. setRequestHeader("Content-Length", data, length);
req.send(data);
}
XHR,
GET.
- GET-
. POST-, ,
:
, - POST-. POST-
, -,
, -, -
URL- Internet Explorer,
GET-.
<script>. JavaScript- Image,
src URL- . URL- GET-,
170
7. Ajax
-. ,
<img> DOM.
var url = '/status_tracker.php*;
var params = [
'step=2',
time=1248027314'
];
(new Image()).src = url + '? + p a r a m s . j o i n ( );
-
,
.
. ,
.
.
POST-,
,
URL-.
, .
load Image,
.
,
( ),
. , , 1,
, 2 , - .
,
204 No Content .
,
:
var url = /status_tracker.php';
var params = [
step=2\
time=1248027314
];
var beacon = new Image();
beacon.src = url + ? + params.join(
beacon.onload = function() {
if (this.width == 1) {
// .
}
else if (this.width == 2) {
// ; .
171
beacon. = function() {
// ; , .
};
.
,
.
,
.
XHR.
(, ),
.
: ,
, (
).
- .
,
. ,
, ,
- .
,
. :
, ,
JavaScript
.
,
.
XML
Ajax ,
XML.
: (
, ),
. JSON
,
XML.
,
XML:
172
7. Ajax
<?xml version="1.0" encodingsUTF-8?>
<users total="4">
<user id='T>
<username>alice</username>
<realname>Alice Smith</realname>
<email>alice@alicesmith.com</email>
</user>
<user id=,,2>
<username>bob</username>
<realname>Bob Jones</realname>
<email>bob@bobjones.com</email>
</user>
<user id="3">
<username>carol</username>
<realname>Carol Williams</realname>
<email>carol@carolwilliams.com</email>
</user>
<user id=4">
<username>dave</username>
<realname>Dave Johnson</realname>
<email>dave@davejohnson.com</email>
</user>
</users>
, XML
.
,
. , XML .
, XML
-
? -
,
?
,
XML-.
XML
JavaScript .
,
JavaScript.
,
.
XML- :
function parseXML(responseXML) {
var users = [];
var userNodes = responseXML.getElementsByTagName('users);
var node, usernameNodes, usernameNode, username,
173
realnameNodes, realnameNode, realname,
emailNodes, emailNode, email;
for (var i = 0, len = userNodes.length; i < len; i++) {
node = userNodes[i];
username = realname = email = ;
usernameNodes = node.getElementsByTagName('username);
if (usernameNodes && usernameNodes[0]) {
usernameNode = usernameNodes[0];
username = (usernameNode.firstChild) ?
usernameNode.firstChild.nodeValue :
}
realnameNodes = node.getElementsByTagName(realname);
if (realnameNodes && realnameNodes[0]) {
realnameNode = realnameNodes[0];
realname = (realnameNode.firstChild) ?
realnameNode.firstChild.nodeValue : ;
}
emailNodes = node.getElementsByTagName(email);
if (emailNodes && emailNodes[0]) {
emailNode = emailNodes[0];
email = (emailNode.firstChild) ?
emailNode.firstChild.nodeValue : ;
}
users[i] = {
id: node.getAttribute(id),
username: username,
realname: realname,
email: email
};
}
return users;
}
,
, .
XML.
<user>.
. ,
:
<?xml version=1.0" encoding='UTF-8'?>
<users total="4">
<user id="1" username="alice" realname=Alice Smith
email=alice@alicesmith.com />
174
7. Ajax
<user id="2M username="bob" realname="Bob Jones
email="bob@bobjones.com" />
<user id="3 username=carol" realname="Carol Williams"
email="carol@carolwilliams.com" />
<user id="4" username="dave" realname="Dave Johnson"
email="dave@davejohnson.com" />
</users>
XML- :
function parseXML(responseXML) {
var users = [];
var userNodes = responseXML.getElementsByTagName('users');
for (var i = 0, len = userNodes.length; i < len; i++) {
users[i] = {
id: userNodes[i].getAttribute( 'id'),
username: userNodes[i].getAttribute('username*),
realname: userNodes[i].getAttribute('realname*),
email: userNodes[i].getAttribute('email')
};
}
return users;
XPath
XPath ,
, X Path
XML-
getElementsByTagNameQ.
,
DOM.
DOM Level 3 XPath Firefox, Safari, Chrome Opera.
Internet Explorer 8 ,
.
,
XML.
XML
582960
999,4
343,1
1342,5
437960
XML
475,1
83,1
558,2
175
^ |
,
.
XML- DOM
.
XML?
,
. ,
.
,
.
XML, ,
. ,
, X Path
,
( - ,
DOM Level 3 XPath, - Internet
Explorer 8 - ).
XML ,
,
. XML
, Ajax.
JSON
(Doug
las Crockford) JSON
,
JavaScript.
JSON:
[
{ "id: 1, "username": "alice, "realname": "Alice Smith",
"email": "alice@alicesmith.com" },
{ "id": 2, "username": "bob", "realname": "Bob Jones",
"email": "bob@bobjones.com },
{ "id": 3, "username": "carol", "realname": "Carol Williams",
"email": "carol@carolwilliams.com" },
{ "id": 4, "username": "dave", "realname": "Dave Johnson",
176
7. Ajax
"email": "dave@davejohnson.com" }
]
,
,
JavaScript. , evalQ
JSON
Java
Script.
JSON, JavaScript
evalQ:
function parseJSON(responseText) {
return eval((' + responseText + ')*);
}
|
|
1>
XML,
.
(
) :
[
{ "i:1, "u: "alice", "": "Alice Smith", "": "alice@alicesmith.com" },
{ "i": 2, "": "bob", "": "Bob Jones", "": "bob@bobjones.com" },
{ "i": 3, "": "carol", ": "Carol Williams",
"e": "carol@carolwilliams.com" },
{ "i": 4, "u": "dave", "r": "Dave Johnson", "e": "dave@davejohnson.com" }
]
, ,
, .
. -
, , ,
:
JSON.
177
[
[
[
[
[
1,
2,
3,
4,
]
. ,
, ,
JSON:
function parseJSON(responseText) {
var users = [];
var usersArray = eval('( + responseText + )');
for (var i = 0, len = usersArray.length; i < len; i++) {
users[i] = {
id: usersArray[i][0],
username: usersArray[i][1],
realname: usersArray[i][2],
email: usersArray[i][3]
};
}
return users;
}
evalQ.
. ,
evalQ
.
JSON,
XHR.
JSON
487895
527,7
26,7
554,4
392895
JSON
498,7
29,0
527,7
JSON 292895
305,6
18,6
324,0
JSON- :
,
.
5000 ,
30% .
178
7. Ajax
JSON-P
, JSON
JavaScript,
. XHR
JSON .
evalQ
.
<script> JSON
JavaScript- Java
Script.
. JSON with padding
(JSON ), JSON-.
JSON-P:
parseJSON([
{ "id: 1, "username": "alice", "realname": "Alice Smith",
"email": "alice@alicesmith.com" },
{ "id": 2, "username": "bob", "realname": "Bob Jones",
"email": "bob@bobjones.com" },
{ "id": 3, "username": "carol", "realname": "Carol Williams",
"email": "carol@carolwilliams.com" },
{ "id": 4, "username": "dave", "realname": "Dave Johnson",
"email": "dave@davejohnson.com" }
]);
JSON-P
-,
.
JavaScript,
.
JSON, JSON-P.
JSON-P
487913
598,2
0,0
598,2
JSON-P
392913
454,0
3,1
457,1
JSON-P 292912
316,0
3,4
319,4
,
XHR, , ,
10 .
JSON- ,
- .
179
- JSON-
JSON-,
,
JSON- .
JSON-
. ,
JSON, XHR,
.
, 10000 100000
, JSON-P.
JSON-, :
JSON-
JavaScript,
-
<script>. JSON,
, Java
Script, evalQ,
XHR.
JSON-,
,
URL- cookies.
JSON?
JSON XML.
. , ,
. JSON
/
.
,
,
. -
, ,
. JSON
Ajax,
<script>.
HTML
HTML .
HTML
JavaScript,
180
7. Ajax
. , ,
, HTML
, . JavaScript- ,
innerHTML . ,
HTML:
<ul class="users">
<li class="user" id="1">
<a href="http://www.site.com/alice/ class="username>alice</a>
<span class=,,realname,>Alice Smith</span>
<a href="mailto:alice@alicesmith.com"
class="email">alice@alicesmith.com</a>
</li>
<li class="user" id="2">
<a href="http://www.site.com/bob/" class="username">bob</a>
<span class="realname">Bob Jones</span>
<a href="mailto:bob@bobjones.com" class="emair'>bob@bobjones.com</a>
</li>
<li class="user" id="3">
<a href="http://www.site.com/carol/" class=username">carol</a>
<span class="realname">Carol Williams</span>
<a href="mailto:carol@carolwilliams.com"
class="email">carol@carolwilliams.com</a>
</li>
<li class="user" id="4">
<a href="http://www.site.com/dave/" class="username">dave</a>
<span class="realname">Dave Johnson</span>
<a href="mailto:dave@davejohnson.com"
class="email">dave@davejohnson.com</a>
</li>
</ul>
, HTML
,
, XML.
HTML-, id,
class . , HTML
, ,
,
. ,
,
.
, , JSON,
,
.
,
HTML
181
CPU. ,
JavaScript .
, HTML
. - ,
,
:
document.getElementById(data-container).innerHTML = req.responseText;
HTML
. :
HTML
DOM. , HTML
,
JavaScript-.
HTML
1063416
273,1
121,4
394,5
, HTML
, , ,
. HTML
DOM ,
;
,
.
,
, HTML-,
. ,
, HTML
.
,
,
. ,
-:
Jacob;Michael;Joshua;Matthew;Andrew;Christopher;Joseph;Daniel;Nicholas;
Ethan;William;Anthony;Ryan;David;Tyler;John
- ,
, .
-,
. ,
-:
182
7. Ajax
1:alice:Alice Smith:alice@alicesmith.com;
2:bob:Bob Jones:bob@bobjones.com;
3:carol:Carol Williams:carol@carolwilliams.com;
4:dave:Dave Johnson:dave@davejohnson.com
( ,
, ).
;
split(), - .
- ,
( ,
JavaScript ). splitQ
10000 + .
:
function parseCustomFormat(responseText) {
var users = [];
var usersEncoded = responseText.split(
var userArray;
for (var i = 0, len = usersEncoded.length; i < len; i++) {
userArray = usersEncoded[i].split(':
users[i] = {
id: userArray[0],
username: userArray[1],
realname: userArray[2],
email: userArray[3]
};
}
return users;
}
.
,
.
ASCII-, ,
. ,
, ASCII- :
function build_format_custom($users) {
$row_delimiter = ch (1);
// \u0001 JavaScript.
183
$field_delimite = chr(2); // \u0002 JavaScript.
Soutput = array();
foreach (Susers as Suser) {
Sfields = array($user['id'], $user['username'], $user['realname'],
$user['email']);
$output[] = implode($field_delimiter, Sfields);
}
return implode($row_delimiter, Soutput);
}
JavaScript
(, \u0001). splitQ
, .
, ,
-;
, IE split()
, .
.
// ,
var rows = req.responseText.split(/\u0001/);
// - ( ),
var rows = req.responseText.split(\u0001");
XHR <script>:
(XHR)
222892
63,1
14,5
77,6
222912
(<script>)
66,3
11,7
78,0
- XHR
<script>. ,
.
, JSON
, .
.
184
7. Ajax
;
JSON
-.
,
:
JSON-
<script>.
, JavaScript,
.
,
.
-, XHR
<script>
splitQ.
, ,
JSON-,
.
. 7.1
(
), ,
.
HTML,
. ,
.
XML
582960
999,4
343,1
1342,5
JSON-P
487913
598,2
0,0
598,2
XML
437960
475,1
83,1
558,2
JSON
487895
527,7
26,7
554,4
JSON
392895
498,7
29,0
527,7
JSON-P 392913
454,0
3,1
457,1
JSON
292895
305,6
18,6
324,0
JSON-P
292912
316,0
3,4
319,4
(<script>)
222912
66,3
11,7
78,0
(XHR)
222892
63,1
14,5
77,6
185
Ajax
XML
JS0N-P
XML (XHR)
JSON (XHR)
JSON (XHR)
JS0N-P
JSON (XHR)
JS0N-P
(<script>)
(XHR)
200
400
()
600
800
1000
1200
1400
()
. 7.1.
,
.
,
. ,
http://techfoolery.com/formats/.
Ajax
,
.
,
,
.
Ajax- - , .
:
HTTP- ,
.
,
.
, .
186
7. Ajax
HTTP-
, Ajax-,
GET. GET- ; ,
HTTP-. Expires ,
. ,
URL-
, . ,
Expires:
Expires: Mon, 28 Jul 2014 23:30:00 GMT
Expires ,
2014 . Expires
,
, .
Expires GMT.
:
Slifetime = 7 * 24 * 60 * 60; / / 7 , .
header('Expires: ' . gmdate(D, d Y H:i:s', time() + Slifetime) . ' GMT');
,
7 . Expires
, Slifetime
. Expires,
, 10 :
Slifetime = 10 * 365 * 24 * 60 * 60; // 10 , .
header('Expires: ' . gmdate(D, d Y H:i:s', time() + Slifetime) . ' GMT');
Expires
Ajax- .
-
Ajax-
, ,
. ,
,
.
.
,
,
.
,
URL-, .
XHR,
Ajax
187
URL-
:
var localCache = {};
function xhrRequest(url, callback) {
// URL.
if (localCache[url]) {
callback.success(localCache[url]);
return;
}
// , .
var req = createXhrObject();
req.onerror = function() {
callback.error();
};
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.responseText === || req.status == 404') {
callback.error();
return;
}
// .
localCache[url] = req.responseText;
callback.success(req.responseText);
}
};
req.open("GET", url, true);
req.send(null);
}
Expires
.
.
,
. ,
,
,
, .
:
188
7. Ajax
delete localCache[/user/friendlist/];
delete localCache[/user/contactlist/*];
, -
.
,
, .
Ajax
Ajax JavaScript-.
.
,
XHR , .
, ,
.
XMLHttpRequest .
, , ,
XHR.
.
, readyState 3,
,
.
,
. JavaScript-
readystatechange, ,
( ),
- .
XMLHttpRequest
, .
,
XMLHttpRequest,
readyState. IE
.
, XHR,
( ,
YUI 2 Connection Manager):
function createXhrObject() {
var msxml_progid = [
'MSXML2.XMLHTTP.6.0',
189
'MSXML3.XMLHTTP',
Microsoft.XMLHTTP, // 3 readyState.
MSXML2.XMLHTTP.3.O // 3 readyState.
];
var req;
try {
req = new XMLHttpRequest(); // .
}
catch(e) {
for (var i = 0, len = msxml_progid.length; i < len; ++i) {
try {
req = new ActiveXObject(msxml_progid[i]);
break;
}
catch(e2) { }
}
}
finally {
return req;
}
}
XMLHttpRequest, 3 readyState,
, .
XHR
.
Ajax, ,
.
Ajax-
.
, HTML,
,
. XML
,
,
. JSON , (
, )
, XML.
, -,
190
7. Ajax
,
.
XHR
,
, ,
,
. <script>,
,
JavaScript
JSON,
.
XHR
;
,
.
Image.
, XHR
POST-.
,
Ajax-:
, JavaScript- CSS- .
Ajax
,
.
.
,
Ajax, -
.
Ajax
, -,
, -,
,
,
.
XHR
,
- .
8
,
,
. ,
.
2005 , Ajax, -
JavaScript
, -.
, , .
- JavaScript .
JavaScript
. :
evalQ, FunctionQ, setTimeoutQ
setlnterval().
JavaScript . :
var num1 = 5,
num2 = 6,
// eval()
result = eval("num1 + num2),
// Function()
sum = new Function(arg1, "arg2, "return arg1 + arg2);
// setTimeout()
setTimeout("sum = num1 + num2", 100);
192
8.
// setlnterval()
setlntervalCsum = num1 + num2", 100);
,
.
, ,
.
,
.
:
, ,
evalQ.
:
//
var item = array[0];
//
var item = eval("array[0]");
,
10000 evalQ.
. 8.1 , .
8.1. 10000
eval()
()
eval() ()
Firefox 3
10,57
822,62
Firefox 3.5
0,72
141,54
Chrome 1
5,7
106,41
Chrome 2
5,17
54,55
5086,13
420,55
Opera 9.64
2,01
402,82
Opera 10 Beta
10,52
315,16
Safari 3.2
30,37
360,6
Safari 4
22,16
54,47
/ evalQ.
FunctionQ, setTimeoutQ setIntervalQ, .
193
eval() Function()
, ,
. , setTimeout() setlntervalQ,
,
. :
setTimeout(function(){
sum = num1 + num2;
},
) ;
setInterval(function(){
sum = num1 + num2;
}, 100);
JavaScript.
JavaScript
4 eval().
.4*
Safari 4 Chrome.
/
JavaScript
, ,
.
:
//
var myObject = new Object();
myObject.name = "Nicholas";
myObject.count = 50;
myObject.flag = true;
myObject.pointer = null;
//
var myArray = new ArrayO;
myArray[0] = "Nicholas";
myArray[1] = 50;
myArray[2] = true;
myArray[3] = null;
,
. ,
,
.
, :
194
8.
//
var myObject = {
name: "Nicholas,
count: 50,
flag: true,
pointer: null
};
//
var myArray = ["Nicholas", 50, true, null];
,
,
( Firefox 3.5 ).
.
-
. :
, ,
.
.
,
.
,
.
.
. ,
, :
function addHandler(target, eventType, handler){
if (target.addEventListener){ // D0M2 Events
target.addEventListener(eventType, handler, false);
} else { // IE
target.attachEvent("on" + eventType, handler);
}
}
function removeHandler(target, eventType, handler){
if (target.removeEventListener){ // D0M2 Events
target.removeEventListener(eventType, handler, false);
} else { // IE
target.detachEvent("on" + eventType, handler);
}
}
195
-
.
,
, .
,
,
. ,
:
function addHandler(target, eventType, handler){
//
if (target.addEventListener){ // D0M2 Events
addHandler = function(target, eventType, handler){
target.addEventListener(eventType, handler, false);
};
} else { // IE
addHandler = function(target, eventType, handler){
target.attachEventC'on" + eventType, handler);
};
}
//
addHandler(target, eventType, handler);
}
function removeHandler(target, eventType, handler){
196
8.
//
if (target.removeEventListener){ // D0M2 Events
removeHandler = function(target, eventType, handler){
target.addEventListener(eventType, handler, false);
};
} else { // IE
removeHandler = function(target, eventType, handler){
target.detachEvent("on" + eventType, handler);
};
}
//
removeHandler(target, eventType, handler);
}
.
.
,
.
.
addHandlerQ removeHandler() ,
.
, ,
,
.
, .
,
.
,
, .
,
. :
var addHandler = document.body.addEventListener ?
function(target, eventType, handler){
target.addEventListener(eventType, handler, false);
}:
function(target, eventType, handler){
target.attachEvent("on" + eventType, handler);
};
var removeHandler = document.body.removeEventListener ?
function(target, eventType, handler){
target.removeEventListener(eventType, handler, false);
}:
197
};
addEventListener() removeEventListenerQ
. ,
,
DOM Level 2 Events, ,
IE.
addHandler() removeHandler()
, .
,
.
,
.
,
.
JavaScript ,
.
, JavaScript
.
JavaScript,
,
. ,
,
.
JavaScript. ,
,
.
JavaScript, .
JavaScript 64- IEEE-754.
32- .
32- .
,
JavaScript
.
198
8.
, ,
,
, toStringO,
2. :
var num1 = 25,
num2 = 3;
alert(num1.toString(2)); // "11001"
alert(num2.toString(2)); // "11"
.
JavaScript :
(AND)
1 ,
1 .
(OR)
1 ,
1 .
(XOR)
1 ,
1 .
(NOT)
1 , 0
, .
, :
// (AND)
var result1 = 25 & 3; //1
alert(resultl.toString(2)); // "1"
// (OR)
var result2 = 25 | 3; //27
alert(result2.toString(2)); // "11011"
// (XOR)
var result3 = 25 " 3; //26
alert(result3.toString(2)); // "11010"
// HE (NOT)
var result4 = 25; //-26
alert(result4.toString(2)); // "-11010"
Ja
vaScript .
.
2 , :
199
}
//
}
2
2. 32- ,
, , ,
- 1.
(AND) 1.
, (AND) 1
0 ; ,
(AND) 1 1. ,
:
for (var i=0, len=rows.length; i < len; i++){
if (i & 1) {
className = "odd";
} else {
className = "even";
}
//
}
,
50%
( ).
.
,
, .
,
,
. , ,
, 2. :
var
var
var
var
var
0PTI0N_A
0PTI0N_B
0PTI0N_C
0PTI0N_D
0PTI0N_E
=
=
=
=
=
1;
2;
4;
8;
16;
,
(OR) , :
var options = 0PTI0N_A | 0PTI0N_C | 0PTI0N_D;
200
8.
(AND). 0,
, :
// ?
if (options & 0PTI0N_A){
//
}
// ?
if (options & 0PTI0N_B){
//
}
, ,
, , ,
.
,
,
.
JavaScript
( ), ( ) > (
).
,
, ,
JavaScript. : , , , C++.
,
,
JavaScript.
JavaScript,
Math. Math ,
.
:
Math.E
Math.LN10
10
Math.LN2
Math.L0G2E
Math.L0G10E
Math.PI
Math.SQRT1_2
]/2
2
Math.SQRT2
201
,
.
:
Math.abs(/7iy/7?)
Math.exp(/7iy/77)
Math.E"
Math.log(fliy/7?)
numpower
Math.sqrt(fliy/7?)
Math.acos(x)
Math.asin(x)
Math.atan(x)
Math.atan2(y,x)
Math.cos(x)
Math.sin(x)
Math.tan(x)
,
JavaScript.
,
Math.
,
DOM CSS-.
CSS- JavaScript
JavaScript- jQuery.
jQuery ,
.
querySelectorQ querySelectorAllQ
10 ,
JavaScript .1
1 SlickSpeed http://www2.webkit.org/perf/
slickspeed/.
202
8.
JavaScript-
, .
, ,
DOM.
, .
*#*
Chrome
JavaScript. Chrome
,
JavaScript,
.
JavaScript
, .
-
, ,
.
, :
evalQ FunctionQ. ,
setTimeoutQ setlntervalQ ,
.
.
,
.
.
,
.
,
.
,
JavaScript. ,
.
,
,
,
.
JavaScript
(Julien Lecomte)
, Exceptional Perform an
ce Yahoo! 2007 , 40-60% Yahoo!
20 %
(http://yuiblog.com/blog/2007/01/04/performanceresearch-part-2/). , ,
Search Yahoo!,
(Steve Souders) Google,
, 15% -
.
- JavaScript-.
, ,
, .
,
,
.
-
- JavaScript. ,
, Apache Ant -
, Java,
.
204
9.
, 5.
Apache Ant
Apache A nt 0http://ant.apache.org/ ) -
. make,
Java
XML-, make
Makefile. A nt - Apache Software Founda
tion (http://www.apache.org/licenses/ ).
A nt make
. A nt
,
.
A nt XML
build.xml.
. .
- ,
. A nt
.
,
Java Ant.
.
.
property A nt.
, ${ }.
.
(dist) Java,
, JAR.
<?xml version="1." encoding="UTF-8"?>
<project name="MyProject" default=*dist basedir=".">
<!-- -->
<property name="src location=,,src,,/>
<property name="build" location="build'7>
<property name=dist location="dist"/>
<target name="init">
<!-- -->
<tstamp/>
<!-- -->
<mkdir di="${build}/>
</target>
JavaScript-
205
Apache
Ant,
. Rake
(http://rake.rubyforge.org/)>
. Rake - Ruby,
make.
Rakefile (
Makefile, Rake),
Ruby
.
JavaScript-
Exceptional Performance
Yahoo!, , ,
- - ,
, - -,
(http://yuiblog.com/blog/2006/
ll/28/performance-research-part-l/).
,
,
.
-
JavaScript-: ,
-,
, -,
.
206
9.
CNN (http://www.cnn,com/)> ,
Prototype Script.aculo.us.
12 20
.
, ,
JavaScript-
HTTP-, .
Apache Ant
concat. ,
JavaScript-
.
filelist fileset. ,
Ant:
<target name="js.concatenate^
<concat destfile="${build.dir}/concatenated.js">
<filelist dir="${src.dir}"
files="a.js, b.js7>
<fileset dir=${src.dir}"
includes="*.js"
excludes="a.js, b.js"/>
</concat>
</target>
concatenated.js ,
a.js b.js
, ,
.
: -
( )
,
.
, A nt fixlastline
:
<concat destfile="${build.dir}/concatenated.js" fixlastline="yes">
</concat>
JavaScript-
- ,
,
(, ).
, ,
().
JavaScript-
207
; ,
,
.
- http:/lru.wikipedia.org/wiki/
JavaScript-
-, ,
, , .
- ,
JavaScript,
, ,
,
,
JavaScript.
JavaScript,
(). ,
Ant:
<target name="js.preprocess" depends=js.concatenate^
<apply executable="cpp" dest="${build.dir}">
<fileset dir="${build.dir}"
includes=concatenated. js"/>
<arg line=-P -C -DDEBUG"/>
<srcfile/>
<targetfile/>
<mapper type=glob"
from="concatenated. js"
to="preprocessed.js"/>
</apply>
</target>
, js.concatenate,
preprocessed.js ,
.
,
- ( ) - (
). DEBUG.
(#define, #undef) (#if, #ifdef,
#ifndef, #else, #elif, #endif) JavaScript-,
( )
:
#ifdef DEBUG
(new YAHOO.util.YUILoader({
require: [/profiler],
onSuccess: function(o) {
208
9.
YAHOO.tool.Profiler.registerFunction(/foo, window);
}
})).insert();
#endif
,
,
(LF) UNIX.
f ixcrlf
Ant.
,
, ,
Java
Script,
. include.js:
#ifndef _INCLUDE_JS_
define _INCLUDE_JS_
#ifdef DEBUG
function assert(condition, message) {
// , alert
// message, , .
}
#define ASSERT(, ...) assert(x, ## __VA_ARGS__)
#else
define ASSERT(x, ...)
#endif /* DEBUG */
#endif /* _INCLUDE_JS_ */
JavaScript:
include "include.js"
function myFunction(arg) {
ASSERT(YAHOO.lang.isString(argvar), "arg should be a string");
#ifdef DEBUG
YAHOO.log("Log this in debug mode only");
#endif
}
,
,
DEBUG, .
.
209
JavaScript-
JavaScript-
JavaScript- - , JavaScript- , .
.
,
.
.
JavaScript- JSMin (http://www.crockford.com/javascript/
jsm in.htm l), (Douglas Crockford).
-
, JavaScript
. ,
YUI Compressor (http://developer.yahoo.com/yui/compressor/ ),
, .
YUI Compres
sor :
(-, ) , gzip-.
,
(, foo[bar] foo.bar).
, ,
, (, CfooVbar"}
{foo:"bar}).
(,
aaaVbbb' "aaabbb").
(, foo+ bar" foobar ).
JavaScript- YUI Compressor
, JSMin, - .
YUI ( 2.7.0 http://developer.yahoo.com/yui/):
Raw yahoo.js, dom.js event.js
yahoo.js, dom.js event.js + JSMin
yahoo.js, dom.js event.js + YUI Compressor
192164
47316
35896
, YUI Com
pressor, 24% , ,
JSMin. ,
.
/, ,
210
9.
,
evalQ ( FunctionQ
setTimeoutQ setlntervalQ
), wit h JScript, .
, selected
DOM (220 ):
function toggle (element) {
if (YAHOO.util.Dom.hasClass(element, ,,selected,,)){
YAHOO.util.Dom.removeClass(element, "selected");
} else {
YAHOO.util.Dom.addClass(element, "selected");
}
}
YUI Compressor ,
(147 ):
function toggle(){if(YAHOO.util.Dom.hasClass(a,"selected")){
YAHOO.util.Dom.removeClass(a,"selected")}else{YAHOO.util.Dom.
addClass(a,"selected")}};
, YAHOO,
util. Dom
' selected, (232 ):
function toggle (element) {
var YUD = YAHOO.util.Dom, className = "selected";
if (YUD.hasClass(element, className)){
YUD.removeClass(element, className);
} else {
YUD.addClass(element, className);
}
}
YUI Compressor
(115 ):
function toggle(a){var c=YAH00.util.Dom,b="selected";if(c.hasClass(a,b)){
c.removeClass(a, b)}else{c.addClass(a,b)}};
33% 48%,
,
. , gzip-,
,
; ,
gzip-.
, .
,
- , ,
.
211
,
,
, gzip- (
).
2009 Google
Closure Compiler (http://code.google.com/closure/compiler/).
, YUI Compressor,
. Closure Compiler
.
,
. , ,
. Closure
Closure Inspector Firebug (http://code.google.
com/closure/compiler/docs/inspector.html\
.
Firefox,
,
,
, ,
.
, -
, . -
,
.
: ,
, .
Apache A nt
, ,
,
,
.
JavaScript-
- ,
HTTP- Accept-Encoding ( /1.1),
212
9.
.
.
Accept-Encoding : gzip, compress, deflate identity (
(Internet Assigned Numbers Authority, IANA)).
- ,
-
HTTP- Content-Encoding.
gzip .
70%,
-.
, gzip-
, JavaScript-.
, PDF-,
, ,
.
, - Apache (, ),
gzip-
mod_gzip ( Apache 1.3, http://www.schroepl.net/projekte/mod_gzip/), mod_deflate ( Apache 2).
, Search
Yahoo! Google, , 15%
, - ,
.
HTTP- Accept-Encoding ,
-,
. gzip- -,
.
JavaScript- ,
gzip-,
(
).
Packer (http://dean.edwards.name/packer/) - JavaScript-,
(Dean Edwards). Packer
JavaScript- , YUI Compressor.
, jQuery (
1.3.2, http://www.jquery.com/):
jQuery
jQuery + YUI Compressor
120180
56814
213
JavaScript-
jQuery + Packer
39351
jQuery + gzip
34987
19457
19228
gzip- jQuery,
Packer YUI Compressor,
. , Packer,
( 200 300
). YUI Compressor gzip-
. Packer
,
gzip-,
.
JavaScript-
.
JavaScript-
HTTP-
-. ,
- Yahoo! (http://www.yahoo.com/ )
90% HTTP-
83% , .
(
onload)
2,4 0,9 (http://yuiblog.eom/blog/2007/01/04/performance-research-part-2/).
,
, JavaScript-.
,
, - -
Expires. RFC 1123.
: Expires: Thu, 01 Dec 1994 16:00:00 GMT.
, - Expires
, .
HTTP 1.1 RFC (RFC 2616, 14.21), -
Expires ,
.
- Apache,
ExpiresDefault.
, JavaScript-
CSS:
<FilesMatch "\.(jpg|jpeg|png|gif|j s |css|htm|html)$">
ExpiresActive on
214
9.
ExpiresDefault "access plus 1 year"
</FilesMatch>
,
, . , - Safari
iPhone , 25
(http://yuiblog.com/blog/2008/02/06/iphone-cacheability/ )
15 iPhone 3.0 OS.
HTTP-
.
, ,
JavaScript-.
,
, HTML 5 Fi
refox 3.5, Safari 4.0 iPhone iPho
ne OS 2.1.
, .
manifest <html> (
D0CTYPE, HTML 5):
<!DOCTYPE html>
<html manifest="demo.manifesto
,
,
MIME- text/cache-manifest.
- -
W3C: http://www.w3.org/TR/html5/offline.htmL
,
,
: ,
.
.
. .
.
A nt. JavaScript, yyyyMMddhhmm:
<target name="js.">
<!-- -->
<tstamp/>
215
JavaScript-
JavaScript-pecypcoB
.
CDN.
Apache A nt
.
FTP SCP.
216
9.
scp,
.
:
<apply executable="scp" failonerror="true" parallel=,,true">
<fileset dir=${build.dir} includes="*.js/>
<srcfile/>
<arg line=${live. server} :/var/www/html/7>
</apply>
, ,
SSH,
SSHEXEC ssh
, ,
- Apache UNIX:
< executable="ssh failonerror="true>
<arg line="${live.server}7>
<arg line="sudo service httpd restart"/>
</exec>
JavaScript-
, -
-
.
. , ,
,
-. ,
,
-
.
smasher - , 5
, Search Yahoo!.
JavaScript-,
.
-.
, http://github.com/jlecomte/
smasher, :
smasher.php
.
smasher.xml
JavaScript-
217
smasher
.
smasher_web.php
-.
smasher XML- ,
, ,
.
:
<?xml version="1." encoding="utf-8"?>
<smasher>
<temp_di r>/tmp/</temp_di r>
<root_dir>/home/jlecomte/smasher/files/</root_dir>
<java_bin>/usr/bin/java</java_bin>
<yuicompressor>
/home/jlecomte/smasher/yuicompressor-2-4-2.jar</yuicompressor>
<group id="yui-core">
<file type="css" src="reset.css />
<file type="css" src="fonts.css" />
<file type="js" src="yahoo.js" />
<file type="js" src="dom.js" />
<file type="js" src="event.js" />
</group>
<group id="another-group">
<file type="js" src="foo.js" />
<file type="js" src="bar.js" />
<macro name="DEBUG" value="1" />
</group>
</smasher>
,
, (
218
9.
: yui-core), ,
(, yui-core-200907191539.js).
smasher
- ,
smasher_web.php -
URL-:
http://<host>/smasher_web.php?conf=smasher.xml&group=yui-core&type=css&nominify
,
JavaScript.
:
JavaScript-
-.
JavaScript- YUI Compressor.
JavaScript- (
gzip-).
JavaScript-
HTTP-
.
CDN
JavaScript-; CDN
, ,
.
, Apache Ant,
, .
,
-
,
JavaScript.
10
(Matt Sweeney)
.
-
,
-.
, :
.
, ,
, ,
.
-
, -
.
- ,
, .
;
. ,
,
-
220
10.
. ,
,
,
, .
,
.
, ,
.
,
,
.
-. ,
, ,
, ,
. ,
,
.
JavaScript-
,
JavaScript, .
Date .
. Date
,
Date .
,
( 3
DOM):
var start = new Date(),
count = 10000,
i, element, time;
for (i = 0; i < count; i++) {
element = document.createElement (div');
>
time = new Date() - start;
221
YUI Profiler
element = element.cloneNode(false);
>
time = new Date() - start;
,
, .
Timer,
.
var Timer = {
_data: {},
start: function(key) {
Timer._data[key] = new Date();
},
stop: function(key) {
var time = Timer._data[key];
if (time) {
Timer._data[key] = new Date() - time;
>
getTime: function(key) {
return Timer._data[key];
}
>;
Timer.start(createElement);
for (i = 0; i < count; i++) {
element = document.createElement(div');
}
Timer.stop(createElement);
alert( created ' + count + ' in ' + Timer.getTime(createElement);
, Timer
, ,
JavaScript. Timer
,
.
YUI Profiler
YUI Profiler 0http://developer.yahoo.com/yui/profiler/ ),
(Nicholas Zakas),
JavaScript, Java-
222
10.
Script.
, ,
.
.
YUI Profiler ,
,
.
var count = 10000, i, element;
Y .P rofile r.sta rt( reateElement);
>
Y.Profiler.stop('reateElement);
alert('created ' + count + ' in +
Y.Profiler.getAverage('createElement') + 'ms');
, ,
Date Timer,
, ,
.
,
.
.
,
. ,
initUI() 2, :
Y.Profiler.registerFunction("initUI");
.
, registerFunction()
. , , uiTest,
initUI() uiTest .testl () uiTest .test2().
:
Y.Profiler.registerFunction("testl", uiTest);
Y.Profiler.registerFunction("test2", uiTest);
,
.
223
YUI Profiler
registerObject()
:
Y.Profiler.registerObject("uiTest", uiTest);
(
), - .
uiTest.
, ,
. YUI Profiler -,
:
Y.Profiler.registerConstructor("MyWidget", myNameSpace);
myNameSpace.MyWidget.
:
var initUIReport = Y.Profiler.getReport("initUI");
,
,
.
.
:
{
min: 100,
max: 250,
calls: 5,
avg: 120,
points: [100, 200, 250, 110, 100]
>;
. Profiler
:
var uiTestlReport = {
calls: Y.Profiler.getCalls("uiTest.test 1"),
avg: Y.Profiler.getAvg("uiTest.testl")
};
,
.
:
var uiTestReport = Y.Profiler.getReport("uiTest");
224
10.
{
test1: {
min: 100,
max: 250,
calls: 10,
avg: 120
>,
test2:
min: 80,
max: 210,
calls: 10,
avg: 90
>
>;
,
.
.
,
, , ,
.
,
, :
var fullReport = Y.Profiler.getFullReport(function(data) {
return (data.calls > 0 && data.avg > 5);
>);
, ,
,
.
,
,
:
Y.Profiler.unregisterFunction("initUI"):
Y.Profiler.unregisterObject(uiTests"):
Y.Profiler.unregisterConstructor("MyWidget);
clearQ ,
.
:
Y.Profiler.clearCinitUI");
, :
Y. Profiler. clearO;
JSON,
.
- HTML-.
225
,
. ,
.
,
, ,
.
YUI Profiler ,
.
-,
:
var instrumentedFunction =
Y.Profiler.instrument"anonymousl", function(num1, num2){
return num1 + num2;
>);
instrumentedFunction(3, 5);
,
, :
var report = Y.Profiler.getReport("anonymous1");
-
.
JavaScript,
.
, .
.
:
myNode.onclick = function() {
myApp.loadData();
>;
:
myApp._onClick = function() {
.loadData();
>;
myNode.onclick = myApp._onClick;
226
10.
onclick. ,
.
,
,
:
myNode.onclick = function myNodeClickHandler() {
myApp.loadData();
};
:
var onClick = function myNodeClickHandler() {
myApp.loadData();
};
>
. ,
,
.
. .
___ fj
Firebug
Firefox
, Firebug (
http://www.getfirebug.com,/)>
(Joe Hewitt), zilla Foundation.
-,
.
Firebug
, DOM
,
DOM JavaScript- .
,
. ,
Firebug ,
.
227
Firebug
Firebug Conso
le (), . 10.1.
JavaScript,
. ,
,
, .
88
Clear
Console ] HTML
CSS
5cript
DOM
Net
Q,
offl
Profile
>
F
i
l
e
oZO
combo?me..0.1.32.js(
l
i
n
e8
)
1
8.6
69
6 39.106ms 43.89ms 43.89ms 3.89ms 43.89ms
150 7.31% 33.015ms 34.767ms 0.232ms 0.009ms 30.766ms
arcade.O1.98js(
l
i
n
e4
)
.
_
0
.
1
.
0
.
]
(
l
i
n
e2)
arcade.01.98J'(
l
i
n
e4
)
1092 2.8896 13.026ms 27.557ms 0.025ms 0.015n 0.524ms
5
2
9
0
2
5
4
9
6
1
1
.
4
6
9
m
s
0
.
0
0
2
m
s
0
.
0
0
1
m
s
1
1
.
4
6
9
m
s
0
.
0
8
5
m
s
a
r
c
a
d
e
0
1
.
9
8
j
s
(
l
i
n
e
4
)
207 1
.
7
5
9
6 7.903ms 115.32ms 0.557ms 0.023ms 14.992ms
arcade0.1.98js(Ime4
)
7
3
1
.
5
7
%
7
.
0
8
4
m
s
7
1
.
8
9
6
m
s
0
.
9
8
5
m
s
0
.
1
9
9
m
s
4
.
7
7
4
m
s
a
r
c
a
d
e
0
.
1
.
9
8
j
s
(
f
i
n
e
4
)
l
*
Y
\
"
*
/
1#
1
#
>
228
10.
, Firebug
Java
Script.
.
,
.
console.profile("regexTest");
regexTest(/foobar', /foo');
console.profileEnd();
console.profile("indexOfTest");
indexOfTest(/foobar, /foo);
console.profileEnd();
, ,
.
,
. , ,
profileEndQ,
. ,
, ,
profileEndQ setTimeoutQ,
.
__
1<
Firebug.
,
, ,
,
. ,
,
.
YUI Profiler, console.timeQ
Firebug
, .
,
, :
console.time("cache node");
for (var box = document.getElementById("box),
i = 0;
i < 100; i++) {
>
console.timeEnd("cache node");
Console (
).
.
. ,
style ,
:
console.time("cache style");
for (var style = document.getElementById("box").style,
i = 0;
i < 100; i++) {
value = parseFloat(style.left) + 10;
style.left = value + "px";
>
console.timeEnd("cache style");
.
,
, .
Net
,
. Firebug
Net (), . 10.3.
.
, ,
( DNS,
. .). ( )
, DOMContentLoaded.
, DOM
. ()
, window load,
, DOM
. ,
230
10.
.
. 10.3 .
,
,
. ,
, ,
,
,
. ,
,
. .
4?
U
Console HTML CSS Script DOM Net~ PageSpeed PageSpeedActivity YSlow Q,
Clear : A
ll HTML CSS *HR images Flash
Netpanelactivated.Anyrequestswhilethenetpanelis inactivearenotshown.
CCTad_eo_i.lJs
{
L y m g .c o m
5SJB I 30ms
5S3t
Lyimgcom
,1 9 m $
ad.eo.l.l.js
200 06
2 O K
17m *
Lyimg.com
arcadeseed.
SKB
4m s
2 0 0 OK
Lyimg.com
bc_2.0.4.js
9S0B
>00 OK
j 68m s
arcade.O1.98
1ytmg.com
37KB
6m s
2Q 0 O K
Lytmg.com
37KB
combo?metro
6requests
83
1.62s
Internet Explorer
8 Internet Explorer
, .
IE 8 ,
.
Firebug, IE
, ,
.
,
. IE
,
,
Fiddler, .
http://msdn.microsoft.com/enus/library/dd565628(VS.85).aspx.
IE 8 (Tools
()>Developer Tools ( )).
Start Profiling ( )
J a v a S c rip t -
231
Internet Explorer
. Stop Profiling (
) ( , )
.
F5 ,
Shift-F5 .
: ,
, ,
.
(. 10.4). IE
, .
File Find Disable View Outline Images Cache Took Validate
c5 x
| Search Profiler
I
!! i iI
2
906.25
E3 Functioncall
2
906.25
;
!
I
_
2
484.38
:
;
Ev
iI
: !i II
JScript *wndowsa*y bbck
2
484.38
: f
3 FurKbonappJy
2
484.38
t
j- i i
S JScnpl - wndowscript block
2
484.38
;
ill
H Function.apply
484.38
2
I
I! i
E updateAccessibilityMsg
2
484.38
;
-I ;
3 JScrpt windowscript
2
484.38
l
--i- ]
2
484.38
5 Functionapply
i.
! i
^2
1 !!*111
j
StringtoUp
2
0.00
( 4 4 ! j j
,
.
IE
JavaS cript-.
, , String::indexOf()
RegExp::test() HTML-
className, :
var count = 10000,
element = document.createElement(/div'),
result, i, time;
232
10.
element.className = /foobar';
for (i = 0; i < count; i++) {
result = foo/. test(element.className);
}
for (i = 0; i < count; i++) {
result = element.className.search(/~foo/);
}
for (i = 0; i < count; i++) {
result = (element.className.indexOf(/foo') === 0);
}
, . 10.5, ,
. ,
. ,
- ,
. ,
-
.
IE
,
.
console.time() console.timeEndQ Firebug,
IE.
if (console && !console.time) {
console..timers = {};
console.time = function(name) {
console._timers[name] = new Date();
};
console.timeEnd = function(name) {
};
}
File Find Disable View Outline Im ages Cache Tools Validate
Browser Mode: IE8 Document Mode: IE8 Standards
HTML
CSS
Script
Profiler
Start Profiling |
Current View
&
Search Profiler
|Report 5
zl
Function
|| Count | Exclusive Time (ms) | Avg Time (ms) | Max Time (ms) | Min Time (ms) | URL
000
!String. indexOf 30,000
15.63
15.63
0.00
RegExp, test 30.000
93.75
000
15.63
0.00
String, search 30.000
125.00
000
15.63
0.00
Puc. 10.5.
- Safari
233
IE8
.csv, Export Data ( ).
- Safari
4 Safari
,
-.
Internet Explorer, -
.
,
Firebug, Resource () .
-,
Develop (). Develop (
), Preferences ()^Advanced (
) Show Develop menu in menu bar (
). - Develop ()>Show Web Inspector (
-) Option-Command-I
(Mac OS) Ctrl-Alt-I (Windows).
Profiles
Profiles () Profiles (),
. 1 0 .6 . Profiles (
), Enable Profiling (
).
Start Profiling ( ) ( ,
). ,
Stop Profiling ( ) (
, ).
**
/
Option-Shift-Command-P (Mac OS) Ctrl-Alt-P (Windows).
__ 1
Safari Firebug
(console.prof ile(), console.timeQ ),
.
, Firebug,
.
234
10.
Q,
St*
6.39s
59.176m*
56.304ms
56.304ms
56.304ms
56.304ms
2.872ms
58.071ms
58.071ms
S8.071ms
58.07lm s
58.071ms
58.071ms
58.071ms
58.071ms
58.071ms
58.07lm s
58.071ms
52.771ms
31.203ms
29.163ms
Total
7.36s
59.338ms
56.424ms
56.424ms
56.424ms
56.424ms
2.914ms
60,393 ms
60.393ms
60.393ms
60 393 ms
60.393ms
60.393 ms
60.393ms
60.393ms
60.393ms
60.393ms
60.393 ms
S2.771ms
31.362 ms
29.163ms
Average
6.39s
19.725ms
28.152ms
28.152ms
28.152ms
28.152ms
2.872ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
1.815ms
0.292ms
15.601ms
0.435ms
Calls
1
3
2
2
2
2
1
32
32
32
32
32
32
32
32
32
32
32
181
2
67
0*1v S
Function
(program)
fjet_cookie
(anonymous function)
TM
(anonymous function)
(program)
(anonymous function)
getBuddylnfo
rQjtvbn.1)
n b s ?
1S i
?fi
(anonymous function)
u&A&ZS
a
c
SWHfcffJi
(anonymous functl ..JLCKfcflJSS
v (anonymous fu corr.oo.45l
lanonymous mr,!)''?.
V
tsmPSLlO,
(program)
(program)
evaluate
sendSubscribe
appendChild
..
..
foo = function() {
return /foo!';
};
console.profile(/Anonymous Function');
foo();
console.profileEnd();
235
- Safari
. 10.7,
. URL-
.
Elements
jmj Resources
Scripts [ w
Self
Profiles j
Q, St.ifch Pro* s
Databases
Average
Calls
Function
(anonymous function)
.non.turn* s
displayName
.
, .
var foo = function() {
return /foo!';
};
foo.displayName = /i am foo';
. 10.8, displayName
.
Webkit. ,
- ,
. ,
,
:
var foo = function foo() {
return /foo!';
};
Elements
Resources
' J%
E H
. .....
Scripts \ ^
Self
273X]
Profiles J
Total
273
$|
Databases
Average
27JK
Calls
i c 1
[ q , Scorch froH
Function
1am foo
,vwn hui\ S
236
10.
Resources
Resources () , Safari
. Net
() Firebug, ,
1.
. Resources () -
,
,
(. 10.9).
, Size
RESOURCES
SW *
ll.iii
I? 71*
15.51,
23 M t
<> http://fn.www.yahoo.com/
arcade_0.1.3 css
combo
I yn*$ tom/
ad^eojl.lj
Jyim g com /d/a/1-/jva prom ..
page_bg_slate._070609.9if
d yi*n;
p.gif
yirvg
'
turn event
yahooJogo_us_061509.p...
I yimg toro/a/i/ww/met
gspnte_pg_slate_062209....
<1yimy
I Iarcade-seed_0.1.0.js
I
| l.yimg / / fib/
, , , Safari 4
, .
S afari ,
. ,
,
HTML;
, ( 1).
237
Chrome
Chrome
Google Chrome
,
- W ebKit/Safari.
Resources () Chrome
Timeline ( )
. Chrome
Profiles () -,
.
Safari, Chrome
, Firebug,
c o n s o le .p ro file () console.tim e().
. 10.10, Timeline ( )
,
: Loading (), Scripting () Rendering
().
.
Records (),
.
,Resources
[
RECORDS
0P
a
i
n
t(377x11)
Q TimerF
i
r
e
d(19S)
0P
a
i
n
t<171*40)
0 SendRequest(
.
.
.
0 SendRequest{
.
.
.
TimerF
i
r
e
d(223)
Layout
%P
a
i
n
t(63x407)
TimerF
i
r
e
d(224)
$SendRequest{
.
SendRequestf
0SendRequestU
.
.
.
m.www.yahoo.
com/
6??
Scripts
:
3
1
Timeline^^^Rro*iks
197k
UJ
;
r*(
::
ci*
Storage
4 Console
sm
6S7
e mm
i
-----J ----------- -------- ~
IZU
1
.
9
*
1
*isi
460*
4
0
liAi *
(D
*
i
u
.
|t
Elements
TIMELINES
0 Loading
Scripting
Rendering
. 10.10. Timeline
Chrome
Profiles ()
Chrome Java
Script (. 10.11).
,
238
10.
. ,
Compared to Snapshot ( )
Profiles (). +/ Count (+/- )
Size () .
Clements wjResourcs
,Scripts
Constructor
ico
de
)
{
c
l
o
s
u
r
e
}
] ""*1
jS
t
r
i
n
g
(anonvmous)
j | | j Profik2
Object
Array
Function
(
g
l
o
b
a
lp
r
operty)
HEAP SNAPSHOTS
HTMlDivPcment
Element
HTMUIement
RegExp
hrrl Snapshot 2
} UsedBMBof11MB(70 HTMLTabteCellEJement
MTMLOocument
!j Snapshot 3
i>%Ilhd6MBo
f1
CMBO
X)
Timeline
CPU PROFILES
|] p,#,,i* j
W Code
-L473MB
>Console OL
Pro
fi
le
*^^^Storage
Count s *Count Size
.....
8900 3.473MB_____0!
8971 1.248MB HHE2 K I T
20694 974.39..
08
0
42 207.75...
0B
.
0
0B
3086 20254.
1713 130.92
0
0B
1870 59.17KB
0
0B
7428 58.03KB
0
0B
1
1
4
8
K
B
0
0
8
478
0
0B
426 9.98KB
0
08
389 9.61KB
188 9 55KB
0
0B
344 8.06KB
0
0B
0B ,
12 6.48KB
0
Other
269.09KB
Compared to Snapshot 1 i
Ol L2
Puc. 10.11.
Chrome
.
. , ,
, ,
.
. , Safari 4, IE 8 , Firefox 3.5
Chrome, ,
, ,
.
,
.
, , ,
.
,
Page Speed
239
.
. ,
. ,
, ,
, , .
Page Speed
Page Speed - ,
Google
Firebug, , Net () Fi
rebug, , -. HTTP-
,
JavaScript-, ,
, .
, , ,
.
http://code.google.com/speed/page-speed/.
Profile Deferrable JavaScript (
JavaScript), Page Speed,
,
,
.
. . 10.12
,
load window.
,
, .
.
Page Speed Firebug Page Speed
Activity ( ).
Net () Firebug,
.
,
,
.
,
.
. 10.13, ,
, - .
,
.
240
10.
81
Console
Analyze Performance
HTML
CSS
Show Resources
Script
DOM
Net
Page Speed
Help
98.4% o f the JavaScript loaded by this page had not been invoked by the tim e the onload
handler co m pleted. (Cached Result)
h ttp ://rn .w w w .y a h o o .c o m 3 9 functions uncalled o f 4 1 total functions. (Toggle Function
View)
h ttp ://L y im g .e o m /a /lib /a r c /a r c a d e _ 0 .l.9 8 .js 7 1 6 functions uncalled o f 73 3 total
functions. (Toggle Function View)
co m b o ? m etro /u ip lu g in s/a u to h id e _s ervic e_ 0.1 .5.js& m e ... 5 5 1 functions uncalled o f 55 2
total functions. (Toggle Function View)
| Record
URL
Console
Stop
jfd/23143322
HTML
CSS
Script
DOM
h t*
Page Speed
1200ms
/cust/msnbc/ucs.
j
s
N on~H TTP re s o u r c e s ;
F
ir
ef
oxJ
a
v
a
s
c
r
i
p
t
ConnectionWait DNS
Connect
Connected
Receive
Cachef
t
t MiDataA
vailable JSParse
Send
JSExecute
,
,
. Page Speed Activity (
) , ,
(. 10.14).
,
, ,
.
,
.
241
Fiddler
^P a g e S)>eed Activity Delay,-*>le Functions
Delayable [ Init Time
312 ms
750 ms
312 ms
750 ms
312 ms
750 ms
312 ms
750 ms
419 m e
7 m e
a n n rw m
(d, a, c)
(c, d, b)
(a) {
0 {
fi r * - tio r ) ( a
K \ /
File
var e, i = 0, ... http://...
= = = wi... http://...
return !!a &&
... http://...
var b = arguments... http://...
{
{
r o b im
o a r lV
h H rv / /
I Source
TFiie
Tb I
1 Name
function evalScript(i, a ) {
if (a.src) {
D.ajax({urI... http ://w ...
evalScript
num
function num(a, b) {
re tu n a[0] && parseInt(D.curCSS... http://w...
anonymous
function 0 {
if (D.isReady) {
return;
>
... http://w...
anonymous
function 0 (
if (D.isReady) {
return;
>
... http://w...
anonymous
function 0 {
if (D.isReady) {
return;
>
... http://w...
bindReady
function bindReadyO {
if( M
return;
>
... http://w...
anonymous
function 0 {
retLm this.length;
>http://w...
function (a) {
retLm a = = undefined ? D.makeArray(thi... http://w...
anonymous
anonymous
function ( b ) {
var a = D(b);
a.prevObject = this; ... http://w...
Puc. 10.14.
Fiddler
Fiddler - ,
HTTP-, ,
,
. Windows,
(Eric Lawrence),
-.
http://www.fiddler2.com/fiddler2/.
Fiddler
IE Firefox. Internet Explorer
, Firefox -
Tools (). Fiddler
.
, -. WinlNET Fiddler,
. (
Opera Safari) WinlNET,
Fiddler ,
. Fiddler
, -, -
Fiddler (127.0.0.1, : 8888 ).
Firebug, Page Speed -,
Fiddler , , -
242
10.
(. 10.15).
f Fiddler - HTTP Debugging Proxy
File Edit Rules Tools View Help
^Comment
Reissue X Remove - Resume AH ; Streaming jjpAutpQecode |^ F in d IS Save | Laurri
Web Sessions
jT T p t "d
S Inspectors | / AUtoResponder |
Request Builder | Piters ~ Timeline |
1 Result I Protocol j |]
#
HTTp Hi
so:'
http
]|
1
200 HTTP
2
200
3
304 HTTP
/combo
4
200 HTTP
/arcade_0.13.cis
5
200 HTTP
/
6
200 HTTP
korrho
7
200 HTTP
/food_psticides-pd5m
8
200 HTTP
/vickd-pd.jpg
9
200 HTTP
10
200 HTTP
/?0i50mfs*f
11
200 HTTP
/>*_22_111908>
12
200 HTTP
/spHt#_ma^bad_riat_srchbtl_0
13
200 HTTP
*
I
14
200 HTTP
/onbo
15
200 HTTP
>]16
304 HTTP
Til
StatisfacsI
243
YSlow
_
Web Session*
j ResUt | Protocol |
Host HTTP m.w w.yahoocom
HTTP m* m yahoocom
wyahoocom
w.yahoocom
l.yimg.com
l.ymg.com
l.ymgcom
t
.
yimg.com
d.ymg.com
dyinQ.com
dyng.com
l.ymgcom
I
.
yrag.com
I
.
ymg.com
d.yrr
tg
.c
om
d
.y
rr
tg
.c
om
d.vimg.com
l
.
y
i
m
gcom
I
.
ylng.com
I
.
ymg.com
l
.
y
i
m
gcom
I
.
ymg.com
d.ymg.com
l.yimg,com
d.ymg.com
d,ymg.com
d.ymgcom
d.ymg.com
d.ymgcom
d.ymg.com
d
.yimg.com
d.ymg.com
d.ymg.com
d.ymgcom
l.ymgcom
|
or*
$Request 8uicfer
(2) Stabeebcs
j
inspectors
Request Count: 54
33.323
Bytes sent:
Bytes Received: 335,189
ACTUAL PERFORMANCE
Requests started at:
17:4S:26:1573
Responses completed at:
8292
Aggregate Session time: 00:00:12:9687
Sequence (1 time: 00:00:45.718750
DNS Lookup time:
1,408ms
TCP/IP Connect time: Sims
RESPONSE COOES
http/30
2:
3
http/
200:
SI
PESrCNSE 5 (byContent-Type)
text/ison: 1,549
applicationA~shocKv>ave-flash: 33,589
applicatton/*oavascript: 120,281
text/css: 39,812
-headers: 18,616
inuge/jpeg: 22,662
image/pno: 14,383
text/htmf: 37,603
image/gif: 4 6 ,6 94
fmelft
/ AutoRejponder
| j CapyJI&Sito
Fiddler Windows.
- Charles
Proxy, Windows, Mac OS.
http://www.charlesproxy.com/.
YSlow
YSlow
. (Ste
ve Souders) Yahoo!
Firefox ( GreaseMonkey).
Firebug,
244
10.
Yahoo!.
http://developer.yahoo.com/yslow/.
YSlow ,
. , ,
,
.
, ,
.
. 10.17 , YSlow
-.
.
.
? a
ALL (22)
F
Make
Console
FILTER BY:
fewer
HTML
CSS
DOM
Net
YSlow -r
HTTP requests
Script
Atld Expires
Compress components
Pm CSS at top
hewers
with
21 e x te rn a l ja v a sc rip t %
25 e x te rn a l batM jroim c
gzip
Decreasing the number of component
page, resulting m faster page loads. S<
combine multiple scripts into one sen
and Image maps.
Read More
,
. . 10.18 ,
JAVASCRIPT,
.
, ,
, . ,
, ,
,
.
245
-If
Grade
Console
CSS
Script
Grade
ALL (22)
HTML
flLlLH BY:
DOM
Nci
YSlow j
URL: >tttp;//www.n
246
10.
-M*l
11..
J*
| J *
I Network [ms] | JavaScrpt [ms] I Rendering [ms] | Page Load Time [ms] |
Resources
Numbero
fresourcesloadedv
i
anetworka frombrowsercache
s is ?s :<o :<s
Network
Timespentonnetworka
c
t
i
v
i
t
i
e
s
.P
a
r
a
l
l
e
la
c
t
i
v
i
t
i
e
sareaccumulated.
1*4174 m}~
0<hr
M m
DftS
lm 9 1FI**
JavaScript Triggers
Time*pcrtonJ
a
v
a
S
c
r
i
p
te
xe
c
u
t
i
o
n
,t
r
i
g
g
e
i
e
dbyshowne
v
c
r
t
t
s
.
{738S ms|
JavaScript APIs
TimespentonJ
a
v
a
S
c
r
i
p
texecutionfromshownA
P
I
s
.
10m|
1
JCLL
503 mtf -
1080 im |
<html>
Load Evrmj
Page
CPU
JavaScript
Rendenng
Network
Event
cenHnU4rautibkdthvM lw0 .1 J
http://yahoo.com/
Lrli
___
L ii J
__ ___
tiiDHi 11 ib
ID |D
QUID
DO
(Ajax)
, ,
,
. ,
,
- Ajax.
247
Fie
View
j*-'t lesiajKE*!^
5 Welcome Summary
fb te tw o rV
|<teton>
hflpV/l yimg.c
htlp://l.yimg.c...
Iit1p.//I.ylmg c ...
htip://*dmedi...
;/ * bc.y...
no
no
no
no
no
200... text..
200... text..
200... appl..
200... imu
200... ...
Net
Net
Not
Nt
Net
447U
61701
153...
95
0
065
0.54
007
0.00
0.00
036
0.6
016
005
006
007
Accept
<*Oite
C n u x fttg (tfip,
L ' rr: hnp7/rri.www.yjroo.com/
ftccnpt-bmqudgn:
MccilU/4 0 (ccimpdrtirte; MSIE 7 0; WwJow* NT 5. 1; Tidw n /4 0; .NET ClR
.0.50727; y * 0)
iyiuiTroco:
A){86EeE5EF-5CBCMC78-BOAI>17F50CW:0333l}.PC-! 1;4;17. E A^ent
id :
bconllnk: to,
tnstruMittncioit: b,
nuduleapx: b,
vieweventa ["click"),
l n i t t fn m - tie n le l
thi*.Y c.gecScrvlcc("yui"):
thl*.be*coi link - c.oecStclngCBCi'CW LINK");
t h u Id - e g e t ld ( ) :
th ia .M o d u lc a p l c :
.J
I* * d v n a T ra c e E d itio n
File View Help
.J n jx J
cX
*
4f r * Sitowing: JavaScript (filtered) I Network (filleted) | Rendering (IMtered) | Culom table filler ( a l)
Size [
1885
1533
8428
2842
3276
2037
1468
1.1.......................
Activity
J &L[<tf]
d CHiideModute
id <arwnymous>
iy atTimeout
.d ** JavaScript FKBCUtrm
jd t 'I Asynchronous Lrik fbetTirneout)
I API
I
core_1.0.16
contentca...
yui_0.2.1
DOM
JavaSo pt
-
tJ <anonyrnous>
Start I
5.83
5.84
5.09
5.93
6.06
6 06
yui_0.2.1
5.09
jJ e.test
yui 0.2.1
5.90
l i ...........- .................................................................................................................................................1
|
Total [rtj^J
Contributor
| Invocations I Ext *] Stack Element
<*>ad_embedObj
- Rendering (Calculating gene...
collapse
__
< closeCurrentModule
<*>removeClass
^Renderng (Scheduling layou...
C*>tokence
| <*> filterNodes
,
i L ..................................... ...... J
Contributors API dlstrbutton |
1
5
1
1
2
583
13
10
JU
JJ
r : .......................... i
Duration [me] 1
1218.61
1218.60
1218.55
1218.50
1?1.
1218.38
0.02
0.01
JSfrmll Toi*P
142.12
142.10
142.03
141.98
|
i4i.es
141.59
-J
0.02
0.01
JiJ
h .a p p ly ( g ,
return;
0.
0.
o.
0.__
0.
0.
0.
0. i
i r
!
1 );
>'
e (J) ? set In te rv a l(k , n) :
return (
id : e,
in t e r v a l: j ,
can cel: function!)
4 ...........1 .........................i
j1
248
10.
-
,
, .
;
, ,
.
,
HTTP-,
.
.
,
,
.
,
, ,
.
, ,
,
.
,
.
+ (), , 110
+= (-), , 110
add(), , 39
addEventListener(), , 195
Ajax (Asynchronous JavaScript and XML,
JavaScript XML), 160
, 160
, 171
Apache, -
ExpiresDefault, 213
Apache Ant, , 204
array.join(), , 110
assignEvents(), , 48
F
factorial), , 103,106
Fiddler,
, 241
Firebug, , 226
Firefox,
, 142
, 112
forEach(), , 94
for, , 88
for-in, , 89
Function(), , 191
childNodes, , 71
Chrome,
, 237
, 142
JavaScript,
GET- POST-
XHR, 162
gzip-, 210, 212
202
Closure Compiler,
JavaScript-, 211
Closure Inspector, Firebug,
211
concat(), , 115
console.time(), , 228
cssText, , 78
CSS-, , 72
CSS-, , 34
D
Date, , 220
displayName, , 234
do-while, , 88
dynaTrace,
, 245
hasOwnProperty(), , 51
rhover, , IE, 82
HTML,
, 179
HTML-
, 66
, 69
HTTP-, Ajax, 186
I
IE (Internet Explorer),
nextSibling, , 71
,
144
script, 29
, 230
XHR, 188
, 113
250
if-else,
, 97
switch, 95
initUI(), , 44
innerHTML,
DOM, 61
JavaScript-
, 213
, 209
, 205
, 206
jQuery,
gzip-, 212
JSMin,
JavaScript-, 209
JSON (JavaScript Object Notation
JavaScript), 175
JSON-P (JSON with padding - JSON
), 178
L
$LAB.script(), , 35
$LAB.wait(), , 35
LABjs, , , 35
LazyLoad, ,
, 34
length, , 66
loadScript(), , 30
mergeSort(), , 104
message, , 156
multistepO, , 152
onmessage, , 156
Opera,
, 143
Page Speed,
, 239
postMessage(), , 156
POST- GET-
XHR, 162
processArray(), , 150
profileEnd(), , 228
Q
querySelector(), , 201
querySelectorAll(), , 73, 201
R
readyState,
, 166
XHR, 162
removeEventListener(), , 195
Safari,
, 238
, 233
, 142
, 157
[[Scope]], , 48
<script>, , , 163
<script>,
defer, , 26
, 22
setlnterval(), , 145,191
setTimeout(), , 145, 191
smasher, , 216
string.concat(), , 110
switch,
if-else, 95
this, , 56
toStringO, , 51
trim(), , 132
try-catch, , 45, 102
V, W
var, , 88
while, , 88
with, , 44
X
XHR (XMLHttpRequest), , 161
GET- POST-, 162
IE, 188
, 164
, 168
XML, , 171
XPath,
XML-, 174
Y
YSlow,
, 243
YUI 3, , , 33
YUI Compressor,
JavaScript-, 209
YUI Profiler, , 221
251
, 87
,101
, 95, 97
, 87
, 225
YUI Profiler, , 225
, , 123
Ajax, 188
LABjs, 35
LazyLoad, 34
YUI 3, 33
, 199
, 197
, 238
, 21
, 238
, 139
WebKit
innerHTML, 64
, 141
,
101
XPath, 174
, 139
, 21, 37
DOM, 58
DOM JavaScript, 58
eval(), 192
, 137
,
, 41
DOM, 79
, 24
, 83
,150
DOM, 75
, 75
, 46
<script>, 163
script, 27
, 37
, 38
, 50
Expires, 186
HTTP-, 186
, 157
CSS-, 34
, 157
, 32, 238
, , 47
, Ajax, 161
, HTML-, 67
,
, 55
, 119
, 128
- (Safari), 233
, 125
, 125
, 54
, , 157
, 118
, 121
, XML, 174
, 200
, 129
, 162
, 127
, 123
JavaScript-,
216
Chrome, 237
IE (Internet Explorer),
230
220
252
XMLHttpRequest, 31
, 121
, 145
, 104
, 94
, 125
, 130
childNodes, 71
HTML-, 66
, 69
, 110
, 200
, 40
, 65
JavaScript-, 213
Ajax,185
, 55
, 81
, , 37
HTML-, 69
, 41, 60
HTMLCollection, 66
for-in, 89
,
, 200
, , 105
, 22
, 50, 200
$LAB.script(), 35
$LAB.wait(), 35
array.join(), 110
concat(), 115
forEach(), 94
hasOwnProperty(), 51
postMessage(), 156
querySelector(), 201
querySelectorAll(), 73, 201
string.concat(), 110
toStringO, 51
trim(), 132
, 200
, 110
, 201
this , 56
JavaScript-, 209
DOM, 71
, 26
script, 27
XMLHttpRequest, 31
, 26
, 32
, 129
, 39
, 46
, 47
,
148
,
, 123
JavaScript-, 205
, 40
Date, 220
HTMLCollection, 66
, 40
, 193
, 142
, 101
, 197
,
, 123
, 195
, 26
, Ajax, 168
253
, 41
, , 41
, 37
,
, 78
, 120
, 191
, 194
, 99
, 139
,
139
, 145
, 139
, 155
,
139
, 139
JavaScript, 206
, 196
, 191
, 197
, 200
, 193
, 195
, 191
, 194
,
196
,
Firebug, 228
CSS-, 72
DOM, 58
, 76
Ajax, 185
JavaScript , 21
, 37
, 54
, 47
JavaScript, 47
, 44
HTML, 181
JSON, 177
JSON-P, 178
XML, 174
DOM, 58, 59
, 41
trim(), 137
, 116,127
eval(), 192
, 154
, 89
, ,
55
, 50
JavaScript-, 220
JavaScript-, 216
DOM, 58
HTML-, 66
innerHTML, , 61
, 58
, 83
, 71
, 65
, 75
JavaScript-pecypcoB, 215
,
, 39
, 116
, 123
, 118,121
, 117
, 131
, 120
, 116, 127
, 132, 137
, 101
, 104
, 105
,
101
, 103
, 211
, Firefox, 112
, 50
cssText, 78
displayName, 234
innerHTML, 61
length, 66
, 50
, 55
, CSS, 72
(Content Delivery Network, CDN), 215
, 210, 211
, , 169
, 113
254
message, 156
onmessage, , 156
,
XHR, 164
, , 101
,
, 78
, 110
, 132
, 21
, 238
, 22
, 226
, 99
, 154
, 145
, 148
, , 50
, , 55
XML, 171
, 181
, 184
,
DOM, 80
,150
add(), 39
addEventListener(), 195
assignEvents(), 48
console.time(), 228
eval(), 46,176,191
execute(), 47
factorial), 103,106
initUI(), 44
loadScript(), 30
mergeSort(), 104
multistep(), 152
processArray(), 150
profileEnd(), 228
removeEventListener(), 195
setlnterval(), 145,191
setTimeout()* 145,191
, 225
, 55
, 40
, , 65
- DOM, 72
, 87
,101
, 95, 97
, 87
, 132,137
, 95, 97
if-else, 95
switch, 95
, 99
, 39
, 44
, 44
, , 52
, 87
, 94
, 89
, 88
console.time(), 228
, 157
, 157
JavaScript-, 213
JavaScript-, 209
JavaScript-, 205
JavaScript, 206
, 155
, 156
, 157
, 155
, 157
, 171
HTML, 179
JSON, 175
, 50
, 54
, 50
, 55
, 37
, 50
, 52
, 69
, , 37
OREILLY
JavaScript.
-,
JavaScript -
. , Java
Script . ,
,
. , , ,
DOM, .
, Yahoo!,
-,
JavaScript - , , ,
-
,
JavaScript.
,
.
:
.
,
JavaScript.
JavaScript,
DOM.
.
.
.
HTTP- .
- JavaScript,
-.
. ,
JavaScript.
,
, Yahoo! Search
: J r w S cRIPT/ -
9 785932
862131
www.symbol.ru