Ajax Note Part I

by Yan Sheng

HTML

SGML: Standard Generalized Markup Language. 标记元语言(metalanguage). HTML: 基于SGML, 但SGML太过庞大, HTML仅采用了部分SGML标准. XML: Extensible Markup Language.

HTML 4.01 并不与XML兼容, 所以, W3C又提出XHMTML, 一个HTML的重写版本, 以使其能够与XML兼容. HTML/XML标准定义主要原则: 内容高于视觉表现. 你要以设计HTML和XHTML的方式使用它们, 表明文档的结构以便浏览器能够正确显示他们的内容.

调试工具

  • firebug.

    • console.log(); // 控制台输出信息
    • console.debug(); // 链接显示
    • console.info(); // 信息图标
    • console.warn(); // 警告
    • console.error(); // 错误
    • console.assert(); // 断言 表达式值true时不输出信息, 为false输出
    • console.dir(); // 直接将对象或html元素的详细信息输出到firebug
    • console.dirxml(); // xml
    • console.trace(); // 调用过程信息
    • console.group("AAA"); // 分组标识,
    • console.groupEnd(); // 分组结束
    • console.time("AAA"); // 计时某段代码执行时间
    • console.timeEnd("AAA"); // 停止计时
    • console.profile("AAA"); // 对所包含的代码段的性能测试数据
    • console.profileEnd("AAA");
    • console.count("FuncA"); // 统计其自身被执行的次数
    • 控制台命令:
  • alert

  • run

  • clear

  • copy

    • 其他浏览器下firebug使用firebuglite(www.getfirebug.com/firebuglite/lite.html), 下载其js, css, html, png等. firebug/firebug.js
    • window.console[names[i]] = function(){} // 屏蔽console对象中所有调试信息
  • Fidder(IE下类似firebug的工具).

  • Firefox 插件: web developer, Scrapbook, JsView

Javscript 基础

AJAX: Asynchronous JS and XML

数据类型

  • 数字, 不区分整数和其他, 都以浮点数来表示.

    • IEEE754 64位浮点格式;
    • Infinity(无穷大值);
    • -Infinity(无穷小值);
    • 非数字值, NaN, 与自己在内的任何值都不想等, isNaN()检测NaN;
    • isFinity()检测NaN, [-]Infinity;
    • Infinity, NaN, Number.NaN, Number.MAX_VALUE, Number.MIN_VALUE, Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY.
  • 字符串, unicode字符序列.

    • xXX: 2位十六进制的latin-1字符;
    • uXXXX: 4位...unicode字符;
  • 布尔值.

  • null(空), 没有值;

  • undefined(未定义), undefined == null 为true, undefined === null为false;

  • js中的 函数 是一个数据类型, 类.

    var person = new Object();
    person.name = "xxx";
    person.sex = 'F';
    
    var person = {name: "xxx", sex:'F'};
    person['name']; // 关联数组, 所谓也
    
  • js中的数组每个元素都有一个名字, 每个元素都有一个编号(下标), new Array(); [1,2,3]; new Array(8);

    function test(){
        a = "global";
    }
    // a是隐式声明, 全局性, 所以在函数体外也能访问.
    var b = "global";
    function test(){
        alert(b); // undefined
        var b = "local";
        alert(b); // local
    }
    test();
    // 因为函数体内有局部变量b的定义, 隐藏了全局变量.
    

基本类型: 简单数据类型 引用类型(引用): 符合数据类型(对象, 数组, 函数)

"==" & "==="

  • ==, 对于引用类型, 比较的是两个变量是否引用同一个.

    • 类型转换, 两个值的类型相同, 比较它们的值或引用是否完全相同;
    • 两个值的类型不同时,
    • null, undefined相等;
    • 数字字符串,先将字符串转换为数字,再比较;
    • 布尔值先转换位数字, true为1, false为0;
    • 对象比较时, 先将对象转换为简单数据类型, 再进行比较, 依次 valueOf(), toString(), 而Date则是先是toString();
  • ===, 不进行类型转换, null 与 undefined不等

