1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>JavaScript 语言入门教程</title> </head> <body> <!-- <script type="text/javascript" src="./assets/index.js"></script> --> <!-- JavaScript 的基本语法 --> 1.语句 JavaScript 程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。 2.变量 - 概念 变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。 - 变量提升 JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。 3.标识符 - 标识符(identifier)指的是用来识别各种值的合法名称。 4.注释 - 源码中被 JavaScript 引擎忽略的部分就叫做注释,它的作用是对代码进行解释。 5.区块 - JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。 6.条件语句 JavaScript 提供if结构和switch结构,完成条件判断,即只有满足预设的条件,才会执行相应的语句。 - if结构 - if...else结构 - switch结构 - 三元运算符 (条件) ? 表达式1 : 表达式2 JavaScript 还有一个三元运算符(即该运算符需要三个运算子)?:,也可以用于逻辑判断。 7.循环语句 循环语句用于重复执行某个操作,它有多种形式。 - while 循环 While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。 - for 循环 for语句是循环命令的另一种形式,可以指定循环的起点、终点和终止条件。 - do...while循环 do...while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件。 - break 语句和 continue 语句 break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。 - 标签(label) JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。 <!-- 数据类型 --> JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。 - 数值(number):整数和小数(比如1和3.14) - 字符串(string):文本(比如Hello World)。 - 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假) - undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值 - null:表示空值,即此处的值为空。 - 对象(object):各种值组成的集合。 1.原始类型(primitive type) - 通常,数值、字符串、布尔值这三种类型,即它们是最基本的数据类型,不能再细分了。 2.合成类型(complex type) - 一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。 3.特殊值 - undefined和null 对象是最复杂的数据类型,又可以分成三个子类型。 - 狭义的对象(object) - 数组(array) - 函数(function)
4.typeof 运算符:检测数据类型 <!-- null, undefined 和布尔值 --> null与undefined都可以表示“没有”,含义非常相似。 1.用法和含义 - null表示空值,即该处的值现在为空。 - undefined表示“未定义”。 2.布尔值 - 布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。 下列运算符会返回布尔值: - 前置逻辑运算符: ! (Not) - 相等运算符:===,!==,==,!= - 比较运算符:>,>=,<,<= <!-- 数值 --> 1.整数和浮点数 JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。 - 数值精度 - 数值范围 2.数值的表示法 3.数值的进制 JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。 4.特殊数值 - 正零和负零 - NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。 - Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小。 5.与数值相关的全局方法 - parseInt()方法用于将字符串转为整数。 - parseFloat方法用于将一个字符串转为浮点数。 - isNaN方法可以用来判断一个值是否为NaN。 - isFinite方法返回一个布尔值,表示某个值是否为正常的数值。 <!-- 字符串 --> 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。 1.转义 - 反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。 \0 :null \b :后退键 \f :换页符 \n :换行符 \r :回车键 \t :制表符 \v :垂直制表符 \' :单引号 \" :双引号 \\ :反斜杠 - 字符串与数组 字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。 - length 属性 length属性返回字符串的长度,该属性也是无法改变的。 2.字符集 JavaScript 使用 Unicode 字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。 3.Base64 转码 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。 - btoa():任意值转为 Base64 编码 - atob():Base64 编码转为原来的值 <!-- 对象 --> 1.对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。 - 键名,对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。 - 对象的引用,如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。 - JavaScript 引擎的做法是,如果遇到这种情况,无法确定是对象还是代码块,一律解释为代码块。 2.属性的操作 - 读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。 - 点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。 - 查看一个对象本身的所有属性,可以使用Object.keys方法。 - delete命令用于删除对象的属性,删除成功后返回true。 - in 运算符,用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。 - for...in 循环,for...in循环用来遍历一个对象的全部属性。 3.with 语句 with (对象) { 语句; } <!-- 函数 --> 1.函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 - function 命令,function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 - 函数表达式,除了用function命令声明函数,还可以采用变量赋值的写法。 - Function 构造函数,第三种声明函数的方式是Function构造函数。 - 函数的重复声明,后一次的函数声明覆盖了前面一次。而且,由于函数名的提升(参见下文),前一次声明在任何时候都是无效的,这一点要特别注意。 - 圆括号运算符,return 语句和递归 - JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。凡是可以使用值的地方,就能使用函数。 - JavaScript 引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。 2.函数的属性和方法 - name属性,函数的name属性返回函数的名字。 - length属性,函数的length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。 - toString(),函数的toString方法返回一个字符串,内容是函数的源码。 3.函数作用域 - 作用域(scope)指的是变量存在的范围。在 ES5 的规范中,JavaScript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域,本教程不涉及。 - 函数内部的变量提升,与全局作用域一样,函数作用域内部也会产生“变量提升”现象。 - 函数本身的作用域,函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。 4.参数 - 函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数。 - 函数参数不是必需的,JavaScript 允许省略参数。 - 函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递(passes by value)。这意味着,在函数体内修改参数值,不会影响到函数外部。 - 如果有同名的参数,则取最后出现的那个值。 - arguments 对象,由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。 - 与数组的关系,需要注意的是,虽然arguments很像数组,但它是一个对象。数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。 - callee 属性,arguments对象带有一个callee属性,返回它所对应的原函数。 5.函数的其他知识点 - 闭包,闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。 - 闭包的另一个用处,是封装对象的私有属性和私有方法。 - 立即调用的函数表达式(IIFE) 6.eval 命令 - eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。 - eval 的别名调用 <!-- 数组 --> 1.数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。 2.数组的本质,本质上,数组属于一种特殊的对象。typeof运算符会返回数组的类型是object。 3.length 属性,数组的length属性,返回数组的成员数量。 4.in 运算符,检查某个键名是否存在的运算符in,适用于对象,也适用于数组。 5.for...in 循环和数组的遍历,for...in循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。 6.数组的空位,当数组的某个位置是空元素,即两个逗号之间没有任何值,我们称该数组存在空位(hole)。 7.类似数组的对象,如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)。 <!-- 运算符 --> 1.算术运算符 - 加法运算符:x + y - 减法运算符: x - y - 乘法运算符: x * y - 除法运算符:x / y - 指数运算符:x ** y - 余数运算符:x % y - 自增运算符:++x 或者 x++ - 自减运算符:--x 或者 x-- - 数值运算符: +x - 负数值运算符:-x 2.比较运算符 - 大于运算符:> - 小于运算符:< - 小于或等于运算符:<= - 大于或等于运算符:>= - 相等运算符:== - 严格相等运算符:=== - 不相等运算符:!= - 严格不相等运算符:!== 3.布尔运算符 - 取反运算符:! - 且运算符:&& - 或运算符:|| - 三元运算符:?: 4.二进制位运算符 - 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 - 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果为1,否则为0。 - 二进制否运算符(not):符号为~,表示对一个二进制位取反。 - 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 - 左移运算符(left shift):符号为<<,详见下文解释。 - 右移运算符(right shift):符号为>>,详见下文解释。 - 头部补零的右移运算符(zero filled right shift):符号为>>>,详见下文解释。 5.其他运算符,运算顺序 - void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 - 逗号运算符用于对两个表达式求值,并返回后一个表达式的值。 - 运算顺序 <!-- 数据类型的转换 --> 1.JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。 2.强制转换 - Number(),使用Number函数,可以将任意类型的值转化成数值。 - String(),String函数可以将任意类型的值转化成字符串。 - Boolean()函数可以将任意类型的值转为布尔值。 3.自动转换 - 第一种情况,不同类型的数据互相运算。 - 第二种情况,对非布尔值类型的数据求布尔值。 - 第三种情况,对非数值类型的值使用一元运算符(即+和-)。 <!-- 错误处理机制 --> 1.Error 实例对象 - JavaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。 2.原生错误类型 - SyntaxError对象是解析代码时发生的语法错误。 - ReferenceError对象是引用一个不存在的变量时发生的错误。 - RangeError对象是一个值超出有效范围时发生的错误。主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。 - TypeError对象是变量或参数不是预期类型时发生的错误。 - URIError对象是 URI 相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。 - EvalError 对象,eval函数没有被正确执行时,会抛出EvalError错误。 总结,以上这6种派生错误,连同原始的Error对象,都是构造函数。开发者可以使用它们,手动生成错误对象的实例。这些构造函数都接受一个参数,代表错误提示信息(message)。 3.自定义错误,除了 JavaScript 原生提供的七种错误对象,还可以定义自己的错误对象。 4.throw语句的作用是手动中断程序执行,抛出一个错误。 5.try...catch 结构,一旦发生错误,程序就中止执行了。 6.finally 代码块,try...catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句。 <!-- 编程风格 --> 1.“编程风格”(programming style)指的是编写代码的样式规则。 2.缩进,行首的空格和 Tab 键,都可以产生代码缩进效果(indent)。 3.区块,如果循环和判断的代码体只有一行,JavaScript 允许该区块(block)省略大括号。 4.圆括号(parentheses),在 JavaScript 中有两种作用,一种表示函数的调用,另一种表示表达式的组合(grouping)。 5.行尾的分号,分号表示一条语句的结束。JavaScript 允许省略行尾的分号。 6.全局变量,JavaScript 最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。 7.变量声明,JavaScript 会自动将变量声明“提升”(hoist)到代码块(block)的头部。 8.with 语句,with可以减少代码的书写,但是会造成混淆。 9.相等和严格相等,JavaScript 有两个表示相等的运算符:“相等”(==)和“严格相等”(===)。 10.语句的合并,有些程序员追求简洁,喜欢合并不同目的的语句。 11.自增(++)和自减(--)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。 12.switch...case 结构,switch...case结构要求,在每一个case的最后一行必须是break语句,否则会接着运行下一个case。 <!-- console 对象与控制台 --> 1.console.log(),console.info(),console.debug() - 方法用于在控制台输出信息。 2.console.warn(),console.error() - 方法用于在控制台输出警告信息。 3.console.table() - 对于某些复合类型的数据,console.table方法可以将其转为表格显示。 4.console.count() - count方法用于计数,输出它被调用了多少次。 5.console.dir(),console.dirxml() - dir方法用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。 6.console.assert() - console.assert方法主要用于程序运行过程中,进行条件判断,如果不满足条件,就显示一个错误,但不会中断程序执行。这样就相当于提示用户,内部状态不正确。 7.console.time(),console.timeEnd() - 这两个方法用于计时,可以算出一个操作所花费的准确时间。 8.console.group(),console.groupEnd(),console.groupCollapsed() - console.group和console.groupEnd这两个方法用于将显示的信息分组。它只在输出大量信息时有用,分在一组的信息,可以用鼠标折叠/展开。 9.console.trace(),console.clear() - console.trace方法显示当前执行的代码在堆栈中的调用路径。 - console.clear方法用于清除当前控制台的所有输出,将光标回置到第一行。 10.控制台命令行 API - $_属性返回上一个表达式的值。 - $0 - $4,控制台保存了最近5个在 Elements 面板选中的 DOM 元素,$0代表倒数第一个(最近一个),$1代表倒数第二个,以此类推直到$4。 - $(selector)返回第一个匹配的元素,等同于document.querySelector()。 - $$(selector)返回选中的 DOM 对象,等同于document.querySelectorAll。 - $x(path)方法返回一个数组,包含匹配特定 XPath 表达式的所有 DOM 元素。 - inspect(object)方法打开相关面板,并选中相应的元素,显示它的细节。 - getEventListeners(object)方法返回一个对象,该对象的成员为object登记了回调函数的各种事件(比如click或keydown),每个事件对应一个数组,数组的成员为该事件的回调函数。 - keys(object)方法返回一个数组,包含object的所有键名。 - values(object)方法返回一个数组,包含object的所有键值。 - monitorEvents(object[, events])方法监听特定对象上发生的特定事件。事件发生时,会返回一个Event对象,包含该事件的相关信息。 - unmonitorEvents方法用于停止监听。 - monitorEvents允许监听同一大类的事件。所有事件可以分成四个大类。 mouse:"mousedown", "mouseup", "click", "dblclick", "mousemove", "mouseover", "mouseout", "mousewheel" key:"keydown", "keyup", "keypress", "textInput" touch:"touchstart", "touchmove", "touchend", "touchcancel" control:"resize", "scroll", "zoom", "focus", "blur", "select", "change", "submit", "reset" 11.其他方法 - clear():清除控制台的历史。 - copy(object):复制特定 DOM 元素到剪贴板。 - dir(object):显示特定对象的所有属性,是console.dir方法的别名。 - dirxml(object):显示特定对象的 XML 形式,是console.dirxml方法的别名。 12.debugger 语句 - debugger语句主要用于除错,作用是设置断点。 <!-- Object 对象 --> 1.Object() - Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。 2.Object 构造函数 - Object不仅可以当作工具函数使用,还可以当作构造函数使用,即前面可以使用new命令。 3.Object 的静态方法 - Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。 - Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。 4.对象属性模型的相关方法 - Object.getOwnPropertyDescriptor():获取某个属性的描述对象。 - Object.defineProperty():通过描述对象,定义某个属性。 - Object.defineProperties():通过描述对象,定义多个属性。 5.控制对象状态的方法 - Object.preventExtensions():防止对象扩展。 - Object.isExtensible():判断对象是否可扩展。 - Object.seal():禁止对象配置。 - Object.isSealed():判断一个对象是否可配置。 - Object.freeze():冻结一个对象。 - Object.isFrozen():判断一个对象是否被冻结。 6.原型链相关方法 - Object.create():该方法可以指定原型对象和属性,返回一个新的对象。 - Object.getPrototypeOf():获取对象的Prototype对象。 7.Object 的实例方法 - Object.prototype.valueOf():返回当前对象对应的值。 - Object.prototype.toString():返回当前对象对应的字符串形式。 - Object.prototype.toLocaleString():返回当前对象对应的本地字符串形式。 - Object.prototype.hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。 - Object.prototype.isPrototypeOf():判断当前对象是否为另一个对象的原型。 - Object.prototype.propertyIsEnumerable():判断某个属性是否可枚举。 <!-- 属性描述对象 --> JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。 属性描述对象提供6个元属性。 - value是该属性的属性值,默认为undefined。 - writable是一个布尔值,表示属性值(value)是否可改变(即是否可写),默认为true。 - enumerable是一个布尔值,表示该属性是否可遍历,默认为true。如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性。 - configurable是一个布尔值,表示可配置性,默认为true。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)。也就是说,configurable属性控制了属性描述对象的可写性。 - get是一个函数,表示该属性的取值函数(getter),默认为undefined。 - set是一个函数,表示该属性的存值函数(setter),默认为undefined。
1.Object.getOwnPropertyDescriptor()方法可以获取属性描述对象。它的第一个参数是目标对象,第二个参数是一个字符串,对应目标对象的某个属性名。 2.Object.getOwnPropertyNames方法返回一个数组,成员是参数对象自身的全部属性的属性名,不管该属性是否可遍历。 3.Object.defineProperty()方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象。 4.propertyIsEnumerable()方法返回一个布尔值,用来判断某个属性是否可遍历。注意,这个方法只能用于判断对象自身的属性,对于继承的属性一律返回false。 5.原属性,属性描述对象的各个属性称为“元属性”,因为它们可以看作是控制属性的属性。 - value属性是目标属性的值。 - writable属性是一个布尔值,决定了目标属性的值(value)是否可以被改变。 - enumerable(可遍历性)返回一个布尔值,表示目标属性是否可遍历。 - configurable(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。 6.存取器 - 除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为setter,使用属性描述对象的set属性;取值函数称为getter,使用属性描述对象的get属性。 7.对象的拷贝 - 为了解决这个问题,我们可以通过Object.defineProperty方法来拷贝属性。 8.控制对象状态 - Object.preventExtensions方法可以使得一个对象无法再添加新的属性。 - Object.isExtensible方法用于检查一个对象是否使用了Object.preventExtensions方法。 - Object.seal方法使得一个对象既无法添加新属性,也无法删除旧属性。 - Object.isSealed方法用于检查一个对象是否使用了Object.seal方法。 - Object.freeze方法可以使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值,使得这个对象实际上变成了常量。 - Object.isFrozen方法用于检查一个对象是否使用了Object.freeze方法。 - 局限性,上面的三个方法锁定对象的可写性有一个漏洞:可以通过改变原型对象,来为对象增加属性。 <!-- Array 对象 --> 1.Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。 2.Array.isArray(),方法返回一个布尔值,表示参数是否为数组。 3.valueOf(),方法是一个所有对象都拥有的方法,表示对该对象求值。 4.toString(),方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。 5.push(),push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。 6.pop(),pop方法用于删除数组的最后一个元素,并返回该元素。 7.shift(),shift()方法用于删除数组的第一个元素,并返回该元素。 8.unshift(),unshift()方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。 9.join(),join()方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。 10.concat(),concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。 11.reverse(),reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。 12.slice(),slice方法用于提取目标数组的一部分,返回一个新数组,原数组不变。 13.splice(),splice方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。 14.sort(),sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。 15.map(),map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。 15.forEach(),forEach方法与map方法很相似,也是对数组的所有成员依次执行参数函数。但是,forEach方法不返回值,只用来操作数据。 16.filter(),filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。 17.some(),some方法是只要一个成员的返回值是true,则整个some方法的返回值就是true,否则返回false。 18.every(),every方法是所有成员的返回值都是true,整个every方法才返回true,否则返回false。 19.reduce(),reduce是从左到右处理(从第一个成员到最后一个成员)。 20.reduceRight(),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。 21.indexOf(),indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。 22.lastIndexOf(),lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。 23.链式使用 <!-- 包装对象 --> 1.valueOf() - valueOf()方法返回包装对象实例对应的原始类型的值。 2.toString() - toString()方法返回对应的字符串形式。 3.原始类型与实例对象的自动转换 - 原始类型的值会自动当作包装对象调用,即调用包装对象的属性和方法。 4.自定义方法 - 除了原生的实例方法,包装对象还可以自定义方法和属性,供原始类型的值直接调用。 <!-- Boolean 对象 --> 1.Boolean对象是 JavaScript 的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。 2.Boolean 函数的类型转换作用 - Boolean对象除了可以作为构造函数,还可以单独使用,将任意值转为布尔值。这时Boolean就是一个单纯的工具方法。 <!-- Number 对象 --> 1.Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。 2.静态属性 - Number.POSITIVE_INFINITY:正的无限,指向Infinity。 - Number.NEGATIVE_INFINITY:负的无限,指向-Infinity。 - Number.NaN:表示非数值,指向NaN。 - Number.MIN_VALUE:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-Number.MIN_VALUE。 - Number.MAX_SAFE_INTEGER:表示能够精确表示的最大整数,即9007199254740991。 - Number.MIN_SAFE_INTEGER:表示能够精确表示的最小整数,即-9007199254740991。 3.实例方法 - Number.prototype.toString(),Number对象部署了自己的toString方法,用来将一个数值转为字符串形式。 - Number.prototype.toFixed(),toFixed()方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串。 - Number.prototype.toExponential(),toExponential方法用于将一个数转为科学计数法形式。 - Number.prototype.toPrecision(),toPrecision方法用于将一个数转为指定位数的有效数字。 4.自定义方法 - 与其他对象一样,Number.prototype对象上面可以自定义方法,被Number的实例继承。 <!-- String 对象 --> 1.String对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象。 2.静态方法 - String.fromCharCode(),该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。 3.实例属性 - String.prototype.length,字符串实例的length属性返回字符串的长度。 4.实例方法 - String.prototype.charAt(),charAt方法返回指定位置的字符,参数是从0开始编号的位置。 - String.prototype.charCodeAt(),charCodeAt方法返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCharCode()的逆操作。 - String.prototype.concat(),concat方法用于连接两个字符串,返回一个新字符串,不改变原字符串。 - String.prototype.slice(),slice方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。 - String.prototype.substring(),substring方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice方法很相像。它的第一个参数表示子字符串的开始位置,第二个位置表示结束位置(返回结果不含该位置)。 - String.prototype.substr(),substr方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice和substring方法的作用相同。 - String.prototype.indexOf(),indexOf方法用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配。 - String.prototype.lastIndexOf(),lastIndexOf方法的用法跟indexOf方法一致,主要的区别是lastIndexOf从尾部开始匹配,indexOf则是从头部开始匹配。 - String.prototype.trim(),trim方法用于去除字符串两端的空格,返回一个新字符串,不改变原字符串。 - String.prototype.toLowerCase(),toLowerCase方法用于将一个字符串全部转为小写,返回一个新字符串,不改变原字符串。 - String.prototype.toUpperCase(),toUpperCase则是全部转为大写,返回一个新字符串,不改变原字符串。 - String.prototype.match(),match方法用于确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null。 - String.prototype.search(),search方法的用法基本等同于match,但是返回值为匹配的第一个位置。如果没有找到匹配,则返回-1。 - String.prototype.replace(),replace方法用于替换匹配的子字符串,一般情况下只替换第一个匹配(除非使用带有g修饰符的正则表达式)。 - String.prototype.split(),split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。 - String.prototype.localeCompare(),localeCompare方法用于比较两个字符串。它返回一个整数,如果小于0,表示第一个字符串小于第二个字符串;如果等于0,表示两者相等;如果大于0,表示第一个字符串大于第二个字符串。 <!-- Math 对象 --> 1.Math是 JavaScript 的原生对象,提供各种数学功能。 2.静态方法 - Math.abs():绝对值 - Math.ceil():向上取整 - Math.floor():向下取整 - Math.max():最大值 - Math.min():最小值 - Math.pow():指数运算 - Math.sqrt():平方根 - Math.log():自然对数 - Math.exp():e的指数 - Math.round():四舍五入 - Math.random():随机数 3.三角函数方法 - Math.sin():返回参数的正弦(参数为弧度值) - Math.cos():返回参数的余弦(参数为弧度值) - Math.tan():返回参数的正切(参数为弧度值) - Math.asin():返回参数的反正弦(返回值为弧度值) - Math.acos():返回参数的反余弦(返回值为弧度值) - Math.atan():返回参数的反正切(返回值为弧度值) <!-- Date 对象 --> 1.Date对象是 JavaScript 原生的时间库。Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。 2.构造函数的用法,Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。 3.日期的运算 4.静态方法 - Date.now(),返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。 - Date.parse(),用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。 - Date.UTC(),接受年、月、日等变量作为参数,返回该时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数。 - Date.prototype.valueOf(),返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于getTime方法。 5.实例方法,Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。 - to类:从Date对象返回一个字符串,表示指定的时间。 - get类:获取Date对象的日期和时间。 - set类:设置Date对象的日期和时间。 6.to 类方法 - Date.prototype.toString(),toString方法返回一个完整的日期字符串。 - Date.prototype.toUTCString(),toUTCString方法返回对应的 UTC 时间,也就是比北京时间晚8个小时。 - Date.prototype.toISOString(),toISOString方法返回对应时间的 ISO8601 写法。 - Date.prototype.toJSON(),toJSON方法返回一个符合 JSON 格式的 ISO 日期字符串,与toISOString方法的返回结果完全相同。 - Date.prototype.toDateString(),toDateString方法返回日期字符串(不含小时、分和秒)。 - Date.prototype.toTimeString(),toTimeString方法返回时间字符串(不含年月日)。 - 本地时间 Date.prototype.toLocaleString():完整的本地时间。 Date.prototype.toLocaleDateString():本地日期(不含小时、分和秒)。 Date.prototype.toLocaleTimeString():本地时间(不含年月日)。 7.get 类方法 - getTime():返回实例距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。 - getDate():返回实例对象对应每个月的几号(从1开始)。 - getDay():返回星期几,星期日为0,星期一为1,以此类推。 - getFullYear():返回四位的年份。 - getMonth():返回月份(0表示1月,11表示12月)。 - getHours():返回小时(0-23)。 - getMilliseconds():返回毫秒(0-999)。 - getMinutes():返回分钟(0-59)。 - getSeconds():返回秒(0-59)。 - getTimezoneOffset():返回当前时间与 UTC 的时区差异,以分钟表示,返回结果考虑到了夏令时因素。 8.set 类方法 - setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。 - setFullYear(year [, month, date]):设置四位年份。 - setHours(hour [, min, sec, ms]):设置小时(0-23)。 - setMilliseconds():设置毫秒(0-999)。 - setMinutes(min [, sec, ms]):设置分钟(0-59)。 - setMonth(month [, date]):设置月份(0-11)。 - setSeconds(sec [, ms]):设置秒(0-59)。 - setTime(milliseconds):设置毫秒时间戳。 <!-- RegExp 对象 --> 1.实例属性 - RegExp.prototype.ignoreCase:返回一个布尔值,表示是否设置了i修饰符。 - RegExp.prototype.global:返回一个布尔值,表示是否设置了g修饰符。 - RegExp.prototype.multiline:返回一个布尔值,表示是否设置了m修饰符。 - RegExp.prototype.flags:返回一个字符串,包含了已经设置的所有修饰符,按字母排序。 2.实例方法 - RegExp.prototype.test(),正则实例对象的test方法返回一个布尔值,表示当前模式是否能匹配参数字符串。 - RegExp.prototype.exec(),正则实例对象的exec方法,用来返回匹配结果。如果发现匹配,就返回一个数组,成员是匹配成功的子字符串,否则返回null。 3.字符串的实例方法 - String.prototype.match():返回一个数组,成员是所有匹配的子字符串。 - String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。 - String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。 - String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。 4.匹配规则 - 字面量字符和元字符 * 点字符(.),点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。 * 位置字符用来提示字符所处的位置,主要有两个字符。^ 表示字符串的开始位置,$ 表示字符串的结束位置。 * 选择符(|),竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog。 - 转义符,正则表达式中那些有特殊含义的元字符,如果要匹配它们本身,就需要在它们前面要加上反斜杠。 - 特殊字符,正则表达式对一些不能打印的特殊字符,提供了表达方法: * \cX 表示Ctrl-[X],其中的X是A-Z之中任一个英文字母,用来匹配控制字符。 * [\b] 匹配退格键(U+0008),不要与\b混淆。 * \n 匹配换行键。 * \r 匹配回车键。 * \t 匹配制表符 tab(U+0009)。 * \v 匹配垂直制表符(U+000B)。 * \f 匹配换页符(U+000C)。 * \0 匹配null字符(U+0000)。 * \xhh 匹配一个以两位十六进制数(\x00-\xFF)表示的字符。 * \uhhhh 匹配一个以四位十六进制数(\u0000-\uFFFF)表示的 Unicode 字符。 - 字符类,字符类(class)表示有一系列字符可供选择,只要匹配其中一个就可以了。 * 脱字符(^),如果方括号内的第一个字符是[^],则表示除了字符类之中的字符,其他字符都可以匹配。 * 连字符(-),某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。 - 预定义模式: \d 匹配0-9之间的任一数字,相当于[0-9]。 \D 匹配所有0-9以外的字符,相当于[^0-9]。 \w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。 \W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。 \s 匹配空格(包括换行符、制表符、空格符等),相等于[ \t\r\n\v\f]。 \S 匹配非空格的字符,相当于[^ \t\r\n\v\f]。 \b 匹配词的边界。 \B 匹配非词边界,即在词的内部。 - 重复类,模式的精确匹配次数,使用大括号({})表示。 - 量词符: ? 问号表示某个模式出现0次或1次,等同于{0, 1}。 * 星号表示某个模式出现0次或多次,等同于{0,}。 + 加号表示某个模式出现1次或多次,等同于{1,}。 - 贪婪模式,上一小节的三个量词符,默认情况下都是最大可能匹配,即匹配直到下一个字符不满足匹配规则为止。这被称为贪婪模式。 - 修饰符,修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部。 * g 修饰符,g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。 * i 修饰符,默认情况下,正则对象区分字母的大小写,加上i修饰符以后表示忽略大小写(ignoreCase)。 * m 修饰符,m修饰符表示多行模式(multiline),会修改^和$的行为。 - 组匹配,正则表达式的括号表示分组匹配,括号中的模式可以用来匹配分组的内容。 - 非捕获组,(?:x)称为非捕获组(Non-capturing group),表示不返回该组匹配的内容,即匹配的结果中不计入这个括号。 - 先行断言,x(?=y)称为先行断言(Positive look-ahead),x只有在y前面才匹配,y不会被计入返回结果。 - 先行否定断言,x(?!y)称为先行否定断言(Negative look-ahead),x只有不在y前面才匹配,y不会被计入返回结果。 <!-- JSON 对象 --> 1.JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式, - 规定: 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。 原始类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。 字符串必须使用双引号表示,不能使用单引号。 对象的键名必须放在双引号里面。 数组或对象最后一个成员的后面,不能加逗号。 - JSON.stringify(),JSON.stringify方法用于将一个值转为 JSON 字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。 - JSON.parse(),JSON.parse方法用于将 JSON 字符串转换成对应的值。 <!-- 实例对象与 new 命令 --> 1.对象是什么? - 对象是单个实物的抽象。 - 对象是一个容器,封装了属性(property)和方法(method)。 2.构造函数 - 函数体内部使用了this关键字,代表了所要生成的对象实例。 - 生成对象的时候,必须使用new命令。 3.new 命令 - new 命令的原理: 创建一个空对象,作为将要返回的对象实例。 将这个空对象的原型,指向构造函数的prototype属性。 将这个空对象赋值给函数内部的this关键字。 开始执行构造函数内部的代码。 - new.target 函数内部可以使用new.target属性。如果当前函数是new命令调用,new.target指向当前函数,否则为undefined。 4.Object.create() 创建实例对象 构造函数作为模板,可以生成实例对象。但是,有时拿不到构造函数,只能拿到一个现有的对象。我们希望以这个现有的对象作为模板,生成新的实例对象,这时就可以使用Object.create()方法。 <!-- this 关键字 --> 1.this就是属性或方法“当前”所在的对象。 2.JavaScript 语言之所以有 this 的设计,跟内存里面的数据结构有关系。 3.使用场合 - 全局环境,全局环境使用this,它指的就是顶层对象window。 - 构造函数,构造函数中的this,指的是实例对象。 - 对象的方法,如果对象的方法里面包含this,this的指向就是方法运行时所在的对象。该方法赋值给另一个对象,就会改变this的指向。 4.使用注意点 - 避免多层 this,由于this的指向是不确定的,所以切勿在函数中包含多层的this。 - 避免数组处理方法中的 this,数组的map和foreach方法,允许提供一个函数作为参数。 - 避免回调函数中的 this,回调函数中的this往往会改变指向,最好避免使用。 5.绑定 this 的方法 - Function.prototype.call(),函数实例的call方法,可以指定函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。 - Function.prototype.apply(),apply方法的作用与call方法类似,也是改变this指向,然后再调用该函数。一的区别就是,它接收一个数组作为函数执行时的参数。 - Function.prototype.bind(),bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数。 <!-- 对象的继承 --> 1.构造函数的缺点,同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。 2.prototype 属性的作用,JavaScript 规定,每个函数都有一个prototype属性,指向一个对象。 3.原型链,JavaScript 规定,所有对象都有自己的原型对象(prototype)。一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。因此,就会形成一个“原型链”(prototype chain):对象到原型,再到原型的原型…… 4.constructor 属性,prototype对象有一个constructor属性,默认指向prototype对象所在的构造函数。 5.instanceof 运算符,instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例。 6.构造函数的继承 // 第一步,子类继承父类的实例 function Rectangle() { Shape.call(this); // 调用父类构造函数 } // 另一种写法 function Rectangle() { this.base = Shape; this.base(); }
// 第二步,子类继承父类的原型 Rectangle.prototype = Object.create(Shape.prototype); Rectangle.prototype.constructor = Rectangle; 7.多重继承 function M1() { this.hello = 'hello'; }
function M2() { this.world = 'world'; }
function S() { M1.call(this); M2.call(this); }
// 继承 M1 S.prototype = Object.create(M1.prototype); // 继承链上加入 M2 Object.assign(S.prototype, M2.prototype);
// 指定构造函数 S.prototype.constructor = S;
var s = new S(); s.hello // 'hello' s.world // 'world' 8.模块 - 模块是实现特定功能的一组属性和方法的封装。 var module1 = new Object({ _count : 0, m1 : function (){ //... }, m2 : function (){ //... } }); - 封装私有变量:构造函数的写法 function StringBuilder() { var buffer = [];
this.add = function (str) { buffer.push(str); };
this.toString = function () { return buffer.join(''); };
} - 封装私有变量:立即执行函数的写法 var module1 = (function () { var _count = 0; var m1 = function () { //... }; var m2 = function () { //... }; return { m1 : m1, m2 : m2 }; })(); 9.模块的放大模式 var module1 = (function (mod){ mod.m3 = function () { //... }; return mod; })(module1); 10.输入全局变量:独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。 var module1 = (function ($, YAHOO) { //... })(jQuery, YAHOO); <!-- Object 对象的相关方法 --> 1.Object.getPrototypeOf(),Object.getPrototypeOf方法返回参数对象的原型。这是获取原型对象的标准方法。 2.Object.setPrototypeOf(),Object.setPrototypeOf方法为参数对象设置原型,返回该参数对象。它接受两个参数,第一个是现有对象,第二个是原型对象。 3.Object.create(),生成实例对象的常用方法是,使用new命令让构造函数返回一个实例。 4.Object.prototype.isPrototypeOf(),实例对象的isPrototypeOf方法,用来判断该对象是否为参数对象的原型。 5.Object.prototype.__proto__,实例对象的__proto__属性(前后各两个下划线),返回该对象的原型。该属性可读写。 6.获取原型对象方法的比较,获取实例对象obj的原型对象,有三种方法。 - obj.__proto__ - obj.constructor.prototype - Object.getPrototypeOf(obj) 7.Object.getOwnPropertyNames(),Object.getOwnPropertyNames方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。 8.Object.prototype.hasOwnProperty(),对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。 9.in 运算符和 for...in 循环,in运算符返回一个布尔值,表示一个对象是否具有某个属性。它不区分该属性是对象自身的属性,还是继承的属性。 10.对象的拷贝Object.getOwnPropertyDescriptors方法。 <!-- 严格模式 --> 1.设计目的 - 明确禁止一些不合理、不严谨的语法,减少 JavaScript 语言的一些怪异行为。 - 增加更多报错的场合,消除代码运行的一些不安全之处,保证代码运行的安全。 - 提高编译器效率,增加运行速度。 - 为未来新版本的 JavaScript 语法做好铺垫。 2.启用方法,进入严格模式的标志,是一行字符串use strict。 3.显式报错,严格模式使得 JavaScript 的语法变得更严格,更多的操作会显式报错。其中有些操作,在正常模式下只会默默地失败,不会报错。 - 只读属性不可写 - 只设置了取值器的属性不可写 - 禁止扩展的对象不可扩展 - eval、arguments 不可用作标识名 - 函数不能有重名的参数 - 禁止八进制的前缀0表示法 4.增强的安全措施 - 全局变量显式声明 - 禁止 this 关键字指向全局对象 - 禁止使用 fn.callee、fn.caller - 禁止使用 arguments.callee、arguments.caller - 禁止删除变量 5.静态绑定 - 禁止使用 with 语句 - 创设 eval 作用域 - arguments 不再追踪参数的变化 6.向下一个版本的 JavaScript 过渡 - 非函数代码块不得声明函数 - 保留字 <!-- 异步操作概述 --> 1.单线程模型,单线程模型指的是,JavaScript 只在一个线程上运行。 2.同步任务和异步任务,程序里面所有的任务,可以分成两类:同步任务(synchronous)和异步任务(asynchronous)。 3.任务队列和事件循环,JavaScript 运行时,除了一个正在运行的主线程,引擎还提供一个任务队列(task queue),里面是各种需要当前程序处理的异步任务。 4.异步操作的模式 - 回调函数,回调函数是异步操作最基本的方法。 - 事件监听,另一种思路是采用事件驱动模式。异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生。 - 发布/订阅,事件完全可以理解成“信号”,如果存在一个“信号中心”,某个任务执行完成,就向信号中心“发布”(publish)一个信号,其他任务可以向信号中心“订阅”(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做”发布/订阅模式”(publish-subscribe pattern),又称“观察者模式”(observer pattern)。 5.异步操作的流程控制 - 串行执行,我们可以编写一个流程控制函数,让它来控制异步任务,一个任务完成以后,再执行另一个。这就叫串行执行。 - 并行执行,流程控制函数也可以是并行执行,即所有异步任务同时执行,等到全部完成以后,才执行final函数。 - 并行与串行的结合,所谓并行与串行的结合,就是设置一个门槛,每次最多只能并行执行n个异步任务,这样就避免了过分占用系统资源。 <!-- 定时器 --> JavaScript 提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。它们向任务队列添加定时任务。 1.setTimeout(),setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。 2.setInterval(),setInterval函数的用法与setTimeout完全一致,区别仅仅在于setInterval指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行。 3.clearTimeout(),clearInterval(),setTimeout和setInterval函数,都返回一个整数值,表示计数器编号。将该整数传入clearTimeout和clearInterval函数,就可以取消对应的定时器。 4.实例:debounce 函数 5.运行机制,setTimeout和setInterval的运行机制,是将指定的代码移出本轮事件循环,等到下一轮事件循环,再检查是否到了指定时间。 6.setTimeout(f, 0),setTimeout(f, 0)会在下一轮事件循环一开始就执行。 7.应用,setTimeout(f, 0)有几个非常重要的用途。它的一大应用是,可以调整事件的发生顺序。比如,网页开发中,某个事件先发生在子元素,然后冒泡到父元素,即子元素的事件回调函数,会早于父元素的事件回调函数触发。如果,想让父元素的事件回调函数先发生,就要用到setTimeout(f, 0)。 <!-- Promise 对象 --> Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。 1.Promise 对象的状态,Promise 实例具有三种状态。 - 异步操作未完成(pending) - 异步操作成功(fulfilled) - 异步操作失败(rejected) 2.Promise 构造函数,JavaScript 提供原生的Promise构造函数,用来生成 Promise 实例。 3.Promise.prototype.then(),Promise 实例的then方法,用来添加回调函数。then方法可以接受两个回调函数,第一个是异步操作成功时(变为fulfilled状态)的回调函数,第二个是异步操作失败(变为rejected)时的回调函数(该参数可以省略)。一旦状态改变,就调用相应的回调函数。 4.then() 用法辨析 5.实例:图片加载 var preloadImage = function (path) { return new Promise(function (resolve, reject) { var image = new Image(); image.onload = resolve; image.onerror = reject; image.src = path; }); }; Promise 的优点在于,让回调函数变成了规范的链式写法,程序流程可以看得很清楚。Promise 的缺点是,编写的难度比传统写法高,而且阅读代码也不是一眼可以看懂。 6.微任务,Promise 的回调函数属于异步任务,会在同步任务之后执行。 new Promise(function (resolve, reject) { resolve(1); }).then(console.log);
console.log(2); // 2 // 1 <!-- DOM 概述 --> 1.DOM 的最小组成单位叫做节点(node)。节点的类型有七种。 - Document:整个文档树的顶层节点 - DocumentType:doctype标签(比如<!DOCTYPE html>) - Element:网页的各种HTML标签(比如<body>、<a>等) - Attribute:网页元素的属性(比如class="right") - Text:标签之间或标签包含的文本 - Comment:注释 - DocumentFragment:文档的片段 2.节点树 一个文档的所有节点,按照所在的层级,可以抽象成一种树状结构。这种树状结构就是 DOM 树。除了根节点,其他节点都有三种层级关系。 - 父节点关系(parentNode):直接的那个上级节点 - 子节点关系(childNodes):直接的下级节点 - 同级节点关系(sibling):拥有同一个父节点的节点 3.DOM 提供操作接口,用来获取这三种关系的节点。 - 子节点接口包括firstChild(第一个子节点)lastChild(最后一个子节点)等属性 - 同级节点接口包括nextSibling(紧邻在后的那个同级节点)previousSibling(紧邻在前的那个同级节点)属性。 <!-- Node 接口 --> 1.Node.prototype.nodeType,nodeType属性返回一个整数值,表示节点的类型。 2.Node.prototype.nodeName,nodeName属性返回节点的名称。 不同节点的nodeName属性值如下。 - 文档节点(document):#document - 元素节点(element):大写的标签名 - 属性节点(attr):属性的名称 - 文本节点(text):#text - 文档片断节点(DocumentFragment):#document-fragment - 文档类型节点(DocumentType):文档的类型 - 注释节点(Comment):#comment 3.Node.prototype.nodeValue,nodeValue属性返回一个字符串,表示当前节点本身的文本值,该属性可读写。只有文本节点(text)、注释节点(comment)和属性节点(attr)有文本值,因此这三类节点的nodeValue可以返回结果,其他类型的节点一律返回null。 4.Node.prototype.textContent,textContent属性返回当前节点和它的所有后代节点的文本内容。 5.Node.prototype.baseURI,baseURI属性返回一个字符串,表示当前网页的绝对路径。 6.Node.prototype.ownerDocument,Node.ownerDocument属性返回当前节点所在的顶层文档对象,即document对象。 7.Node.prototype.nextSibling,Node.nextSibling属性返回紧跟在当前节点后面的第一个同级节点。如果当前节点后面没有同级节点,则返回null。 8.Node.prototype.previousSibling,previousSibling属性返回当前节点前面的、距离最近的一个同级节点。如果当前节点前面没有同级节点,则返回null。 9.Node.prototype.parentNode,parentNode属性返回当前节点的父节点。对于一个节点来说,它的父节点只可能是三种类型:元素节点(element)、文档节点(document)和文档片段节点(documentfragment)。 10.Node.prototype.parentElement,parentElement属性返回当前节点的父元素节点。如果当前节点没有父节点,或者父节点类型不是元素节点,则返回null。 11.Node.prototype.firstChild,Node.prototype.lastChild,firstChild属性返回当前节点的第一个子节点,如果当前节点没有子节点,则返回null。lastChild属性返回当前节点的最后一个子节点,如果当前节点没有子节点,则返回null。用法与firstChild属性相同。 12.Node.prototype.childNodes,childNodes属性返回一个类似数组的对象(NodeList集合),成员包括当前节点的所有子节点。 13.Node.prototype.isConnected,isConnected属性返回一个布尔值,表示当前节点是否在文档之中。 14.Node.prototype.appendChild(),appendChild()方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。该方法的返回值就是插入文档的子节点。 15.Node.prototype.hasChildNodes(),hasChildNodes方法返回一个布尔值,表示当前节点是否有子节点。 - node.hasChildNodes() - node.firstChild !== null - node.childNodes && node.childNodes.length > 0 hasChildNodes方法结合firstChild属性和nextSibling属性,可以遍历当前节点的所有后代节点。 16.Node.prototype.cloneNode(),cloneNode方法用于克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点。它的返回值是一个克隆出来的新节点。 17.Node.prototype.insertBefore(),insertBefore方法用于将某个节点插入父节点内部的指定位置。 18.Node.prototype.removeChild(),removeChild方法接受一个子节点作为参数,用于从当前节点移除该子节点。返回值是移除的子节点。 19.Node.prototype.replaceChild(),replaceChild方法用于将一个新的节点,替换当前节点的某一个子节点。 20.Node.prototype.contains(),contains方法返回一个布尔值,表示参数节点是否满足以下三个条件之一。 - 参数节点为当前节点。 - 参数节点为当前节点的子节点。 - 参数节点为当前节点的后代节点。 21.Node.prototype.compareDocumentPosition(),compareDocumentPosition方法的用法,与contains方法完全一致,返回一个六个比特位的二进制值,表示参数节点与当前节点的关系。 22.Node.prototype.isEqualNode(),Node.prototype.isSameNode(),isEqualNode方法返回一个布尔值,用于检查两个节点是否相等。所谓相等的节点,指的是两个节点的类型相同、属性相同、子节点相同。 23.Node.prototype.normalize(),normalize方法用于清理当前节点内部的所有文本节点(text)。它会去除空的文本节点,并且将毗邻的文本节点合并成一个,也就是说不存在空的文本节点,以及毗邻的文本节点。 24.Node.prototype.getRootNode(),getRootNode()方法返回当前节点所在文档的根节点document,与ownerDocument属性的作用相同。 <!-- NodeList 接口,HTMLCollection 接口 --> 1.NodeList 接口,NodeList实例是一个类似数组的对象,它的成员是节点对象。通过以下方法可以得到NodeList实例。 - Node.childNodes - document.querySelectorAll()等节点搜索方法 2.NodeList.prototype.length,length属性返回 NodeList 实例包含的节点数量。 3.NodeList.prototype.forEach(),forEach方法用于遍历 NodeList 的所有成员。它接受一个回调函数作为参数,每一轮遍历就执行一次这个回调函数,用法与数组实例的forEach方法完全一致。 4.NodeList.prototype.item(),item方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。 5.NodeList.prototype.keys(),NodeList.prototype.values(),NodeList.prototype.entries() ,这三个方法都返回一个 ES6 的遍历器对象,可以通过for...of循环遍历获取每一个成员的信息。区别在于,keys()返回键名的遍历器,values()返回键值的遍历器,entries()返回的遍历器同时包含键名和键值的信息。 6.HTMLCollection 接口,HTMLCollection是一个节点对象的集合,只能包含元素节点(element),不能包含其他类型的节点。 7.HTMLCollection.prototype.length,length属性返回HTMLCollection实例包含的成员数量。 8.HTMLCollection.prototype.item(),item方法接受一个整数值作为参数,表示成员的位置,返回该位置上的成员。 9.HTMLCollection.prototype.namedItem(),namedItem方法的参数是一个字符串,表示id属性或name属性的值,返回对应的元素节点。如果没有对应的节点,则返回null。 <!-- ParentNode 接口,ChildNode 接口 --> ParentNode接口表示当前节点是一个父节点,提供一些处理子节点的方法。ChildNode接口表示当前节点是一个子节点,提供一些相关方法。 1.ParentNode.children,children属性返回一个HTMLCollection实例,成员是当前节点的所有元素子节点。该属性只读。 2.ParentNode.firstElementChild,firstElementChild属性返回当前节点的第一个元素子节点。如果没有任何元素子节点,则返回null。 3.ParentNode.lastElementChild,lastElementChild属性返回当前节点的最后一个元素子节点,如果不存在任何元素子节点,则返回null。 4.ParentNode.childElementCount,childElementCount属性返回一个整数,表示当前节点的所有元素子节点的数目。如果不包含任何元素子节点,则返回0。 5.ParentNode.append(),ParentNode.prepend() - append方法为当前节点追加一个或多个子节点,位置是最后一个元素子节点的后面。该方法不仅可以添加元素子节点,还可以添加文本子节点。 - prepend方法为当前节点追加一个或多个子节点,位置是第一个元素子节点的前面。它的用法与append方法完全一致,也是没有返回值。 6.ChildNode 接口 - ChildNode.remove(),remove方法用于从父节点移除当前节点。 - ChildNode.before(),ChildNode.after(),before方法用于在当前节点的前面,插入一个或多个同级节点。两者拥有相同的父节点。注意,该方法不仅可以插入元素节点,还可以插入文本节点。after方法用于在当前节点的后面,插入一个或多个同级节点,两者拥有相同的父节点。用法与before方法完全相同。 - ChildNode.replaceWith(),replaceWith方法使用参数节点,替换当前节点。参数可以是元素节点,也可以是文本节点。 <!-- Document 节点 --> 1.document节点对象代表整个文档,每张网页都有自己的document对象。document对象有不同的办法可以获取。 - 正常的网页,直接使用document或window.document。 - iframe框架里面的网页,使用iframe节点的contentDocument属性。 - Ajax 操作返回的文档,使用XMLHttpRequest对象的responseXML属性。 - 内部节点的ownerDocument属性。 2.快捷方式属性 - document.defaultView,document.defaultView属性返回document对象所属的window对象。如果当前文档不属于window对象,该属性返回null。 - document.doctype,对于 HTML 文档来说,document对象一般有两个子节点。第一个子节点是document.doctype,指向<DOCTYPE>节点,即文档类型(Document Type Declaration,简写DTD)节点。HTML 的文档类型节点,一般写成<!DOCTYPE html>。如果网页没有声明 DTD,该属性返回null。 - document.documentElement,document.documentElement属性返回当前文档的根元素节点(root)。它通常是document节点的第二个子节点,紧跟在document.doctype节点后面。HTML网页的该属性,一般是<html>节点。 - document.body,document.head,document.body属性指向<body>节点,document.head属性指向<head>节点。这两个属性总是存在的,如果网页源码里面省略了<head>或<body>,浏览器会自动创建。另外,这两个属性是可写的,如果改写它们的值,相当于移除所有子节点。 - document.scrollingElement,document.scrollingElement属性返回文档的滚动元素。也就是说,当文档整体滚动时,到底是哪个元素在滚动。标准模式下,这个属性返回的文档的根元素document.documentElement(即<html>)。兼容(quirk)模式下,返回的是<body>元素,如果该元素不存在,返回null。 - document.activeElement,document.activeElement属性返回获得当前焦点(focus)的 DOM 元素。通常,这个属性返回的是<input>、<textarea>、<select>等表单元素,如果当前没有焦点元素,返回<body>元素或null。 - document.fullscreenElement,document.fullscreenElement属性返回当前以全屏状态展示的 DOM 元素。如果不是全屏状态,该属性返回null。 3.节点集合属性 - document.links,document.links属性返回当前文档所有设定了href属性的<a>及<area>节点。 - document.forms,document.forms属性返回所有<form>表单节点。 - document.images,document.images属性返回页面所有<img>图片节点。 - document.embeds,document.plugins,document.embeds属性和document.plugins属性,都返回所有<embed>节点。 - document.scripts,document.scripts属性返回所有<script>节点。 - document.styleSheets,document.styleSheets属性返回文档内嵌或引入的样式表集合 document.links instanceof HTMLCollection // true document.images instanceof HTMLCollection // true document.forms instanceof HTMLCollection // true document.embeds instanceof HTMLCollection // true document.scripts instanceof HTMLCollection // true HTMLCollection实例是类似数组的对象,所以这些属性都有length属性,都可以使用方括号运算符引用成员。如果成员有id或name属性,还可以用这两个属性的值,在HTMLCollection实例上引用到这个成员。 - 文档静态信息属性 - document.documentURI,document.URL,document.documentURI属性和document.URL属性都返回一个字符串,表示当前文档的网址。不同之处是它们继承自不同的接口,documentURI继承自Document接口,可用于所有文档;URL继承自HTMLDocument接口,只能用于 HTML 文档。 - document.domain,document.domain属性返回当前文档的域名,不包含协议和端口。比如,网页的网址是http://www.example.com:80/hello.html,那么document.domain属性就等于www.example.com。如果无法获取域名,该属性返回null。 - document.location,Location对象是浏览器提供的原生对象,提供 URL 相关的信息和操作方法。通过window.location和document.location属性,可以拿到这个对象。 - document.lastModified,document.lastModified属性返回一个字符串,表示当前文档最后修改的时间。不同浏览器的返回值,日期格式是不一样的。 - document.title,document.title属性返回当前文档的标题。默认情况下,返回<title>节点的值。但是该属性是可写的,一旦被修改,就返回修改后的值。 - document.characterSet,document.characterSet属性返回当前文档的编码,比如UTF-8、ISO-8859-1等等。 - document.referrer,document.referrer属性返回一个字符串,表示当前文档的访问者来自哪里。 - document.dir,document.dir返回一个字符串,表示文字方向。它只有两个可能的值:rtl表示文字从右到左,阿拉伯文是这种方式;ltr表示文字从左到右,包括英语和汉语在内的大多数文字采用这种方式。 - document.compatMode,compatMode属性返回浏览器处理文档的模式,可能的值为BackCompat(向后兼容模式)和CSS1Compat(严格模式)。 4.文档状态属性 - document.hidden,document.hidden属性返回一个布尔值,表示当前页面是否可见。如果窗口最小化、浏览器切换了 Tab,都会导致导致页面不可见,使得document.hidden返回true。 - document.visibilityState,document.visibilityState返回文档的可见状态。 visible:页面可见。注意,页面可能是部分可见,即不是焦点窗口,前面被其他窗口部分挡住了。 hidden:页面不可见,有可能窗口最小化,或者浏览器切换到了另一个 Tab。 prerender:页面处于正在渲染状态,对于用户来说,该页面不可见。 unloaded:页面从内存里面卸载了。 - document.readyState,document.readyState属性返回当前文档的状态,共有三种可能的值。 loading:加载 HTML 代码阶段(尚未完成解析) interactive:加载外部资源阶段 complete:加载完成 - document.cookie,document.cookie属性用来操作浏览器 Cookie - document.designMode,document.designMode属性控制当前文档是否可编辑。 - document.implementation,document.implementation属性返回一个DOMImplementation对象。该对象有三个方法,主要用于创建独立于当前文档的新的 Document 对象。 DOMImplementation.createDocument():创建一个 XML 文档。 DOMImplementation.createHTMLDocument():创建一个 HTML 文档。 DOMImplementation.createDocumentType():创建一个 DocumentType 对象。 5.方法 - document.open方法清除当前文档所有内容,使得文档处于可写状态,供document.write方法写入内容。 - document.close方法用来关闭document.open()打开的文档。 - document.write方法用于向当前文档写入内容。在网页的首次渲染阶段,只要页面没有关闭写入(即没有执行document.close()),document.write写入的内容就会追加在已有内容的后面。 - document.querySelector(),document.querySelectorAll(),document.querySelector方法接受一个 CSS 选择器作为参数,返回匹配该选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null。 - document.getElementsByTagName(),document.getElementsByTagName方法搜索 HTML 标签名,返回符合条件的元素。它的返回值是一个类似数组对象(HTMLCollection实例),可以实时反映 HTML 文档的变化。如果没有任何匹配的元素,就返回一个空集。 - document.getElementsByClassName(),document.getElementsByClassName方法返回一个类似数组的对象(HTMLCollection实例),包括了所有class名字符合指定条件的元素,元素的变化实时反映在返回结果中。 - document.getElementsByName(),document.getElementsByName方法用于选择拥有name属性的 HTML 元素(比如<form>、<radio>、<img>、<frame>、<embed>和<object>等),返回一个类似数组的的对象(NodeList实例),因为name属性相同的元素可能不止一个。 - document.getElementById(),document.getElementById方法返回匹配指定id属性的元素节点。如果没有发现匹配的节点,则返回null。 - document.elementFromPoint(),document.elementsFromPoint(),document.elementFromPoint方法返回位于页面指定位置最上层的元素节点。document.elementsFromPoint()返回一个数组,成员是位于指定坐标(相对于视口)的所有元素。 - document.createElement(),document.createElement方法用来生成元素节点,并返回该节点。 - document.createTextNode(),document.createTextNode方法用来生成文本节点(Text实例),并返回该节点。它的参数是文本节点的内容。 - document.createAttribute(),document.createAttribute方法生成一个新的属性节点(Attr实例),并返回它。 - document.createComment(),document.createComment方法生成一个新的注释节点,并返回该节点。 - document.createDocumentFragment(),document.createDocumentFragment方法生成一个空的文档片段对象(DocumentFragment实例)。 - document.createEvent(),document.createEvent方法生成一个事件对象(Event实例),该对象可以被element.dispatchEvent方法使用,触发指定事件。 - document.hasFocus(),document.hasFocus方法返回一个布尔值,表示当前文档之中是否有元素被激活或获得焦点。 - document.adoptNode(),document.importNode(),document.adoptNode方法将某个节点及其子节点,从原来所在的文档或DocumentFragment里面移除,归属当前document对象,返回插入后的新节点。插入的节点对象的ownerDocument属性,会变成当前的document对象,而parentNode属性是null。 - document.createNodeIterator(),document.createNodeIterator方法返回一个子节点遍历器。 - document.createTreeWalker(),document.createTreeWalker方法返回一个 DOM 的子树遍历器。它与document.createNodeIterator方法基本是类似的,区别在于它返回的是TreeWalker实例,后者返回的是NodeIterator实例。另外,它的第一个节点不是根节点。document.createTreeWalker方法的第一个参数是所要遍历的根节点,第二个参数指定所要遍历的节点类型(与document.createNodeIterator方法的第二个参数相同)。 - document.execCommand(),如果document.designMode属性设为on,那么整个文档用户可编辑;如果元素的contenteditable属性设为true,那么该元素可编辑。 - document.execCommand()的返回值是一个布尔值。如果为false,表示这个方法无法生效。 - document.execCommand()方法可以执行的样式改变有很多种,下面是其中的一些:bold、insertLineBreak、selectAll、createLink、insertOrderedList、subscript、delete、insertUnorderedList、superscript、formatBlock、insertParagraph、undo、forwardDelete、insertText、unlink、insertImage、italic、unselect、insertHTML、redo。 - document.queryCommandSupported(),document.queryCommandSupported()方法返回一个布尔值,表示浏览器是否支持document.execCommand()的某个命令。 - document.queryCommandEnabled(),document.queryCommandEnabled()方法返回一个布尔值,表示当前是否可用document.execCommand()的某个命令。 - document.getSelection() ,这个方法指向window.getSelection()。 // Element 节点 1.Element.id,Element.id属性返回指定元素的id属性,该属性可读写。 2.Element.tagName,Element.tagName属性返回指定元素的大写标签名,与nodeName属性的值相等。 3.Element.dir,Element.dir属性用于读写当前元素的文字方向,可能是从左到右("ltr"),也可能是从右到左("rtl")。 4.Element.accessKey,Element.accessKey属性用于读写分配给当前元素的快捷键。 5.Element.draggable,Element.draggable属性返回一个布尔值,表示当前元素是否可拖动。该属性可读写。 6.Element.lang,Element.lang属性返回当前元素的语言设置。该属性可读写。 7.Element.tabIndex,Element.tabIndex属性返回一个整数,表示当前元素在 Tab 键遍历时的顺序。该属性可读写。 8.Element.title,Element.title属性用来读写当前元素的 HTML 属性title。该属性通常用来指定,鼠标悬浮时弹出的文字提示框。 9.Element.hidden,Element.hidden属性返回一个布尔值,表示当前元素的hidden属性,用来控制当前元素是否可见。 10.Element.contentEditable,Element.isContentEditable,Element.contentEditable属性返回一个字符串,表示是否设置了contenteditable属性,有三种可能的值。该属性可写。 "true":元素内容可编辑 "false":元素内容不可编辑 "inherit":元素是否可编辑,继承了父元素的设置 Element.isContentEditable属性返回一个布尔值,同样表示是否设置了contenteditable属性。该属性只读。 11.Element.attributes,Element.attributes属性返回一个类似数组的对象,成员是当前元素节点的所有属性节点。 12.Element.className,Element.classList,className属性用来读写当前元素节点的class属性。它的值是一个字符串,每个class之间用空格分割。 classList属性返回一个类似数组的对象,当前元素节点的每个class就是这个对象的一个成员。 classList对象有下列方法。 add():增加一个 class。 remove():移除一个 class。 contains():检查当前元素是否包含某个 class。 toggle():将某个 class 移入或移出当前元素。 item():返回指定索引位置的 class。 toString():将 class 的列表转为字符串。 13.Element.dataset,网页元素可以自定义data-属性,用来添加数据。 14.Element.innerHTML,Element.innerHTML属性返回一个字符串,等同于该元素包含的所有 HTML 代码。该属性可读写,常用来设置某个节点的内容。它能改写所有元素节点的内容,包括<HTML>和<body>元素。 15.Element.outerHTML,Element.outerHTML属性返回一个字符串,表示当前元素节点的所有 HTML 代码,包括该元素本身和所有子元素。 16.Element.clientHeight,Element.clientWidth 17.Element.clientLeft,Element.clientTop 18.Element.scrollHeight,Element.scrollWidth 19.Element.scrollLeft,Element.scrollTop 20.Element.offsetParent 21.Element.offsetHeight,Element.offsetWidth 22.Element.offsetLeft,Element.offsetTop 23.Element.style 24.Element.children,Element.childElementCount 25.Element.firstElementChild,Element.lastElementChild 26.Element.nextElementSibling,Element.previousElementSibling 27.属性相关方法,元素节点提供六个方法,用来操作属性。 - getAttribute():读取某个属性的值 - getAttributeNames():返回当前元素的所有属性名 - setAttribute():写入属性值 - hasAttribute():某个属性是否存在 - hasAttributes():当前元素是否有属性 - removeAttribute():删除属性 28.Element.querySelector(),Element.querySelector方法接受 CSS 选择器作为参数,返回父元素的第一个匹配的子元素。如果没有找到匹配的子元素,就返回null。 29.Element.querySelectorAll(),Element.querySelectorAll方法接受 CSS 选择器作为参数,返回一个NodeList实例,包含所有匹配的子元素。 30.Element.getElementsByClassName(),Element.getElementsByClassName方法返回一个HTMLCollection实例,成员是当前元素节点的所有具有指定 class 的子元素节点。该方法与document.getElementsByClassName方法的用法类似,只是搜索范围不是整个文档,而是当前元素节点。 31.Element.getElementsByTagName(),Element.getElementsByTagName方法返回一个HTMLCollection实例,成员是当前节点的所有匹配指定标签名的子元素节点。 23.Element.closest() ,Element.closest方法接受一个 CSS 选择器作为参数,返回匹配该选择器的、最接近当前节点的一个祖先节点(包括当前节点本身)。如果没有任何节点匹配 CSS 选择器,则返回null。 24.Element.matches(),Element.matches方法返回一个布尔值,表示当前元素是否匹配给定的 CSS 选择器。 25.事件相关方法,以下三个方法与Element节点的事件相关。这些方法都继承自EventTarget接口, - Element.addEventListener():添加事件的回调函数 - Element.removeEventListener():移除事件监听函数 - Element.dispatchEvent():触发事件 26.Element.scrollIntoView(),Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域,类似于设置window.location.hash的效果。 27.Element.getBoundingClientRect(),Element.getBoundingClientRect方法返回一个对象,提供当前元素节点的大小、位置等信息,基本上就是 CSS 盒状模型的所有信息。 - x:元素左上角相对于视口的横坐标 - y:元素左上角相对于视口的纵坐标 - height:元素高度 - width:元素宽度 - left:元素左上角相对于视口的横坐标,与x属性相等 - right:元素右边界相对于视口的横坐标(等于x + width) - top:元素顶部相对于视口的纵坐标,与y属性相等 - bottom:元素底部相对于视口的纵坐标(等于y + height) 28.Element.getClientRects(),Element.getClientRects方法返回一个类似数组的对象,里面是当前元素在页面上形成的所有矩形(所以方法名中的Rect用的是复数)。 29.Element.insertAdjacentElement(),Element.insertAdjacentElement方法在相对于当前元素的指定位置,插入一个新的节点。该方法返回被插入的节点,如果插入失败,返回null。 30.Element.insertAdjacentHTML(),Element.insertAdjacentText() 31.Element.remove(),Element.remove方法继承自 ChildNode 接口,用于将当前元素节点从它的父节点移除。 32.Element.focus(),Element.blur(),Element.focus方法用于将当前页面的焦点,转移到指定元素上。 33.Element.click(),Element.click方法用于在当前元素上模拟一次鼠标点击,相当于触发了click事件。 // 属性的操作 Element.attributes 属性 元素的标准属性 属性操作的标准方法 概述 Element.getAttribute() Element.getAttributeNames() Element.setAttribute() Element.hasAttribute() Element.hasAttributes() Element.removeAttribute() dataset 属性 // Text 节点和 DocumentFragment 节点 Text 节点的属性 data wholeText length nextElementSibling,previousElementSibling Text 节点的方法 appendData(),deleteData(),insertData(),replaceData(),subStringData() remove() splitText() DocumentFragment 节点 // CSS 操作 HTML 元素的 style 属性 CSSStyleDeclaration 接口 简介 CSSStyleDeclaration 实例属性 CSSStyleDeclaration 实例方法 CSS 模块的侦测 CSS 对象 CSS.escape() CSS.supports() window.getComputedStyle() CSS 伪元素 StyleSheet 接口 概述 实例属性 实例方法 实例:添加样式表 CSSRuleList 接口 CSSRule 接口 概述 CSSRule 实例的属性 CSSStyleRule 接口 CSSMediaRule 接口 window.matchMedia() 基本用法 MediaQueryList 接口的实例属性 MediaQueryList 接口的实例方法 // Mutation Observer API MutationObserver 构造函数 MutationObserver 的实例方法 observe() disconnect(),takeRecords() MutationRecord 对象 应用示例 子元素的变动 属性的变动 取代 DOMContentLoaded 事件 // EventTarget 接口 1.DOM 的事件操作(监听和触发),都定义在EventTarget接口。 - addEventListener:绑定事件的监听函数 - removeEventListener:移除事件的监听函数 - dispatchEvent:触发事件 2.EventTarget.addEventListener() - EventTarget.addEventListener()用于在当前节点或对象上,定义一个特定事件的监听函数。一旦这个事件发生,就会执行监听函数。该方法没有返回值。 3.EventTarget.removeEventListener() - EventTarget.removeEventListener方法用来移除addEventListener方法添加的事件监听函数。该方法没有返回值。 4.EventTarget.dispatchEvent() -EventTarget.dispatchEvent方法在当前节点上触发指定事件,从而触发监听函数的执行。该方法返回一个布尔值,只要有一个监听函数调用了Event.preventDefault(),则返回值为false,否则为true。 // 事件模型 1.监听函数 浏览器的事件模型,就是通过监听函数(listener)对事件做出反应。事件发生后,浏览器监听到了这个事件,就会执行对应的监听函数。这是事件驱动编程模式(event-driven)的主要编程方式。 - HTML 的 on- 属性,HTML 语言允许在元素的属性中,直接定义某些事件的监听代码。 - 元素节点的事件属性,元素节点对象的事件属性,同样可以指定监听函数。 - EventTarget.addEventListener(),所有 DOM 节点实例都有addEventListener方法,用来为该节点定义事件的监听函数。 2.this 的指向,监听函数内部的this指向触发事件的那个元素节点。 3.事件的传播,一个事件发生后,会在子元素和父元素之间传播(propagation)。这种传播分成三个阶段。 - 第一阶段:从window对象传导到目标节点(上层传到底层),称为“捕获阶段”(capture phase)。 - 第二阶段:在目标节点上触发,称为“目标阶段”(target phase)。 - 第三阶段:从目标节点传导回window对象(从底层传回上层),称为“冒泡阶段”(bubbling phase)。 4.事件处理,由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation)。 // Event 对象 1.Event,事件发生以后,会产生一个事件对象,作为参数传给监听函数。浏览器原生提供一个Event对象,所有的事件都是这个对象的实例,或者说继承了Event.prototype对象。 2.实例属性 - Event.bubbles属性返回一个布尔值,表示当前事件是否会冒泡。该属性为只读属性,一般用来了解 Event 实例是否可以冒泡。前面说过,除非显式声明,Event构造函数生成的事件,默认是不冒泡的。 - Event.eventPhase属性返回一个整数常量,表示事件目前所处的阶段。该属性只读。 Event.eventPhase的返回值有四种可能。 0,事件目前没有发生。 1,事件目前处于捕获阶段,即处于从祖先节点向目标节点的传播过程中。 2,事件到达目标节点,即Event.target属性指向的那个节点。 3,事件处于冒泡阶段,即处于从目标节点向祖先节点的反向传播过程中。 - Event.cancelable属性返回一个布尔值,表示事件是否可以取消。该属性为只读属性,一般用来了解 Event 实例的特性。 - Event.cancelBubble属性是一个布尔值,如果设为true,相当于执行Event.stopPropagation(),可以阻止事件的传播。 - Event.defaultPrevented属性返回一个布尔值,表示该事件是否调用过Event.preventDefault方法。该属性只读。 - Event.currentTarget属性返回事件当前所在的节点,即事件当前正在通过的节点,也就是当前正在执行的监听函数所在的那个节点。随着事件的传播,这个属性的值会变。 - Event.target属性返回原始触发事件的那个节点,即事件最初发生的节点。这个属性不会随着事件的传播而改变。 - Event.type属性返回一个字符串,表示事件类型。事件的类型是在生成事件的时候指定的。该属性只读。 - Event.timeStamp属性返回一个毫秒时间戳,表示事件发生的时间。它是相对于网页加载成功开始计算的。 - Event.isTrusted属性返回一个布尔值,表示该事件是否由真实的用户行为产生。 - Event.detail属性只有浏览器的 UI (用户界面)事件才具有。该属性返回一个数值,表示事件的某种信息。具体含义与事件类型相关。 3.实例方法 - Event.preventDefault方法取消浏览器对当前事件的默认行为。 - Event.stopPropagation(),stopPropagation方法阻止事件在 DOM 中继续传播,防止再触发定义在别的节点上的监听函数,但是不包括在当前节点上其他的事件监听函数。 - Event.stopImmediatePropagation(),Event.stopImmediatePropagation方法阻止同一个事件的其他监听函数被调用,不管监听函数定义在当前节点还是其他节点。 - Event.composedPath(),Event.composedPath()返回一个数组,成员是事件的最底层节点和依次冒泡经过的所有上层节点。 // 鼠标事件 1.鼠标事件的种类 - click:按下鼠标(通常是按下主按钮)时触发。 - dblclick:在同一个元素上双击鼠标时触发。 - mousedown:按下鼠标键时触发。 - mouseup:释放按下的鼠标键时触发。 - mousemove:当鼠标在一个节点内部移动时触发。当鼠标持续移动时,该事件会连续触发。为了避免性能问题,建议对该事件的监听函数做一些限定,比如限定一段时间内只能运行一次。 - mouseenter:鼠标进入一个节点时触发,进入子节点不会触发这个事件(详见后文)。 - mouseover:鼠标进入一个节点时触发,进入子节点会再一次触发这个事件(详见后文)。 - mouseout:鼠标离开一个节点时触发,离开父节点也会触发这个事件(详见后文)。 - mouseleave:鼠标离开一个节点时触发,离开父节点不会触发这个事件(详见后文)。 - contextmenu:按下鼠标右键时(上下文菜单出现前)触发,或者按下“上下文菜单键”时触发。 - wheel:滚动鼠标的滚轮时触发,该事件继承的是WheelEvent接口。 2.MouseEvent 接口概述,MouseEvent接口代表了鼠标相关的事件,单击(click)、双击(dblclick)、松开鼠标键(mouseup)、按下鼠标键(mousedown)等动作,所产生的事件对象都是MouseEvent实例。此外,滚轮事件和拖拉事件也是MouseEvent实例。该对象可以配置以下属性,所有属性都是可选的。 - screenX:数值,鼠标相对于屏幕的水平位置(单位像素),默认值为0,设置该属性不会移动鼠标。 - screenY:数值,鼠标相对于屏幕的垂直位置(单位像素),其他与screenX相同。 - clientX:数值,鼠标相对于程序窗口的水平位置(单位像素),默认值为0,设置该属性不会移动鼠标。 - clientY:数值,鼠标相对于程序窗口的垂直位置(单位像素),其他与clientX相同。 - ctrlKey:布尔值,是否同时按下了 Ctrl 键,默认值为false。 - shiftKey:布尔值,是否同时按下了 Shift 键,默认值为false。 - altKey:布尔值,是否同时按下 Alt 键,默认值为false。 - metaKey:布尔值,是否同时按下 Meta 键,默认值为false。 - button:数值,表示按下了哪一个鼠标按键,默认值为0,表示按下主键(通常是鼠标的左键)或者当前事件没有定义这个属性;1表示按下辅助键(通常是鼠标的中间键),2表示按下次要键(通常是鼠标的右键)。 - buttons:数值,表示按下了鼠标的哪些键,是一个三个比特位的二进制值,默认为0(没有按下任何键)。1(二进制001)表示按下主键(通常是左键),2(二进制010)表示按下次要键(通常是右键),4(二进制100)表示按下辅助键(通常是中间键)。因此,如果返回3(二进制011)就表示同时按下了左键和右键。 - relatedTarget:节点对象,表示事件的相关节点,默认为null。mouseenter和mouseover事件时,表示鼠标刚刚离开的那个元素节点;mouseout和mouseleave事件时,表示鼠标正在进入的那个元素节点。 3.MouseEvent 接口的实例属性 MouseEvent.altKey、MouseEvent.ctrlKey、MouseEvent.metaKey、MouseEvent.shiftKey这四个属性都返回一个布尔值,表示事件发生时,是否按下对应的键。它们都是只读属性。 - altKey属性:Alt 键 - ctrlKey属性:Ctrl 键 - metaKey属性:Meta 键(Mac 键盘是一个四瓣的小花,Windows 键盘是 Windows 键) - shiftKey属性:Shift 键
MouseEvent.button属性返回一个数值,表示事件发生时按下了鼠标的哪个键。该属性只读。 - 0:按下主键(通常是左键),或者该事件没有初始化这个属性(比如mousemove事件)。 - 1:按下辅助键(通常是中键或者滚轮键)。 - 2:按下次键(通常是右键)。
MouseEvent.buttons属性返回一个三个比特位的值,表示同时按下了哪些键。它用来处理同时按下多个鼠标键的情况。该属性只读。 - 1:二进制为001(十进制的1),表示按下左键。 - 2:二进制为010(十进制的2),表示按下右键。 - 4:二进制为100(十进制的4),表示按下中键或滚轮键。
MouseEvent.clientX属性返回鼠标位置相对于浏览器窗口左上角的水平坐标(单位像素),MouseEvent.clientY属性返回垂直坐标。这两个属性都是只读属性。
MouseEvent.movementX属性返回当前位置与上一个mousemove事件之间的水平距离(单位像素)。 MouseEvent.movementY属性返回当前位置与上一个mousemove事件之间的垂直距离(单位像素)。
MouseEvent.screenX属性返回鼠标位置相对于屏幕左上角的水平坐标(单位像素),MouseEvent.screenY属性返回垂直坐标。这两个属性都是只读属性。
MouseEvent.offsetX属性返回鼠标位置与目标节点左侧的padding边缘的水平距离(单位像素),MouseEvent.offsetY属性返回与目标节点上方的padding边缘的垂直距离。这两个属性都是只读属性。
MouseEvent.pageX属性返回鼠标位置与文档左侧边缘的距离(单位像素),MouseEvent.pageY属性返回与文档上侧边缘的距离(单位像素)。它们的返回值都包括文档不可见的部分。这两个属性都是只读。
MouseEvent.relatedTarget属性返回事件的相关节点。对于那些没有相关节点的事件,该属性返回null。该属性只读。
事件名称 target 属性 relatedTarget 属性 focusin 接受焦点的节点 丧失焦点的节点 focusout 丧失焦点的节点 接受焦点的节点 mouseenter 将要进入的节点 将要离开的节点 mouseleave 将要离开的节点 将要进入的节点 mouseout 将要离开的节点 将要进入的节点 mouseover 将要进入的节点 将要离开的节点 dragenter 将要进入的节点 将要离开的节点 dragexit 将要离开的节点 将要进入的节点
4.MouseEvent 接口的实例方法 - MouseEvent.getModifierState方法返回一个布尔值,表示有没有按下特定的功能键。
5.WheelEvent 接口,WheelEvent 接口继承了 MouseEvent 实例,代表鼠标滚轮事件的实例对象。该对象的属性除了Event、UIEvent的配置属性以外,还可以接受以下几个属性,所有属性都是可选的。 - deltaX:数值,表示滚轮的水平滚动量,默认值是 0.0。 - deltaY:数值,表示滚轮的垂直滚动量,默认值是 0.0。 - deltaZ:数值,表示滚轮的 Z 轴滚动量,默认值是 0.0。 - deltaMode:数值,表示相关的滚动事件的单位,适用于上面三个属性。0表示滚动单位为像素,1表示单位为行,2表示单位为页,默认为0。
6.WheelEvent事件实例除了具有Event和MouseEvent的实例属性和实例方法,还有一些自己的实例属性,但是没有自己的实例方法。 下面的属性都是只读属性。 - WheelEvent.deltaX:数值,表示滚轮的水平滚动量。 - WheelEvent.deltaY:数值,表示滚轮的垂直滚动量。 - WheelEvent.deltaZ:数值,表示滚轮的 Z 轴滚动量。 - WheelEvent.deltaMode:数值,表示上面三个属性的单位,0是像素,1是行,2是页。
// 键盘事件 1.键盘事件的种类 - keydown:按下键盘时触发。 - keypress:按下有值的键时触发,即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件。 - keyup:松开键盘时触发该事件。 如果用户一直按键不松开,就会连续触发键盘事件,触发的顺序如下。 keydown keypress keydown keypress ...(重复以上过程) keyup
2.KeyboardEvent 接口概述,KeyboardEvent接口用来描述用户与键盘的互动。这个接口继承了Event接口,并且定义了自己的实例属性和实例方法。KeyboardEvent构造函数接受两个参数。第一个参数是字符串,表示事件类型;第二个参数是一个事件配置对象,该参数可选。除了Event接口提供的属性,还可以配置以下字段,它们都是可选。 - key:字符串,当前按下的键,默认为空字符串。 - code:字符串,表示当前按下的键的字符串形式,默认为空字符串。 - location:整数,当前按下的键的位置,默认为0。 - ctrlKey:布尔值,是否按下 Ctrl 键,默认为false。 - shiftKey:布尔值,是否按下 Shift 键,默认为false。 - altKey:布尔值,是否按下 Alt 键,默认为false。 - metaKey:布尔值,是否按下 Meta 键,默认为false。 - repeat:布尔值,是否重复按键,默认为false。
3.KeyboardEvent 的实例属性 - KeyboardEvent.altKey:是否按下 Alt 键 - KeyboardEvent.ctrlKey:是否按下 Ctrl 键 - KeyboardEvent.metaKey:是否按下 meta 键(Mac 系统是一个四瓣的小花,Windows 系统是 windows 键) - KeyboardEvent.shiftKey:是否按下 Shift 键 - KeyboardEvent.code属性返回一个字符串,表示当前按下的键的字符串形式。该属性只读。 下面是一些常用键的字符串形式,其他键请查文档。 数字键0 - 9:返回digital0 - digital9 字母键A - z:返回KeyA - KeyZ 功能键F1 - F12:返回 F1 - F12 方向键:返回ArrowDown、ArrowUp、ArrowLeft、ArrowRight Alt 键:返回AltLeft或AltRight Shift 键:返回ShiftLeft或ShiftRight Ctrl 键:返回ControlLeft或ControlRight - KeyboardEvent.key属性返回一个字符串,表示按下的键名。该属性只读。 - KeyboardEvent.location属性返回一个整数,表示按下的键处在键盘的哪一个区域。它可能取以下值。 0:处在键盘的主区域,或者无法判断处于哪一个区域。 1:处在键盘的左侧,只适用那些有两个位置的键(比如 Ctrl 和 Shift 键)。 2:处在键盘的右侧,只适用那些有两个位置的键(比如 Ctrl 和 Shift 键)。 3:处在数字小键盘。 - KeyboardEvent.repeat返回一个布尔值,代表该键是否被按着不放,以便判断是否重复这个键,即浏览器会持续触发keydown和keypress事件,直到用户松开手为止。 - KeyboardEvent.getModifierState()方法返回一个布尔值,表示是否按下或激活指定的功能键。它的常用参数如下。 Alt:Alt 键 CapsLock:大写锁定键 Control:Ctrl 键 Meta:Meta 键 NumLock:数字键盘开关键 Shift:Shift 键
// 进度事件 1.进度事件的种类,进度事件用来描述资源加载的进度,主要由 AJAX 请求、<img>、<audio>、<video>、<style>、<link>等外部资源的加载触发,继承了ProgressEvent接口。它主要包含以下几种事件。 - abort:外部资源中止加载时(比如用户取消)触发。如果发生错误导致中止,不会触发该事件。 - error:由于错误导致外部资源无法加载时触发。 - load:外部资源加载成功时触发。 - loadstart:外部资源开始加载时触发。 - loadend:外部资源停止加载时触发,发生顺序排在error、abort、load等事件的后面。 - progress:外部资源加载过程中不断触发。 - timeout:加载超时时触发。 注意,除了资源下载,文件上传也存在这些事件。
2.ProgressEvent 接口,ProgressEvent接口主要用来描述外部资源加载的进度,比如 AJAX 加载、<img>、<video>、<style>、<link>等外部资源加载。进度相关的事件都继承了这个接口。
// 表单事件 1.表单事件的种类 - input事件当<input>、<select>、<textarea>的值发生变化时触发。上面代码中,改变下拉框选项时,会触发input事件,从而执行回调函数inputHandler。 - select事件当在<input>、<textarea>里面选中文本时触发。选中的文本可以通过event.target元素的selectionDirection、selectionEnd、selectionStart和value属性拿到。 - change事件当<input>、<select>、<textarea>的值发生变化时触发。它与input事件的最大不同,就是不会连续触发,只有当全部修改完成时才会触发,另一方面input事件必然伴随change事件。具体来说,分成以下几种情况。 激活单选框(radio)或复选框(checkbox)时触发。 用户提交时触发。比如,从下列列表(select)完成选择,在日期或文件输入框完成选择。 当文本框或<textarea>元素的值发生改变,并且丧失焦点时触发。
- invalid 事件,用户提交表单时,如果表单元素的值不满足校验条件,就会触发invalid事件。 - reset事件当表单重置(所有表单成员变回默认值)时触发。 - submit事件当表单数据向服务器提交时触发。
2.InputEvent 接口 - InputEvent接口主要用来描述input事件的实例。该接口继承了Event接口,还定义了一些自己的实例属性和实例方法。 - InputEvent.data属性返回一个字符串,表示变动的内容。 - InputEvent.inputType属性返回一个字符串,表示字符串发生变更的类型。 - InputEvent.dataTransfer属性返回一个 DataTransfer 实例。该属性只在文本框接受粘贴内容(insertFromPaste)或拖拽内容(insertFromDrop)时才有效。
// 触摸事件 1.浏览器的触摸 API 由三个部分组成。 - Touch:一个触摸点 - TouchList:多个触摸点的集合 - TouchEvent:触摸引发的事件实例 2.Touch 接口,Touch构造函数接受一个配置对象作为参数,它有以下属性。 - identifier:必需,类型为整数,表示触摸点的唯一 ID。 - target:必需,类型为元素节点,表示触摸点开始时所在的网页元素。 - clientX:可选,类型为数值,表示触摸点相对于浏览器窗口左上角的水平距离,默认为0。 - clientY:可选,类型为数值,表示触摸点相对于浏览器窗口左上角的垂直距离,默认为0。 - screenX:可选,类型为数值,表示触摸点相对于屏幕左上角的水平距离,默认为0。 - screenY:可选,类型为数值,表示触摸点相对于屏幕左上角的垂直距离,默认为0。 - pageX:可选,类型为数值,表示触摸点相对于网页左上角的水平位置(即包括页面的滚动距离),默认为0。 - pageY:可选,类型为数值,表示触摸点相对于网页左上角的垂直位置(即包括页面的滚动距离),默认为0。 - radiusX:可选,类型为数值,表示触摸点周围受到影响的椭圆范围的 X 轴半径,默认为0。 - radiusY:可选:类型为数值,表示触摸点周围受到影响的椭圆范围的 Y 轴半径,默认为0。 - rotationAngle:可选,类型为数值,表示触摸区域的椭圆的旋转角度,单位为度数,在0到90度之间,默认值为0。 - force:可选,类型为数值,范围在0到1之间,表示触摸压力。0代表没有压力,1代表硬件所能识别的最大压力,默认为0。 3.Touch 接口的实例属性 - Touch.identifier属性返回一个整数,表示触摸点的唯一 ID。这个值在整个触摸过程保持不变,直到触摸事件结束。 - Touch.screenX属性和Touch.screenY属性,分别表示触摸点相对于屏幕左上角的横坐标和纵坐标,与页面是否滚动无关。 - Touch.clientX属性和Touch.clientY属性,分别表示触摸点相对于浏览器视口左上角的横坐标和纵坐标,与页面是否滚动无关。 - Touch.pageX属性和Touch.pageY属性,分别表示触摸点相对于当前页面左上角的横坐标和纵坐标,包含了页面滚动带来的位移。 - Touch.radiusX属性和Touch.radiusY属性,分别返回触摸点周围受到影响的椭圆范围的 X 轴半径和 Y 轴半径,单位为像素。乘以 2 就可以得到触摸范围的宽度和高度。 - Touch.rotationAngle属性表示触摸区域的椭圆的旋转角度,单位为度数,在0到90度之间。 - Touch.force属性返回一个0到1之间的数值,表示触摸压力。0代表没有压力,1代表硬件所能识别的最大压力。 - Touch.target属性返回一个元素节点,代表触摸发生时所在的那个元素节点。即使触摸点已经离开了这个节点,该属性依然不变。 4.TouchList 接口 TouchList接口表示一族的解除点的集合。它的实例是一个类似数组的对象,成员是Touch的实例对象,表示所有触摸点。用户用三根手指触摸,产生的TouchList实例就会包含三个成员,每根手指的接触点对应一个Touch实例对象。
它的实例属性和实例方法只有两个。 TouchList.length:数值,表示成员数量(即触摸点的数量)。 TouchList.item():返回指定位置的成员,它的参数是该成员的位置编号(从零开始)
5.TouchEvent接口继承了 Event 接口,表示由触摸引发的事件实例,通常来自触摸屏或轨迹板。除了被继承的属性以外,它还有一些自己的属性。除了Event接口的配置属性,该接口还有一些自己的配置属性。 - touches:TouchList实例,代表所有的当前处于活跃状态的触摸点,默认值是一个空数组[]。 - targetTouches:TouchList实例,代表所有处在触摸的目标元素节点内部、且仍然处于活动状态的触摸点,默认值是一个空数组[]。 - changedTouches:TouchList实例,代表本次触摸事件的相关触摸点,默认值是一个空数组[]。 - ctrlKey:布尔值,表示 Ctrl 键是否同时按下,默认值为false。 - shiftKey:布尔值,表示 Shift 键是否同时按下,默认值为false。 - altKey:布尔值,表示 Alt 键是否同时按下,默认值为false。 - metaKey:布尔值,表示 Meta 键(或 Windows 键)是否同时按下,默认值为false。 实例属性: - TouchEvent.altKey:布尔值,表示触摸时是否按下了 Alt 键。 - TouchEvent.ctrlKey:布尔值,表示触摸时是否按下了 Ctrl 键。 - TouchEvent.shiftKey:布尔值:表示触摸时是否按下了 Shift 键。 - TouchEvent.metaKey:布尔值,表示触摸时是否按下了 Meta 键(或 Windows 键)。 - TouchEvent.changedTouches属性返回一个TouchList实例,成员是一组Touch实例对象,表示本次触摸事件的相关触摸点。对于不同的时间,该属性的含义有所不同。 touchstart事件:被激活的触摸点 touchmove事件:发生变化的触摸点 touchend事件:消失的触摸点(即不再被触碰的点) - TouchEvent.touches属性返回一个TouchList实例,成员是所有仍然处于活动状态(即触摸中)的触摸点。一般来说,一个手指就是一个触摸点。 - TouchEvent.targetTouches属性返回一个TouchList实例,成员是触摸事件的目标元素节点内部、所有仍然处于活动状态(即触摸中)的触摸点。
6.触摸事件的种类,可以通过TouchEvent.type属性,查看到底发生的是哪一种事件。 - touchstart:用户开始触摸时触发,它的target属性返回发生触摸的元素节点。 - touchend:用户不再接触触摸屏时(或者移出屏幕边缘时)触发,它的target属性与touchstart事件一致的,就是开始触摸时所在的元素节点。它的changedTouches属性返回一个TouchList实例,包含所有不再触摸的触摸点(即Touch实例对象)。 - touchmove:用户移动触摸点时触发,它的target属性与touchstart事件一致。如果触摸的半径、角度、力度发生变化,也会触发该事件。 - touchcancel:触摸点取消时触发,比如在触摸区域跳出一个模态窗口(modal window)、触摸点离开了文档区域(进入浏览器菜单栏)、用户的触摸点太多,超过了支持的上限(自动取消早先的触摸点)。
// 拖拉事件 1.拖拉事件的种类,draggable属性可用于任何元素节点,但是图片(<img>)和链接(<a>)不加这个属性,就可以拖拉。 当元素节点或选中的文本被拖拉时,就会持续触发拖拉事件,包括以下一些事件。 - drag:拖拉过程中,在被拖拉的节点上持续触发(相隔几百毫秒)。 - dragstart:用户开始拖拉时,在被拖拉的节点上触发,该事件的target属性是被拖拉的节点。通常应该在这个事件的监听函数中,指定拖拉的数据。 - dragend:拖拉结束时(释放鼠标键或按下 ESC 键)在被拖拉的节点上触发,该事件的target属性是被拖拉的节点。它与dragstart事件,在同一个节点上触发。不管拖拉是否跨窗口,或者中途被取消,dragend事件总是会触发的。 - dragenter:拖拉进入当前节点时,在当前节点上触发一次,该事件的target属性是当前节点。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop)拖拉的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,就意味着不允许在当前节点放下数据。在视觉上显示拖拉进入当前节点,也是在这个事件的监听函数中设置。 - dragover:拖拉到当前节点上方时,在当前节点上持续触发(相隔几百毫秒),该事件的target属性是当前节点。该事件与dragenter事件的区别是,dragenter事件在进入该节点时触发,然后只要没有离开这个节点,dragover事件会持续触发。 - dragleave:拖拉操作离开当前节点范围时,在当前节点上触发,该事件的target属性是当前节点。如果要在视觉上显示拖拉离开操作当前节点,就在这个事件的监听函数中设置。 - drop:被拖拉的节点或选中的文本,释放到目标节点时,在目标节点上触发。注意,如果当前节点不允许drop,即使在该节点上方松开鼠标键,也不会触发该事件。如果用户按下 ESC 键,取消这个操作,也不会触发该事件。该事件的监听函数负责取出拖拉数据,并进行相关处理。
2.DragEvent 接口 - 拖拉事件都继承了DragEvent接口,这个接口又继承了MouseEvent接口和Event接口。浏览器原生提供一个DragEvent()构造函数,用来生成拖拉事件的实例对象。
3.DataTransfer 接口概述 - 所有拖拉事件的实例都有一个DragEvent.dataTransfer属性,用来读写需要传递的数据。这个属性的值是一个DataTransfer接口的实例。
4.DataTransfer 的实例属性 - DataTransfer.dropEffect属性用来设置放下(drop)被拖拉节点时的效果,会影响到拖拉经过相关区域时鼠标的形状。它可能取下面的值。 copy:复制被拖拉的节点 move:移动被拖拉的节点 link:创建指向被拖拉的节点的链接 none:无法放下被拖拉的节点
- DataTransfer.effectAllowed属性设置本次拖拉中允许的效果。它可能取下面的值。 copy:复制被拖拉的节点 move:移动被拖拉的节点 link:创建指向被拖拉节点的链接 copyLink:允许copy或link copyMove:允许copy或move linkMove:允许link或move all:允许所有效果 none:无法放下被拖拉的节点 uninitialized:默认值,等同于all
- DataTransfer.files属性是一个 FileList 对象,包含一组本地文件,可以用来在拖拉操作中传送。如果本次拖拉不涉及文件,则该属性为空的 FileList 对象。
- DataTransfer.types属性是一个只读的数组,每个成员是一个字符串,里面是拖拉的数据格式(通常是 MIME 值)。
- DataTransfer.items属性返回一个类似数组的只读对象(DataTransferItemList 实例),每个成员就是本次拖拉的一个对象(DataTransferItem 实例)。如果本次拖拉不包含对象,则返回一个空对象。 DataTransferItemList 实例具有以下的属性和方法。 - length:返回成员的数量 - add(data, type):增加一个指定内容和类型(比如text/html和text/plain)的字符串作为成员 - add(file):add方法的另一种用法,增加一个文件作为成员 - remove(index):移除指定位置的成员 - clear():移除所有的成员
DataTransferItem 实例具有以下的属性和方法。 - kind:返回成员的种类(string还是file)。 - type:返回成员的类型(通常是 MIME 值)。 - getAsFile():如果被拖拉是文件,返回该文件,否则返回null。 - getAsString(callback):如果被拖拉的是字符串,将该字符传入指定的回调函数处理。该方法是异步的,所以需要传入回调函数。
5.DataTransfer 的实例方法 - DataTransfer.setData()方法用来设置拖拉事件所带有的数据。该方法没有返回值。 - DataTransfer.getData()方法接受一个字符串(表示数据类型)作为参数,返回事件所带的指定类型的数据(通常是用setData方法添加的数据)。如果指定类型的数据不存在,则返回空字符串。通常只有drop事件触发后,才能取出数据。 - DataTransfer.clearData()方法接受一个字符串(表示数据类型)作为参数,删除事件所带的指定类型的数据。如果没有指定类型,则删除所有数据。如果指定类型不存在,则调用该方法不会产生任何效果。 - DataTransfer.setDragImage()方法可以自定义这张图片。它接受三个参数。第一个是<img>节点或者<canvas>节点,如果省略或为null,则使用被拖动的节点的外观;第二个和第三个参数为鼠标相对于该图片左上角的横坐标和右坐标。
// 其他常见事件 资源事件 beforeunload 事件 unload 事件 load 事件,error 事件 session 历史事件 pageshow 事件,pagehide 事件 popstate 事件 hashchange 事件 网页状态事件 DOMContentLoaded 事件 readystatechange 事件 窗口事件 scroll 事件 resize 事件 fullscreenchange 事件,fullscreenerror 事件 剪贴板事件 焦点事件 CustomEvent 接口
// GlobalEventHandlers 接口 1.GlobalEventHandlers.onabort,某个对象的abort事件(停止加载)发生时,就会调用onabort属性指定的回调函数。 2.GlobalEventHandlers.onerror,error事件发生时,就会调用onerror属性指定的回调函数。 - window.onerror的处理函数共接受五个参数,含义如下。 message:错误信息字符串 source:报错脚本的 URL lineno:报错的行号,是一个整数 colno:报错的列号,是一个整数 error: 错误对象 3.GlobalEventHandlers.onload、GlobalEventHandlers.onloadstart,元素完成加载时,会触发load事件,执行onload()。 4.GlobalEventHandlers.onfocus,GlobalEventHandlers.onblur,当前元素获得焦点时,会触发element.onfocus;失去焦点时,会触发element.onblur。 5.GlobalEventHandlers.onscroll,页面或元素滚动时,会触发scroll事件,导致执行onscroll()。 6.GlobalEventHandlers.oncontextmenu,GlobalEventHandlers.onshow,用户在页面上按下鼠标的右键,会触发contextmenu事件,导致执行oncontextmenu()。如果该属性执行后返回false,就等于禁止了右键菜单。document.oncontextmenu与window.oncontextmenu效果一样。 7.其他的事件属性 鼠标的事件属性。
onclick ondblclick onmousedown onmouseenter onmouseleave onmousemove onmouseout onmouseover onmouseup onwheel 键盘的事件属性。
onkeydown onkeypress onkeyup 焦点的事件属性。
onblur onfocus 表单的事件属性。
oninput onchange onsubmit onreset oninvalid onselect 触摸的事件属性。
ontouchcancel ontouchend ontouchmove ontouchstart 拖动的事件属性分成两类:一类与被拖动元素相关,另一类与接收被拖动元素的容器元素相关。
被拖动元素的事件属性。
ondragstart:拖动开始 ondrag:拖动过程中,每隔几百毫秒触发一次 ondragend:拖动结束 接收被拖动元素的容器元素的事件属性。
ondragenter:被拖动元素进入容器元素。 ondragleave:被拖动元素离开容器元素。 ondragover:被拖动元素在容器元素上方,每隔几百毫秒触发一次。 ondrop:松开鼠标后,被拖动元素放入容器元素。 <dialog>对话框元素的事件属性。
oncancel onclose
// 浏览器模型 window 对象 Navigator 对象,Screen 对象 Cookie XMLHttpRequest 对象 同源限制 CORS 通信 Storage 接口 History 对象 Location 对象,URL 对象,URLSearchParams 对象 ArrayBuffer 对象,Blob 对象 File 对象,FileList 对象,FileReader 对象 表单,FormData 对象 IndexedDB API Web Worker
// 网页元素接口 <a> <img> <form> <input> <button> <option> <video>,<audio> </body> </html>
|