语法

  • a in b:

    • 检查a 是否为b 的属性名;
    • 若b 是数组, 则检查a 是否为b的索引之一, 不是值;
    • for (a in b) {} 列出b的属性, for / in语句并不能列出对象所有的属性, 因为一些对象的属性被标记成只读, 永久的(不可删除)或不可列举的, 这些属性不能被列举出来.
  • a instanceof b:
    • 检查a是否为b的实例;
    • date instanceof Date; //true
  • break/continue:
    • break + label, 跳出label, 主要用于跳出外部循环;

    System Message: WARNING/2 (<string>, line 141)

    Bullet list ends without a blank line; unexpected unindent.

    outerloop:

    for (var i=1; i<=10; i++){
        innerloop:
        for (var j=1; j<=10; j++){
            if (j == 8) { break innerloop; }
            if (i*j == 24) { break outerloop; }
        }
    }
    
    • continue + label;
    • return, 不带返回值时, 这是函数的返回值为undefined.
  • throw 异常信息:

    • throw new Error("xx");
    • try{ } catch(varible){ } finally{ };
  • 函数:
    • function Name(arg){}
    • var Name = function(arg){}
    • var Name = new Function(arg, "函数体"), eg var add = new Function('x', 'y', 'return x+y');
    • 当某些函数只需要执行一次, 可以声明匿名函数并立即调用, eg,
    (function(a, b){
        return a+b;
    })(1, 2);
    
    • 实际参数可遇形参列表不一致, 实参都被存到函数的arguments属性中, arguments.length, arguments.callee(x, y); // callee为该当前函数的引用, 这就很容易实现递归了
    /**
     * 十/二进制转换
     */
    function recursion(x){
        if (typeof arguments[1] == "undefined"){
            var num = '';
        } else {
            var num = arguments[1];
        }
        var y = parseInt(x/2);
        num = x % 2 + num;
        if (y == 1){
            return '1' + num;
        } else {
            num = arguments.callee(y, num);
        }
        return num;
    }
    

Array

  • a.length = 5; // 长度可变

  • a.unshift(32); // 将一个新的元素添加到数组开头

  • a.push(1); // ...末尾

  • a.shift(); // 删除第一个元素

  • a.pop(); // 删除末尾一个元素

  • a.splice(a, [b]); // 删除从a到b(末尾)的元素

  • a.splice(a, b, extra); // 删除从a到b的元素后掺入extra

  • a.slice(a, b); // 切片

  • a.reverse(); // 反转数组

  • a.join('..'); // 以..链接数组成字符串

  • a.sort(); // 排序, 可自定义函数, 每次取2个元素, 类似于冒泡

    var a = [4, 1, 23, 3];
    a.sort(function(x, y){
        return y-x; // 若需要前一元素排在后裔元素后面, 则返回大于0的数, 反之. 位置不变, 返回0.
    });
    

String

  • "aaa".length;
  • "aaa".substring(a,b); // 从a到b截取, 不包含b
  • "aaa".replace(a, b); // 以b代替a, a可以为正则式
  • "aaa".toUpperCase(); // 大写
  • "aaa".toLowerCase(); // 小写
  • "aaa".split(''); // 将字符串转换成数组
  • ["aaa", "bbb"].join(''); // 拼接字符串

RegExp

  • RegExp("..."); new RegExp("\d+", 'gi');
  • /.../; /d+/gi;
  • i: 忽略大小写, g: 全局匹配, m: 多行匹配
  • reg.source: 获得正则式文本
  • reg.global: 是否开启全局匹配模式
  • reg.ignoreCase
  • reg.multiline
  • reg.lastIndex: 记录在全局匹配模式下, 在字符串中下一次开始匹配的位置
  • str.search(/.../); // 返回第一个与之匹配的字符串的开始位置, 如果没有任何子字符串与之匹配, 则返回-1
  • str.replace
  • str.match 返回的第一个元素是匹配的子字符串, 从第二个元素开始是分组所匹配的内容, 如果是全局匹配模式, 则返回的数组是字符串中所有匹配的子字符串;
  • 在非全局模式, index表所匹配的子字符串在原字符串中的位置; input保存了原字符的一个副本.
  • str.split(reg)
  • reg.test(str) // true/false
  • reg.exec(str) // 每次只匹配一个结果, lastIndex 当匹配结束时, lastIndex为0, 返回null

Date

  • new Date(数字) 日期的内部数字表示, 单位ms
  • new Date(字符串) 含日期的字符串
  • new Date(year, month, day, hours, minutes, secondes, ms);
  • d.getFullYear();
  • d.getMonth();
  • d.getDate();
  • d.getHours();
  • d.getMinutes();
  • d.getSeconds();
  • d.getMilliseconds();
  • d.getTime(); // 内部毫秒表示
  • d.getTimezoneOffset(); // 本地时间与UTC时间之差, 以分钟为单位
  • d.set同上

Math

  • Math.ceil(a); // 上舍
  • Math.floor(a); // 下舍
  • Math.random(); // 返回一个介于0~1的随机数
  • Math.pow(a, b); // a^b
  • Math.max(...); // 0个参数, 则返回-Infinity
  • Math.min(...); //...返回Infinity

全局对象

  • alert(...);
  • confirm(...); // true/false
  • prompt(...); // 输入的值/null
  • window.status // 状态栏
  • setTimeout,,,clearTimeout(id);
  • setInterval,,,clearInterval(id);
  • window.location,,,window.location.href
  • history.back();
  • history.forward();
  • history.go(n);
  • window.resizeTo(width, height); // 绝对
  • window.resizeBy(x, y); // 相对原来窗口大小, 像素为单位
  • window.moveTo(x, y); // 移动窗口到x, y坐标
  • window.moveBy(x, y); // 相对
  • var newwindow = window.open("窗口url", "窗口名字", "height=100, width=400, top=0, left=0, toolbar=no, menubar=no等特性", false); // 最后的false指定是否是已存在的窗口
  • 只有在open方法是用一个已经存在的窗口时才会生效, 其作用是声明由第一个参数指定的url是应该替换历史记录的当前项, 还是创建一个新项, 默认为后者.
  • focus/blur: 获得/失去焦点
  • screen.availWidth 实际可用的显示器大小
  • screen.availHeight
  • screen.colorDepth 可显示的颜色数, 以2为底的对数
  • navigator 属性保存客户端浏览器的总体信息
  • navigator.appName Web浏览器名称
  • navigator.appVersion 内部版本号
  • navigator.userAgent HTTP请求时, USER-AGENT头信息中的数据
  • navigator.appCodeName 浏览器的代码名
  • navigator.platform 运行浏览器的硬件平台

document对象

描述HTML文档的整体信息属性

  • document.write();
  • document.writeln();
  • document.title;
  • document.images; // 一数组, 保存了对当前HTML文档中所有图像的引用
  • document.getElementById("xxx").style.border...
  • document.links; // 一数组, 保存了文档中所有超链接的引用
  • document.forms; // 一数组, 保存当前文档中所有表单的引用

DOM: Document Object Module, 文档对象模型, 表示文档, 访问和操作文档元组的API. 树型结构

结点类型 nodeType
Element 1
Attr 2
Text 3
Comment 8
Document 9
DocumentFragment 11
  • Element.innerHTML

  • document.getElementsByName("xxx"); // 指定name的属性的结点集合

  • document.getElementsByTagName("xxx"); // 查找所有标签名为xxx的下属节点, 返回一数组

  • Node.parentNode.id // 当前节点的父节点

  • Node.childNodes

  • Node.firstChild

  • Node.lastChild

  • Node.previousSibling //节点的上一个兄弟节点的引用

  • Node.nextSibling //...下一个

  • document.createElement("标签名"); // 使用createElement创建元素结点后, 元素并没有被立即加入到当前的DOM树中, 而被存放到内存中. 只有使用添加结点的相关方法进行操作. 才真正将元素加入到DOM树中.

  • document.createTextNode("this is text"); // 创建文本结点后并没有立即被添加到DOM树中

  • node.appendChild(newNode); // 添加结点

  • parentNode.insertBefore(newNode, childNode); // 插入子结点

  • parentNode.replaceChild(newNode, childNode); // 替换子结点

  • newchone = node.cloneNode(true/false); // 复制结点, true和false表示是否包含原节点的子结点

  • parentNode.removeChild(childNode); // 删除子结点

    /**
     * 删除一个直属子结点
     */
    document.onclick = function(e){
        var evt = arguments[0] || event;
        var elm = evt.target || evt.srcElement;
        if (elm.type == "button" && elm.classname == "btn"){
            var li = elm.parentNode;
            li.parentNode.removeChild(li);
        }
    }
    
  • node.getAttribute(...); // 获得结点的某一属性的值, 或直接使用. 属性

  • node.setAttribute(attName, attValue);

  • node.removeAttribute(attName);

控制元素样式:

  • 设置class属性, setAttribute("class", "xxx");

  • element.className = "link";

  • node.style.css样式 = 值;

    • '-' 去掉, 第二个单词首字母大写
    • css属性名与js保留字冲突的话, 则单词前面加上style, 如styleFloat

事件处理

IE事件模型和标准时间模型的区别两点:

  • 事件对象的差异:

    • IE事件模型, window对象提供一个event属性保存当前事件对象, 所以, 可在程序中直接访问时间对象event;
    • 标准时间模型, 事件对象是在时间被触发时生成, 然后作为参数传递给时间处理程序, 所以在标准时间模型中, 事件是局部的.
  • 事件的传播机制:

    • 标准事件传播分为3个阶段:
    • 捕捉阶段(capturing), 时间从document对象沿着文档树向下往目标节点传播, 如果在传播过程中的任何一结点注册了处理该事件的事件处理程序, 则程序会被执行. 即在这个阶段目标节点的任何祖先结点都有机会来处理事件.
    • 发生在目标节点自身, 注册在目标节点上的合适的事件处理程序将被执行.
    • 起泡阶段, 事件将会沿着文档树从目标结点回传给document对象. 所有的事件都受捕捉机制的支配, 但并非所有的事件都起泡.
    • 事件分为两类: 输入事件和高级语义事件. 输入事件指用户操作产生的事件; 语义事件指由系统内部触发的事件. 所有语义事件不会起泡.
    • 在IE事件模型中, 只支持起泡形式的事件传播, 而不支持捕捉形式的事件传播.
  • 注册事件处理程序:

    • 当作属性: node.onclick = function(){}
    • 在标准事件模型中: obj.addEventListener(eventName, eventHandler, useCapture); // useCapture: bool, true表指定的事件处理程序将在事件传播的捕捉阶段用于捕捉事件; false表当事件直接发生的对象上, 或发生砸iduixiang的子结点并起泡到对象上的, 调用处理函数, 默认为false.
    • 注: 使用addEventListener可给目标的同一事件注册多个事件处理程序, 好处是使程序可模块化开发, 不用担心冲突.
    • IE事件模型中, 使用obj.attachEvent("on"+eventName, eventHandler);
    function addEvent(obj, name, handler, useCapture){
        if (window.event){
            obj.attachEvent("on"+name, handler);
        } else {
            obj.addEventListener(name, handler, useCapture);
        }
    }
    
  • 注销事件处理程序:

    • 将对象的响应属性设置为null来注销
    • detachEvent()/removeEventListener()
    function removeEvent(obj, name, handler, useCapture){
        if (window.event){
            obj.detachEvent("on"+name, handler);
        } else {
            obj.removeEventListener(name, handler, useCapture);
        }
    }
    
标准事件模型 IE事件模型  
target srcElement 发生事件的目标元素
type type 发生事件的类型
keyCode keyCode 声明了keydown, keyup事件的按键代码
clientX, clientY clientX, clientY 相对于窗口左上角的坐标
preventDefault() returnValue returnValue为false阻止浏览器执行与事件相关的默认动作
stopPropagation() cancelBubble cancelBubble为true阻止事件起泡
altKey,ctrlKey,shiftKey altKey,ctrlKey,shiftKey 布尔属性, 事件发生时, 是否按住了这些键
/**
 * 实例事件处理
 */
function mouseoverEventHandler(e){
    var evt = e || event;
    var elm = evt.target || evt.srcElement;
    if (elm.tagName.toLowerCase() == "td"){
        elm.style.border = "1px ...";
    }
}
Javascriptnote