+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/1.html" "b/20160309_\350\241\245\350\257\276/1.html"
new file mode 100644
index 0000000..b15b4de
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/1.html"
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/1.png" "b/20160309_\350\241\245\350\257\276/1.png"
new file mode 100644
index 0000000..be0eb7b
Binary files /dev/null and "b/20160309_\350\241\245\350\257\276/1.png" differ
diff --git "a/20160309_\350\241\245\350\257\276/2.html" "b/20160309_\350\241\245\350\257\276/2.html"
new file mode 100644
index 0000000..2f48d7b
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/2.html"
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/2.png" "b/20160309_\350\241\245\350\257\276/2.png"
new file mode 100644
index 0000000..bf57e28
Binary files /dev/null and "b/20160309_\350\241\245\350\257\276/2.png" differ
diff --git "a/20160309_\350\241\245\350\257\276/3.html" "b/20160309_\350\241\245\350\257\276/3.html"
new file mode 100644
index 0000000..3efc44a
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/3.html"
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/4.html" "b/20160309_\350\241\245\350\257\276/4.html"
new file mode 100644
index 0000000..f5054ef
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/4.html"
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/5.html" "b/20160309_\350\241\245\350\257\276/5.html"
new file mode 100644
index 0000000..163c1f1
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/5.html"
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/5.png" "b/20160309_\350\241\245\350\257\276/5.png"
new file mode 100644
index 0000000..726f4c1
Binary files /dev/null and "b/20160309_\350\241\245\350\257\276/5.png" differ
diff --git "a/20160309_\350\241\245\350\257\276/6.html" "b/20160309_\350\241\245\350\257\276/6.html"
new file mode 100644
index 0000000..1257c83
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/6.html"
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/7.html" "b/20160309_\350\241\245\350\257\276/7.html"
new file mode 100644
index 0000000..e4613cb
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/7.html"
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160309_\350\241\245\350\257\276/7.png" "b/20160309_\350\241\245\350\257\276/7.png"
new file mode 100644
index 0000000..e9585d3
Binary files /dev/null and "b/20160309_\350\241\245\350\257\276/7.png" differ
diff --git "a/20160309_\350\241\245\350\257\276/null\345\222\214undefined\347\232\204\345\214\272\345\210\253.txt" "b/20160309_\350\241\245\350\257\276/null\345\222\214undefined\347\232\204\345\214\272\345\210\253.txt"
new file mode 100644
index 0000000..d127b04
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/null\345\222\214undefined\347\232\204\345\214\272\345\210\253.txt"
@@ -0,0 +1,75 @@
+null:空对象指针->没有具体的值 ->一般都是我们手动设置初始的值为null,后期的话会给其赋值
+undefined:未定义->连东西都没有 ->一般都是浏览器默认的值
+耿大大的女朋友是null,耿大大的男朋友undefined
+
+null:
+1、我们设定一个变量,后期需要使用,那么前期我们设置默认值为null
+ var timer=null;
+ function move(){
+ window.clearTimeout(timer);
+
+ timer=window.setTimeout(move,1000);
+ }
+ move();
+
+2、在JS内存释放中,我们想释放一个堆内存,就让其值变为null即可
+ var obj={name:"珠峰培训"};
+ obj=null;->刚开始开辟的这个堆内存没有被占用,浏览器会在空闲的时候把它销毁掉
+
+3、我们通过DOM中提供的属性和方法获取页面中的某一个元素标签,如果当前这个标签不存在,获取的结果是null,而不是undefined
+ document.getElementById("div1") ->如果页面中没有#div1,获取的结果就是null
+
+4、在正则的exec/字符串的match捕获中,如果当前要捕获的字符串和正则不匹配的话,捕获到的结果为null
+ var reg=/\d+?/g;
+ var str="zhufengpeixun";
+ reg.exec(str) ->null
+ str.match(reg) ->null
+
+
+undefined:
+1、在JS预解释的时候,只声明未定义,默认的值是undefined
+ console.log(num); ->undefined
+ var num=13;
+
+2、在一个函数中,如果没有写return,或者return后啥都没返回,默认的返回值是undefined
+ function fn(){
+
+ }
+ var res=fn();
+ console.log(res);->undefined
+
+3、函数中设置了形参,但是执行的时候如果没有传递参数值,那么形参默认值是undefined
+ function fn(a,b,c){
+ a->10
+ b->20
+ c->undefined ->arguments[2]=30 : 让形参c的值变为30,因为在非严格模式下我们的arguments和形参存在映射关系,但是在严格模式("use strict")中是不存在映射关系,改变的话互不影响;
+ }
+ fn(10,20);
+
+4、获取一个对象的属性名对应的属性值,如果当前的这个属性名不存在的话,属性值默认是undefined
+ var obj={};
+ console.log(obj.name); ->undefined
+
+ ->我们也应用这个道理来检测当前的浏览器是否兼容某一个方法
+ window.getComputedStyle ->获取当前元素经过浏览器计算过的样式
+ 在谷歌中:我们获取的结果是 function getComputedStyle() { [native code] }
+ 在IE6~8中:我们获取的结果是undefined,因为在这个浏览器中不兼容getComputedStyle
+
+ function getCss(curEle,attr){
+ var val=null,reg=null;
+ if(window.getComputedStyle){
+ //->兼容
+ val=window.getComputedStyle(curEle,null)[attr];
+ }else{
+ //->不兼容
+ if(attr==="opacity"){
+ val=curEle.currentStyle["filter"]; ->'alpha(opacity=12.345)';
+ reg=/^alpha\(opacity=(\d+(?:\.\d+)?)\)$/;
+ val=reg.test(val)?reg.exec(val)[1]/100:1;
+ }else{
+ val=curEle.currentStyle[attr];
+ }
+ }
+ reg=/^-?\d+(\.\d+)?(px|pt|em|rem)?$/;
+ return reg.test(val)?parseFloat(val):val;
+ }
diff --git "a/20160309_\350\241\245\350\257\276/this.txt" "b/20160309_\350\241\245\350\257\276/this.txt"
new file mode 100644
index 0000000..01361d5
--- /dev/null
+++ "b/20160309_\350\241\245\350\257\276/this.txt"
@@ -0,0 +1,96 @@
+函数中的this指向和当前函数在哪定义的或者在哪执行的都没有任何的关系
+分析this指向的规律如下:
+
+[非严格模式]
+1、自执行函数中的this永远是window
+ [案例1]
+ var obj={
+ fn:(function(i){
+ //this->window
+ return function(){
+ //this->obj
+ }
+ })(0)
+ };
+ obj.fn();
+
+2、给元素的某个行为绑定一个方法,当行为触发的时候,执行绑定的方法,此时方法中的this是当前的元素
+ [案例1]
+ oDiv.onclick=function(){
+ //this->oDiv
+ };
+
+ [案例2]
+ function fn(){
+ //this->window
+ }
+ oDiv.onclick=function(){
+ //this->oDiv
+ fn();
+ };
+
+3、方法执行,看方法名前面是否有".",有的话,"."前面是谁this就是谁,没有的话this就是window
+ [案例1]
+ var obj={fn:fn};
+ function fn(){}
+ fn.prototype.aa=function(){};
+ var f=new fn;
+
+ fn();//this->window
+ obj.fn();//this->obj
+ fn.prototype.aa();//this->fn.prototype
+ f.aa();//this->f
+ f.__proto__.aa();//this->f.__proto__->fn.prototype
+
+
+4、在构造函数模式中,函数体中的this.xxx=xxx中的this是当前类的一个实例
+ [案例1]
+ function Fn(){
+ this.x=100; //this->f
+ this.getX=function(){
+ console.log(this);//this->f 因为getX方法执行的时候,"."前面是f,所以this是f
+ }
+ }
+ var f=new Fn;
+ f.getX();
+
+5、使用call/apply来改变this的指向(一但遇到call/apply上述的四条都没用了)
+
+
+[严格模式]
+"use strict";//->告诉浏览器我们接下来编写的JS代码采用严格模式
+
+1、自执行函数中的this永远是undefined
+ [案例1]
+ var obj={
+ fn:(function(i){
+ //this->undefined
+ return function(){
+ //this->obj
+ }
+ })(0)
+ };
+ obj.fn();
+
+3、方法执行,看方法名前面是否有".",有的话,"."前面是谁this就是谁,没有的话this就是undefined
+ [案例1]
+ var obj={fn:fn};
+ function fn(){}
+
+ fn();//this->undefined
+ obj.fn();//this->obj
+
+我们发现严格模式下的this相对于非严格模式下的this主要区别在于:对于JS代码中没有写执行主体的情况下,非严格模式下默认都是window执行的,所以this指向的是window;但是在严格的模式下,没有写就是没有执行主体,this指向的是undefined;
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/20160309_\350\241\245\350\257\276/\347\217\240\345\263\260\345\237\271\350\256\255\346\255\243\345\274\217\350\257\276\344\275\234\344\270\232[\347\254\254\344\270\200\345\221\250].doc" "b/20160309_\350\241\245\350\257\276/\347\217\240\345\263\260\345\237\271\350\256\255\346\255\243\345\274\217\350\257\276\344\275\234\344\270\232[\347\254\254\344\270\200\345\221\250].doc"
new file mode 100644
index 0000000..37a994a
Binary files /dev/null and "b/20160309_\350\241\245\350\257\276/\347\217\240\345\263\260\345\237\271\350\256\255\346\255\243\345\274\217\350\257\276\344\275\234\344\270\232[\347\254\254\344\270\200\345\221\250].doc" differ
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/10\343\200\201sort\346\267\261\345\205\245.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/10\343\200\201sort\346\267\261\345\205\245.html"
new file mode 100644
index 0000000..bd771e6
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/10\343\200\201sort\346\267\261\345\205\245.html"
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/11\343\200\201json.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/11\343\200\201json.html"
new file mode 100644
index 0000000..6b59ee4
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/11\343\200\201json.html"
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/1\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/1\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html"
new file mode 100644
index 0000000..8f8c72b
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/1\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html"
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2.png" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2.png"
new file mode 100644
index 0000000..26e1352
Binary files /dev/null and "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2.png" differ
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html"
new file mode 100644
index 0000000..d7fd12b
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/2\343\200\201\345\216\237\345\236\213\346\267\261\345\205\245.html"
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/3\343\200\201call\345\222\214apply.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/3\343\200\201call\345\222\214apply.html"
new file mode 100644
index 0000000..edd4bc2
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/3\343\200\201call\345\222\214apply.html"
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/4\343\200\201\351\235\242\350\257\225\351\242\230.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/4\343\200\201\351\235\242\350\257\225\351\242\230.html"
new file mode 100644
index 0000000..c730b56
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/4\343\200\201\351\235\242\350\257\225\351\242\230.html"
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/5\343\200\201call\345\222\214apply\347\232\204\345\214\272\345\210\253.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/5\343\200\201call\345\222\214apply\347\232\204\345\214\272\345\210\253.html"
new file mode 100644
index 0000000..3575a2e
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/5\343\200\201call\345\222\214apply\347\232\204\345\214\272\345\210\253.html"
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/6\343\200\201call\345\222\214apply\347\232\204\345\272\224\347\224\250.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/6\343\200\201call\345\222\214apply\347\232\204\345\272\224\347\224\250.html"
new file mode 100644
index 0000000..9d63765
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/6\343\200\201call\345\222\214apply\347\232\204\345\272\224\347\224\250.html"
@@ -0,0 +1,72 @@
+
+
+
+
+ 珠峰培训-数组的最大值和最小值
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/7\343\200\201\346\261\202\345\271\263\345\235\207\346\225\260.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/7\343\200\201\346\261\202\345\271\263\345\235\207\346\225\260.html"
new file mode 100644
index 0000000..c00d9ee
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/7\343\200\201\346\261\202\345\271\263\345\235\207\346\225\260.html"
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/8\343\200\201\345\260\206\347\261\273\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\346\225\260\347\273\204.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/8\343\200\201\345\260\206\347\261\273\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\346\225\260\347\273\204.html"
new file mode 100644
index 0000000..545a13f
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/8\343\200\201\345\260\206\347\261\273\346\225\260\347\273\204\350\275\254\346\215\242\344\270\272\346\225\260\347\273\204.html"
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/9\343\200\201\346\265\217\350\247\210\345\231\250\347\232\204\345\274\202\345\270\270\344\277\241\346\201\257\346\215\225\350\216\267.html" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/9\343\200\201\346\265\217\350\247\210\345\231\250\347\232\204\345\274\202\345\270\270\344\277\241\346\201\257\346\215\225\350\216\267.html"
new file mode 100644
index 0000000..99bff53
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/9\343\200\201\346\265\217\350\247\210\345\231\250\347\232\204\345\274\202\345\270\270\344\277\241\346\201\257\346\215\225\350\216\267.html"
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/js/utils.js" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/js/utils.js"
new file mode 100644
index 0000000..7086e15
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/js/utils.js"
@@ -0,0 +1,25 @@
+var utils = {
+ //->listToArray:ʵֽתΪ
+ listToArray: function (likeAry) {
+ var ary = [];
+ try {
+ ary = Array.prototype.slice.call(likeAry);
+ } catch (e) {
+ for (var i = 0; i < likeAry.length; i++) {
+ ary[ary.length] = likeAry[i];
+ }
+ }
+ return ary;
+ },
+ //->jsonParse:JSONʽַתΪJSONʽĶ
+ jsonParse: function (str) {
+ //var val = null;
+ //try {
+ // val = JSON.parse(str);
+ //} catch (e) {
+ // val = eval("(" + str + ")");
+ //}
+ //return val;
+ return "JSON" in window ? JSON.parse(str) : eval("(" + str + ")");
+ }
+};
\ No newline at end of file
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/this.txt" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/this.txt"
new file mode 100644
index 0000000..4eec7ee
--- /dev/null
+++ "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/this.txt"
@@ -0,0 +1,98 @@
+函数中的this指向和当前函数在哪定义的或者在哪执行的都没有任何的关系
+分析this指向的规律如下:
+
+[非严格模式]
+1、自执行函数中的this永远是window
+ [案例1]
+ var obj={
+ fn:(function(i){
+ //this->window
+ return function(){
+ //this->obj
+ }
+ })(0)
+ };
+ obj.fn();
+
+2、给元素的某个行为绑定一个方法,当行为触发的时候,执行绑定的方法,此时方法中的this是当前的元素
+ [案例1]
+ oDiv.onclick=function(){
+ //this->oDiv
+ };
+
+ [案例2]
+ function fn(){
+ //this->window
+ }
+ oDiv.onclick=function(){
+ //this->oDiv
+ fn();
+ };
+
+3、方法执行,看方法名前面是否有".",有的话,"."前面是谁this就是谁,没有的话this就是window
+ [案例1]
+ var obj={fn:fn};
+ function fn(){}
+ fn.prototype.aa=function(){};
+ var f=new fn;
+
+ fn();//this->window
+ obj.fn();//this->obj
+ fn.prototype.aa();//this->fn.prototype
+ f.aa();//this->f
+ f.__proto__.aa();//this->f.__proto__->fn.prototype
+
+
+4、在构造函数模式中,函数体中的this.xxx=xxx中的this是当前类的一个实例
+ [案例1]
+ function Fn(){
+ this.x=100; //this->f
+ this.getX=function(){
+ console.log(this);//this->f 因为getX方法执行的时候,"."前面是f,所以this是f
+ }
+ }
+ var f=new Fn;
+ f.getX();
+
+5、使用call/apply来改变this的指向(一但遇到call/apply上述的四条都没用了)
+
+
+[严格模式]
+"use strict";//->告诉浏览器我们接下来编写的JS代码采用严格模式
+
+1、自执行函数中的this永远是undefined
+ [案例1]
+ var obj={
+ fn:(function(i){
+ //this->undefined
+ return function(){
+ //this->obj
+ }
+ })(0)
+ };
+ obj.fn();
+
+3、方法执行,看方法名前面是否有".",有的话,"."前面是谁this就是谁,没有的话this就是undefined
+ [案例1]
+ var obj={fn:fn};
+ function fn(){}
+
+ fn();//this->undefined
+ obj.fn();//this->obj
+
+我们发现严格模式下的this相对于非严格模式下的this主要区别在于:对于JS代码中没有写执行主体的情况下,非严格模式下默认都是window执行的,所以this指向的是window;但是在严格的模式下,没有写就是没有执行主体,this指向的是undefined;
+
+你以为你以为的就是你以为的 ->切记 切记 切记
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\345\211\215\345\220\216\345\217\260\344\272\244\344\272\222\347\232\204\346\250\241\345\236\213.png" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\345\211\215\345\220\216\345\217\260\344\272\244\344\272\222\347\232\204\346\250\241\345\236\213.png"
new file mode 100644
index 0000000..cb28d49
Binary files /dev/null and "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\345\211\215\345\220\216\345\217\260\344\272\244\344\272\222\347\232\204\346\250\241\345\236\213.png" differ
diff --git "a/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\270\200\347\211\210.doc" "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\270\200\347\211\210.doc"
new file mode 100644
index 0000000..be89196
Binary files /dev/null and "b/20160312_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\270\200\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\270\200\347\211\210.doc" differ
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1.png" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1.png"
new file mode 100644
index 0000000..5b875ce
Binary files /dev/null and "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1.png" differ
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1\343\200\201\346\225\260\346\215\256\347\273\221\345\256\232.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1\343\200\201\346\225\260\346\215\256\347\273\221\345\256\232.html"
new file mode 100644
index 0000000..9aaffcc
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/1\343\200\201\346\225\260\346\215\256\347\273\221\345\256\232.html"
@@ -0,0 +1,117 @@
+
+
+
+
+ 数据绑定
+
+
+
+
+
01从习近平讲话看下一步反腐倡廉工作着力点
+
02李克强主持国务院常务会议再推简政放权
+
03从习近平讲话看下一步反腐倡廉工作着力点
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2.png" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2.png"
new file mode 100644
index 0000000..017ed3c
Binary files /dev/null and "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2.png" differ
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2\343\200\201\347\256\200\345\215\225\347\232\204\350\241\250\346\240\274\346\216\222\345\272\217.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2\343\200\201\347\256\200\345\215\225\347\232\204\350\241\250\346\240\274\346\216\222\345\272\217.html"
new file mode 100644
index 0000000..a4f0580
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/2\343\200\201\347\256\200\345\215\225\347\232\204\350\241\250\346\240\274\346\216\222\345\272\217.html"
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
98
+
99
+
96
+
95
+
90
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3.1-\346\255\243\345\210\231.txt" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3.1-\346\255\243\345\210\231.txt"
new file mode 100644
index 0000000..99cfede
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3.1-\346\255\243\345\210\231.txt"
@@ -0,0 +1,116 @@
+把第二周第二天正则及正则实战的教材反复多看几遍,你们的正则就赶上我了
+
+1、元字符
+ [拥有特殊含义的元字符]
+ \d -> 匹配一个0-9的数字,相当于[0-9],和它相反的是\D ->匹配一个除了0-9的任意字符
+ \w -> 匹配一个0-9、a-z、A-Z、_的数字或字符,相当于[0-9a-zA-Z_]
+ \s -> 匹配一个空白字符(空格、制表符...)
+ \b -> 匹配一个单词的边界
+ \t -> 匹配一个制表符
+ \n -> 匹配一个换行
+ . -> 匹配一个除了\n以外的任意字符
+ ^ -> 以某一个元字符开头
+ $ -> 以某一个元字符结尾
+ \ -> 转义字符
+ x|y -> x或者y的一个
+ [xyz] -> x、y、z中的任意一个
+ [^xyz] -> 除了xyz中的任意一个字符
+ [a-z] -> 匹配a-z中的任意一个字符
+ [^a-z] -> 匹配除了a-z中的任意一个字符
+ () -> 正则中的分组
+
+ 注意:
+ 1)关于[]
+ a、[+] ->中括号中出现的所有字符都代表的是本身的意思
+ b、[12-65] ->这个不是12-65而是1/2-6/5三者中的一个
+
+ 2)关于()
+ a、分组的作用是改变默认的优先级,例如:/^18|19$/,181、189、119、819、1819...都符合,而不是我们认为的18或19,但是改成/^(18|19)$/就是单纯的18或19了
+ b、可以在捕获大正则匹配的内容同时,把分组匹配的内容也进行捕获->分组捕获
+ c、分组引用,例如:/^(\d)(\w)\2\1$/,这里的\2是和第二个分组出现一模样的内容,\1是和第一个分组出现一模一样的内容,例如:"0aa0"就符合了
+
+
+ [代表数量的量词元字符]
+ * -> 0到多个
+ + -> 1到多个
+ ? -> 0到1个
+ {n} -> 出现n次
+ {n,} -> 出现n到多次
+ {n,m} -> 出现n到m次
+
+ 注意:
+ 1)关于?的几种情况
+ a、放在非量词元字符后面,代表出现0-1次
+ b、放在量词元字符后面,代表取消捕获时候的贪婪性,例如:reg=/\d+/; reg.exec("2015") -> "2015" 但是如果正则这样写 reg=/\d+?/; reg.exec("2015") -> "2"
+ c、在分组开头加?:,代表当前的分组只是匹配不进行捕获,例如:/^(?:\d+)$/
+ d、在分组开头加?=,正向预查,例如:/^zhufeng(?=1|2)$/ 只有"zhufeng1"和"zhufeng2"才符合
+ e、在分组开头加?!,负向预查,例如:/^zhufeng(?!1|2)$/ 除了"zhufeng1"和"zhufeng2"不符合,其他的只要是"zhufeng(任何的东西)"都符合
+
+ [代表本身意思的元字符]
+ 除了以上的,在字面量方式中,我们出现的其他任意字符代表的都是自己本身的意思
+ var num=12;
+ var reg=/^\w"+num+"$/; ->这里"+num+"不是把变量的值拼接,而这里的不管是"还是+都是元字符
+ ->对于需要拼接字符串和变量的方式我们只能使用实例方式创建正则
+
+2、修饰符
+ i -> ignoreCase 忽略字母的大小写
+ g -> global 全局匹配 (加上g可以解决正则捕获时候的懒惰性)
+ m -> multiline 多行匹配
+
+3、项目中常用的正则
+ 1)有效数字的
+ var reg=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
+
+ 2)邮箱的
+ var reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
+
+ 3)电话的
+ var reg = /^1\d{10}$/;
+
+ 4)年龄在18-65之间的
+ var reg = /^((18|19)|([2-5]\d)|(6[0-5]))$/;
+
+ 5)中文姓名
+ var reg = /^[\u4e00-\u9fa5]{2,4}$/;
+
+ 6)身份证
+ var reg = /^(\d{6})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;
+ //-> 130828(省市县) 1990(年) 12(月) 04(日) 06 1(奇数是男偶数是女) 7(数字或者X)
+
+4、正则的匹配
+ reg.test([string]) ->true就是匹配成功 false->匹配不成功
+
+5、正则的捕获
+ 1)reg.exec([string])
+ -> 首先去匹配,匹配成功在捕获,返回的是一个数组; 如果匹配不成功返回的是null;
+ -> 正则的捕获即懒惰又贪婪
+ -> 解决懒惰性 在正则的末尾增加全局修饰符g
+ -> 解决贪婪性 在量词后面加?
+
+其余更多的参照 "3.2-正则捕获.html"
+
+6、正则实战应用之-replace
+ 1)获取一个字符串中出现次数最多的字符和对应的次数,例如:var str = "zhufengpeixun2015yangfanqihang";问哪几个字符出现的次数最多,一共有多少次?
+
+ 2)千分符
+
+ 3)模板引擎绑定数据实现的原理
+ var ary = ["葛琪", "26", "china", "javascript"];
+ var str = "my name is {0},my age is {1},i com from {2},i can do {3}~~";
+ ->"my name is 葛琪,my age is 26,i com from china,i can do javascript~~";
+
+ 4)单词首字母大写
+ var str="my name is zhou xiao tian,my age is twenty five years old~~";
+ ->把所有单词的首字母大写
+
+ 5)格式化时间
+ var str="2015-5-3 12:9:13";
+ ->"2015年05月03日 12时09分13秒"
+
+ 6)queryURLParameter 获取地址栏中的参数
+ http://kbs.sports.qq.com/kbsweb/game.htm?mid=1467588&age=18
+ URL问号传参 -> mid=xxxx 就是我们传递过来的内容,我们需要获取mid,并且通过mid区分展示不同的内容
+ ->{mid:"1467588",age:18}
+
+ 7)在我们的utils.js这个DOM库中很多方法的编写中都使用了部分正则,大家自己回去看一下,尤其是getElementsByClass这个方法
+ ...
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3\343\200\201DOM\347\232\204\346\230\240\345\260\204\346\234\272\345\210\266.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3\343\200\201DOM\347\232\204\346\230\240\345\260\204\346\234\272\345\210\266.html"
new file mode 100644
index 0000000..17b98e7
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/3\343\200\201DOM\347\232\204\346\230\240\345\260\204\346\234\272\345\210\266.html"
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
98
+
99
+
96
+
95
+
90
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/4\343\200\201\350\241\250\346\240\274\346\216\222\345\272\217.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/4\343\200\201\350\241\250\346\240\274\346\216\222\345\272\217.html"
new file mode 100644
index 0000000..2178f0f
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/4\343\200\201\350\241\250\346\240\274\346\216\222\345\272\217.html"
@@ -0,0 +1,40 @@
+
+
+
+
+ 珠峰培训表格排序
+
+
+
+
+
+
+
+
姓名
+
年龄
+
武力
+
性别
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/5\343\200\201\346\255\243\345\210\231.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/5\343\200\201\346\255\243\345\210\231.html"
new file mode 100644
index 0000000..b5dce86
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/5\343\200\201\346\255\243\345\210\231.html"
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/6\343\200\201\345\270\270\347\224\250\347\232\204\346\255\243\345\210\231.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/6\343\200\201\345\270\270\347\224\250\347\232\204\346\255\243\345\210\231.html"
new file mode 100644
index 0000000..2607677
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/6\343\200\201\345\270\270\347\224\250\347\232\204\346\255\243\345\210\231.html"
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/7\343\200\201\346\255\243\345\210\231\347\232\204\346\215\225\350\216\267.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/7\343\200\201\346\255\243\345\210\231\347\232\204\346\215\225\350\216\267.html"
new file mode 100644
index 0000000..a7634f6
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/7\343\200\201\346\255\243\345\210\231\347\232\204\346\215\225\350\216\267.html"
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/8\343\200\201replace.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/8\343\200\201replace.html"
new file mode 100644
index 0000000..60dfca3
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/8\343\200\201replace.html"
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/9\343\200\201replace.html" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/9\343\200\201replace.html"
new file mode 100644
index 0000000..599f787
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/9\343\200\201replace.html"
@@ -0,0 +1,22 @@
+
+
+
+
+ 模板引擎实现原理
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/css/tab.css" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/css/tab.css"
new file mode 100644
index 0000000..3d1f5f7
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/css/tab.css"
@@ -0,0 +1,49 @@
+@charset "utf-8";
+* {
+ margin: 0;
+ padding: 0;
+ font-family: "微软雅黑";
+ font-size: 14px;
+ -webkit-user-select: none;
+}
+
+.box {
+ margin: 20px auto;
+ padding: 20px;
+ width: 400px;
+ border: 1px solid #008000;
+
+ border-radius: 10px;
+ box-shadow: 3px 3px 10px 0 #DBEEBD;
+}
+
+.box thead {
+ background: #008000;
+ color: #fff;
+}
+
+.box thead tr {
+ height: 35px;
+}
+
+.box thead tr th {
+ width: 100px;
+ text-align: center;
+}
+
+.box thead tr th.cursor {
+ cursor: pointer;
+}
+
+.box tbody tr {
+ height: 30px;
+}
+
+.box tbody tr.bg {
+ background: lightgreen;
+}
+
+.box tbody tr td {
+ width: 100px;
+ text-align: center;
+}
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab.js"
new file mode 100644
index 0000000..da66cd7
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab.js"
@@ -0,0 +1,88 @@
+//->想要操作谁就先获取谁
+var oTab = document.getElementById("tab");
+var tHead = oTab.tHead;
+var oThs = tHead.rows[0].cells;
+var tBody = oTab.tBodies[0];
+var oRows = tBody.rows;
+var data = null;
+
+//->1、首先获取后台中的数据
+var xhr = new XMLHttpRequest;
+xhr.open("get", "json/data.txt", false);
+xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
+ var val = xhr.responseText;
+ data = utils.jsonParse(val);
+ }
+};
+xhr.send(null);
+
+//->2、实现我们的数据绑定
+function bind() {
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < data.length; i++) {
+ var cur = data[i];
+ var oTr = document.createElement("tr");
+ for (var key in cur) {
+ var oTd = document.createElement("td");
+ oTd.innerHTML = key === "sex" ? (cur[key] === 0 ? "男" : "女") : cur[key];
+ oTr.appendChild(oTd);
+ }
+ frg.appendChild(oTr);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+}
+bind();
+
+//->3、实现隔行变色
+function changeBg() {
+ for (var i = 0; i < oRows.length; i++) {
+ oRows[i].className = i % 2 === 1 ? "bg" : null;
+ }
+}
+changeBg();
+
+
+//->4、编写表格排序的方法:实现按照年龄这一列进行排序
+function sort(n) {
+ var _this = this;
+ var ary = utils.listToArray(oRows);
+
+ //->点击当前列,需要让其他的列的flag存储的值回归到初始值-1,这样在返回头点击其他的列,才是按照升序排列的
+ for (var k = 0; k < oThs.length; k++) {
+ if (oThs[k] !== this) {
+ oThs[k].flag = -1;
+ }
+ }
+
+ _this.flag *= -1;
+ ary.sort(function (a, b) {
+ var curInn = a.cells[n].innerHTML, nexInn = b.cells[n].innerHTML;
+ var curInnNum = parseFloat(a.cells[n].innerHTML), nexInnNum = parseFloat(b.cells[n].innerHTML);
+ if (isNaN(curInnNum) || isNaN(nexInnNum)) {
+ return (curInn.localeCompare(nexInn)) * _this.flag;
+ }
+ return (curInnNum - nexInnNum) * _this.flag;
+ });
+
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < ary.length; i++) {
+ frg.appendChild(ary[i]);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+ changeBg();
+}
+
+//5、点击排序:所有具有class="cursor"这个样式的列都可以实现点击排序
+for (var i = 0; i < oThs.length; i++) {
+ var curTh = oThs[i];
+ if (curTh.className === "cursor") {
+ curTh.index = i;
+ curTh.flag = -1;
+ curTh.onclick = function () {
+ sort.call(this, this.index);
+ }
+ }
+}
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-this\344\274\230\345\214\226.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-this\344\274\230\345\214\226.js"
new file mode 100644
index 0000000..a549789
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-this\344\274\230\345\214\226.js"
@@ -0,0 +1,91 @@
+//->想要操作谁就先获取谁
+var oTab = document.getElementById("tab");
+var tHead = oTab.tHead;
+var oThs = tHead.rows[0].cells;
+var tBody = oTab.tBodies[0];
+var oRows = tBody.rows;
+var data = null;
+
+//->1、首先获取后台中的数据
+var xhr = new XMLHttpRequest;
+xhr.open("get", "json/data.txt", false);
+xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
+ var val = xhr.responseText;
+ data = utils.jsonParse(val);
+ }
+};
+xhr.send(null);
+
+//->2、实现我们的数据绑定
+function bind() {
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < data.length; i++) {
+ var cur = data[i];
+ var oTr = document.createElement("tr");
+ for (var key in cur) {
+ var oTd = document.createElement("td");
+ oTd.innerHTML = key === "sex" ? (cur[key] === 0 ? "男" : "女") : cur[key];
+ oTr.appendChild(oTd);
+ }
+ frg.appendChild(oTr);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+}
+bind();
+
+//->3、实现隔行变色
+function changeBg() {
+ for (var i = 0; i < oRows.length; i++) {
+ oRows[i].className = i % 2 === 1 ? "bg" : null;
+ }
+}
+changeBg();
+
+
+//->4、编写表格排序的方法:实现按照年龄这一列进行排序
+function sort() {
+ //this->oThs[1]
+ var _this = this;
+
+ var ary = utils.listToArray(oRows);
+
+ _this.flag *= -1;
+ ary.sort(function (a, b) {
+ //this->window
+ return (parseFloat(a.cells[1].innerHTML) - parseFloat(b.cells[1].innerHTML)) * _this.flag;
+ });
+
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < ary.length; i++) {
+ frg.appendChild(ary[i]);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+ changeBg();
+}
+
+//5、点击第二列实现排序
+oThs[1].flag = -1;
+oThs[1].onclick = function () {
+ //this->oThs[1]
+ //sort();//->sort中的this->window
+ //sort.call(oThs[1]);
+ sort.call(this);
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\256\236\347\216\260\345\244\232\345\210\227\346\216\222\345\272\217.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\256\236\347\216\260\345\244\232\345\210\227\346\216\222\345\272\217.js"
new file mode 100644
index 0000000..7666206
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\256\236\347\216\260\345\244\232\345\210\227\346\216\222\345\272\217.js"
@@ -0,0 +1,96 @@
+//->想要操作谁就先获取谁
+var oTab = document.getElementById("tab");
+var tHead = oTab.tHead;
+var oThs = tHead.rows[0].cells;
+var tBody = oTab.tBodies[0];
+var oRows = tBody.rows;
+var data = null;
+
+//->1、首先获取后台中的数据
+var xhr = new XMLHttpRequest;
+xhr.open("get", "json/data.txt", false);
+xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
+ var val = xhr.responseText;
+ data = utils.jsonParse(val);
+ }
+};
+xhr.send(null);
+
+//->2、实现我们的数据绑定
+function bind() {
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < data.length; i++) {
+ var cur = data[i];
+ var oTr = document.createElement("tr");
+ for (var key in cur) {
+ var oTd = document.createElement("td");
+ oTd.innerHTML = key === "sex" ? (cur[key] === 0 ? "男" : "女") : cur[key];
+ oTr.appendChild(oTd);
+ }
+ frg.appendChild(oTr);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+}
+bind();
+
+//->3、实现隔行变色
+function changeBg() {
+ for (var i = 0; i < oRows.length; i++) {
+ oRows[i].className = i % 2 === 1 ? "bg" : null;
+ }
+}
+changeBg();
+
+
+//->4、编写表格排序的方法:实现按照年龄这一列进行排序
+function sort(n) {//->n是当前点击这一列的索引
+ var _this = this;
+ var ary = utils.listToArray(oRows);
+
+ _this.flag *= -1;
+ ary.sort(function (a, b) {
+ var curInn = a.cells[n].innerHTML, nexInn = b.cells[n].innerHTML;
+ var curInnNum = parseFloat(a.cells[n].innerHTML), nexInnNum = parseFloat(b.cells[n].innerHTML);
+ if (isNaN(curInnNum) || isNaN(nexInnNum)) {
+ return (curInn.localeCompare(nexInn)) * _this.flag;
+ }
+ return (curInnNum - nexInnNum) * _this.flag;
+ });
+
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < ary.length; i++) {
+ frg.appendChild(ary[i]);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+ changeBg();
+}
+
+//5、点击排序:所有具有class="cursor"这个样式的列都可以实现点击排序
+for (var i = 0; i < oThs.length; i++) {
+ var curTh = oThs[i];
+ if (curTh.className === "cursor") {
+ curTh.index = i;//->用来存储索引的
+ curTh.flag = -1;//->用来实现升降序
+ curTh.onclick = function () {
+ sort.call(this, this.index);
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\271\264\351\276\204\345\215\207\351\231\215\345\272\217\346\216\222\345\272\217.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\271\264\351\276\204\345\215\207\351\231\215\345\272\217\346\216\222\345\272\217.js"
new file mode 100644
index 0000000..0bba25e
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\345\271\264\351\276\204\345\215\207\351\231\215\345\272\217\346\216\222\345\272\217.js"
@@ -0,0 +1,74 @@
+//->想要操作谁就先获取谁
+var oTab = document.getElementById("tab");
+var tHead = oTab.tHead;
+var oThs = tHead.rows[0].cells;
+var tBody = oTab.tBodies[0];
+var oRows = tBody.rows;
+var data = null;
+
+//->1、首先获取后台中的数据
+var xhr = new XMLHttpRequest;
+xhr.open("get", "json/data.txt", false);
+xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
+ var val = xhr.responseText;
+ data = utils.jsonParse(val);
+ }
+};
+xhr.send(null);
+
+//->2、实现我们的数据绑定
+function bind() {
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < data.length; i++) {
+ var cur = data[i];
+ var oTr = document.createElement("tr");
+ for (var key in cur) {
+ var oTd = document.createElement("td");
+ oTd.innerHTML = key === "sex" ? (cur[key] === 0 ? "男" : "女") : cur[key];
+ oTr.appendChild(oTd);
+ }
+ frg.appendChild(oTr);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+}
+bind();
+
+//->3、实现隔行变色
+function changeBg() {
+ for (var i = 0; i < oRows.length; i++) {
+ oRows[i].className = i % 2 === 1 ? "bg" : null;
+ }
+}
+changeBg();
+
+
+//->4、编写表格排序的方法:实现按照年龄这一列进行排序
+function sort() {
+ //->把存储所有行的类数组转换为数组
+ var ary = utils.listToArray(oRows);
+
+ //->给数组进行排序:按照每一行的第二列中的内容由小到大进行排序
+ oThs[1].flag *= -1;//->每一次执行sort,进来的第一步就是先让flag的值*-1 ->第一次flag=-1 *=-1 flag=1 升序 第二次*=-1 flag=-1 降序 第三次*=-1 flag=1 升序 ...
+ ary.sort(function (a, b) {
+ return (parseFloat(a.cells[1].innerHTML) - parseFloat(b.cells[1].innerHTML)) * oThs[1].flag;
+ });
+
+ //->按照ary中的最新顺序,把每一行重新的添加到tBody中
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < ary.length; i++) {
+ frg.appendChild(ary[i]);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+
+ //->按照最新的顺序重新进行隔行变色
+ changeBg();
+}
+
+//5、点击第二列实现排序
+oThs[1].flag = -1;//->给当前点击这一列增加一个自定义属性flag,存储的值是-1
+oThs[1].onclick = function () {
+ sort();
+};
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\350\216\267\345\217\226\346\225\260\346\215\256\345\222\214\347\273\221\345\256\232\346\225\260\346\215\256.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\350\216\267\345\217\226\346\225\260\346\215\256\345\222\214\347\273\221\345\256\232\346\225\260\346\215\256.js"
new file mode 100644
index 0000000..37f4735
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/tab\345\244\207\344\273\275-\350\216\267\345\217\226\346\225\260\346\215\256\345\222\214\347\273\221\345\256\232\346\225\260\346\215\256.js"
@@ -0,0 +1,59 @@
+//->想要操作谁就先获取谁
+var oTab = document.getElementById("tab");
+var tHead = oTab.tHead;
+var oThs = tHead.rows[0].cells;
+var tBody = oTab.tBodies[0];
+var oRows = tBody.rows;
+
+var data = null;
+
+//->1、首先获取后台(data.txt)中的数据->"JSON格式的字符串" ->Ajax(async javascript and xml)
+//1)首先创建一个Ajax对象
+var xhr = new XMLHttpRequest;
+
+//2)打开我们需要请求数据的那个文件地址
+xhr.open("get", "json/data.txt", false);
+
+//3)监听请求的状态
+xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
+ var val = xhr.responseText;
+ data = utils.jsonParse(val);
+ }
+};
+
+//4)发送请求
+xhr.send(null);
+
+//->2、实现我们的数据绑定
+function bind() {
+ var frg = document.createDocumentFragment();
+ for (var i = 0; i < data.length; i++) {
+ var cur = data[i];
+ var oTr = document.createElement("tr");//->每一次循环创建一个TR
+ //每一个TR中还需要创建四个TD,因为每一个对象中有四组键值对
+ for (var key in cur) {
+ var oTd = document.createElement("td");
+
+ //->对性别进行特殊的处理 0->男 1->女
+ if (key === "sex") {
+ oTd.innerHTML = cur[key] === 0 ? "男" : "女";
+ } else {
+ oTd.innerHTML = cur[key];
+ }
+ oTr.appendChild(oTd);
+ }
+ frg.appendChild(oTr);
+ }
+ tBody.appendChild(frg);
+ frg = null;
+}
+bind();
+
+//->3、实现隔行变色
+function changeBg() {
+ for (var i = 0; i < oRows.length; i++) {
+ oRows[i].className = i % 2 === 1 ? "bg" : null;
+ }
+}
+changeBg();
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/utils.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/utils.js"
new file mode 100644
index 0000000..96d736f
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/js/utils.js"
@@ -0,0 +1,16 @@
+var utils = {
+ listToArray: function (likeAry) {
+ var ary = [];
+ try {
+ ary = Array.prototype.slice.call(likeAry);
+ } catch (e) {
+ for (var i = 0; i < likeAry.length; i++) {
+ ary[ary.length] = likeAry[i];
+ }
+ }
+ return ary;
+ },
+ jsonParse: function (str) {
+ return "JSON" in window ? JSON.parse(str) : eval("(" + str + ")");
+ }
+};
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/data.txt" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/data.txt"
new file mode 100644
index 0000000..66005ea
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/data.txt"
@@ -0,0 +1 @@
+[{"name": "令狐冲", "age": 24, "score": 98, "sex": 0},{"name": "任盈盈", "age": 22, "score": 80, "sex": 1},{"name": "岳灵珊", "age": 21, "score": 88, "sex": 1},{"name": "岳不群", "age": 58, "score": 96, "sex": 0},{"name": "林平之", "age": 23, "score": 90, "sex": 0},{"name": "东方不败", "age": 30, "score": 100, "sex": 1}]
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-bind.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-bind.js"
new file mode 100644
index 0000000..3fd5b71
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-bind.js"
@@ -0,0 +1,31 @@
+//这里存放的是我们JSON格式的数据
+var ary = [
+ {
+ "title": "从习近平讲话看下一步反腐倡廉工作着力点",
+ "desc": "习近平总书记12日上午在十八届中央纪委六次全会上发表重要讲话,深刻分析反腐败斗争依然严峻复杂的形势,提出当前和今后一个时期的目标任务。"
+ },
+ {
+ "title": "李克强主持国务院常务会议再推简政放权",
+ "desc": "国务院总理李克强1月13日主持召开国务院常务会议,决定再推出一批简政放权改革措施,让市场活力更大释放;确定完善高新技术企业认定办法,使更多创新型企业得到政策支持。"
+ },
+ {
+ "title": "从习近平讲话看下一步反腐倡廉工作着力点",
+ "desc": "习近平总书记12日上午在十八届中央纪委六次全会上发表重要讲话,深刻分析反腐败斗争依然严峻复杂的形势,提出当前和今后一个时期的目标任务。"
+ },
+ {
+ "title": "李克强主持国务院常务会议再推简政放权",
+ "desc": "国务院总理李克强1月13日主持召开国务院常务会议,决定再推出一批简政放权改革措施,让市场活力更大释放;确定完善高新技术企业认定办法,使更多创新型企业得到政策支持。"
+ },
+ {
+ "title": "从习近平讲话看下一步反腐倡廉工作着力点",
+ "desc": "习近平总书记12日上午在十八届中央纪委六次全会上发表重要讲话,深刻分析反腐败斗争依然严峻复杂的形势,提出当前和今后一个时期的目标任务。"
+ },
+ {
+ "title": "李克强主持国务院常务会议再推简政放权",
+ "desc": "国务院总理李克强1月13日主持召开国务院常务会议,决定再推出一批简政放权改革措施,让市场活力更大释放;确定完善高新技术企业认定办法,使更多创新型企业得到政策支持。"
+ },
+ {
+ "title": "李克强主持国务院常务会议再推简政放权",
+ "desc": "国务院总理李克强1月13日主持召开国务院常务会议,决定再推出一批简政放权改革措施,让市场活力更大释放;确定完善高新技术企业认定办法,使更多创新型企业得到政策支持。"
+ }
+];
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-sort.js" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-sort.js"
new file mode 100644
index 0000000..fe9ff04
--- /dev/null
+++ "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/json/json-sort.js"
@@ -0,0 +1,10 @@
+//为我们的表格排序准备json格式的数据
+//sex:0->男 1->女
+var jsonAry = [
+ {"name": "令狐冲", "age": 24, "score": 98, "sex": 0},
+ {"name": "任盈盈", "age": 22, "score": 80, "sex": 1},
+ {"name": "岳灵珊", "age": 21, "score": 88, "sex": 1},
+ {"name": "岳不群", "age": 58, "score": 96, "sex": 0},
+ {"name": "林平之", "age": 23, "score": 90, "sex": 0},
+ {"name": "东方不败", "age": 30, "score": 100, "sex": 1}
+];
\ No newline at end of file
diff --git "a/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\272\214\347\211\210.doc" "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\272\214\347\211\210.doc"
new file mode 100644
index 0000000..a0f0605
Binary files /dev/null and "b/20160313_\345\221\250\346\234\253\347\217\255\347\254\254\344\272\214\345\221\250\347\254\254\344\272\214\345\244\251/\347\254\254\344\270\200\345\221\250\350\200\203\350\257\225\351\242\230_\347\254\254\344\272\214\347\211\210.doc" differ
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/0.\351\200\211\346\213\251\345\231\250\344\270\200\350\247\210\350\241\250.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/0.\351\200\211\346\213\251\345\231\250\344\270\200\350\247\210\350\241\250.html"
new file mode 100644
index 0000000..ebeef7e
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/0.\351\200\211\346\213\251\345\231\250\344\270\200\350\247\210\350\241\250.html"
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
珠峰培训CSS/CSS3常用选择器一览表
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/1.\351\200\211\346\213\251\345\231\2501.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/1.\351\200\211\346\213\251\345\231\2501.html"
new file mode 100644
index 0000000..3c4707f
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/1.\351\200\211\346\213\251\345\231\2501.html"
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+ 3333
+
+ 1111
+
+ 22222
+ 44444
+
+ 5555
+
+
+
+
+兴趣爱好: 睡觉 打豆豆
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/10.transition.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/10.transition.html"
new file mode 100644
index 0000000..b655bb4
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/10.transition.html"
@@ -0,0 +1,32 @@
+
+
+
+
+ transition
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/11.border-radius.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/11.border-radius.html"
new file mode 100644
index 0000000..320ed15
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/11.border-radius.html"
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/2.\351\200\211\346\213\251\345\231\2502.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/2.\351\200\211\346\213\251\345\231\2502.html"
new file mode 100644
index 0000000..f421b6a
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/2.\351\200\211\346\213\251\345\231\2502.html"
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
指定某一个变色
+
+
+
1
+
2
+
+
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
20
+
21
+
+
+
+
+
+
+
+
1
+
2
+
+
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
20
+
21
+
+
+
+
+
+
111
+
2222
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/3.\344\274\252\345\205\203\347\264\240.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/3.\344\274\252\345\205\203\347\264\240.html"
new file mode 100644
index 0000000..61da782
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/3.\344\274\252\345\205\203\347\264\240.html"
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
中ellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
+
Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/4.\347\272\277\346\200\247\346\270\220\345\217\230.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/4.\347\272\277\346\200\247\346\270\220\345\217\230.html"
new file mode 100644
index 0000000..719f004
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/4.\347\272\277\346\200\247\346\270\220\345\217\230.html"
@@ -0,0 +1,23 @@
+
+
+
+
+ 线性渐变
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/5.\347\233\256\346\240\207\344\274\252\347\261\273\351\200\211\346\213\251\345\231\250.html" "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/5.\347\233\256\346\240\207\344\274\252\347\261\273\351\200\211\346\213\251\345\231\250.html"
new file mode 100644
index 0000000..2d2bc4b
--- /dev/null
+++ "b/20160315_\347\254\254\344\270\211\345\221\250\345\205\250\346\227\245\345\210\266\347\254\254\344\270\200\345\244\251/5.\347\233\256\346\240\207\344\274\252\347\261\273\351\200\211\346\213\251\345\231\250.html"
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
中的蓝色下边框 */
+ color:#000000;
+ background-color:#FFFFFF;
+}
+body#home li.home a:link, body#home li.home a:visited, /* 当前页面的菜单项的超链接 */
+body#dev li.dev a:link, body#dev li.dev a:visited,
+body#design li.design a:link, body#design li.design a:visited,
+body#map li.map a:link, body#map li.map a:visited{
+ color:#000000;
+ background-color:#FFFFFF;
+}
+body#home li.home a:hover, body#dev li.dev a:hover,
+body#design li.design a:hover, body#map li.map a:hover{
+ color:#006eb3;
+ text-decoration:underline;
+}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css"
new file mode 100644
index 0000000..ac150c3
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css"
@@ -0,0 +1,252 @@
+@charset "UTF-8";
+
+/* SpryTabbedPanels.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* Horizontal Tabbed Panels
+ *
+ * The default style for a TabbedPanels widget places all tab buttons
+ * (left aligned) above the content panel.
+ */
+
+/* This is the selector for the main TabbedPanels container. For our
+ * default style, this container does not contribute anything visually,
+ * but it is floated left to make sure that any floating or clearing done
+ * with any of its child elements are contained completely within the
+ * TabbedPanels container, to minimize any impact or undesireable
+ * interaction with other floated elements on the page that may be used
+ * for layout.
+ *
+ * If you want to constrain the width of the TabbedPanels widget, set a
+ * width on the TabbedPanels container. By default, the TabbedPanels widget
+ * expands horizontally to fill up available space.
+ *
+ * The name of the class ("TabbedPanels") used in this selector is not
+ * necessary to make the widget function. You can use any class name you
+ * want to style the TabbedPanels container.
+ */
+.TabbedPanels {
+ margin: 0px;
+ padding: 0px;
+ float: left;
+ clear: none;
+ width: 500px; /* IE Hack to force proper layout when preceded by a paragraph. (hasLayout Bug)*/
+}
+
+/* This is the selector for the TabGroup. The TabGroup container houses
+ * all of the tab buttons for each tabbed panel in the widget. This container
+ * does not contribute anything visually to the look of the widget for our
+ * default style.
+ *
+ * The name of the class ("TabbedPanelsTabGroup") used in this selector is not
+ * necessary to make the widget function. You can use any class name you
+ * want to style the TabGroup container.
+ javaScript
+ javascript
+ JAVASCRIPT
+ JavaScript
+ */
+.TabbedPanelsTabGroup {
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the TabbedPanelsTab. This container houses
+ * the title for the panel. This is also the tab "button" that the user clicks
+ * on to activate the corresponding content panel so that it appears on top
+ * of the other tabbed panels contained in the widget.
+ *
+ * For our default style, each tab is positioned relatively 1 pixel down from
+ * where it wold normally render. This allows each tab to overlap the content
+ * panel that renders below it. Each tab is rendered with a 1 pixel bottom
+ * border that has a color that matches the top border of the current content
+ * panel. This gives the appearance that the tab is being drawn behind the
+ * content panel.
+ *
+ * The name of the class ("TabbedPanelsTab") used in this selector is not
+ * necessary to make the widget function. You can use any class name you want
+ * to style this tab container.
+ */
+.TabbedPanelsTab {
+ display:block;
+ height:30px;
+ float: left;
+ position: relative;
+ top: 2px;
+ padding: 0px 0px 0px 15px;
+ margin: 0px 0px 0px 0px;
+ background:url('tab-back.gif') no-repeat;
+ list-style: none;
+ cursor: pointer;
+ color:#fff;
+ font: bold 14px Arial;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.TabbedPanelsTab span {
+ display:block;
+ background:url('tab-back.gif') right top no-repeat;
+ padding:7px 25px 7px 0;
+ margin:0px 0 0 0;
+}
+
+/* This selector is an example of how to change the appearnce of a tab button
+ * container as the mouse enters it. The class "TabbedPanelsTabHover" is
+ * programatically added and removed from the tab element as the mouse enters
+ * and exits the container.
+ */
+.TabbedPanelsTabHover {
+ background:url('tab-hover.gif') no-repeat;
+ color:#900;
+}
+
+.TabbedPanelsTabHover span {
+display:block;
+ background:url('tab-hover.gif') right top no-repeat;
+ padding:7px 25px 7px 0;
+}
+
+
+/* This selector is an example of how to change the appearance of a tab button
+ * container after the user has clicked on it to activate a content panel.
+ * The class "TabbedPanelsTabSelected" is programatically added and removed
+ * from the tab element as the user clicks on the tab button containers in
+ * the widget.
+ *
+ * As mentioned above, for our default style, tab buttons are positioned
+ * 1 pixel down from where it would normally render. When the tab button is
+ * selected, we change its bottom border to match the background color of the
+ * content panel so that it looks like the tab is part of the content panel.
+ */
+.TabbedPanelsTabSelected {
+ background:url('tab-current.gif') no-repeat;
+ color:#900;
+}
+
+.TabbedPanelsTabSelected span {
+display:block;
+ background:url('tab-current.gif') no-repeat right top;
+ padding:7px 25px 7px 0;
+ margin:0px 0 0 0;
+}
+
+
+/* This selector is an example of how to make a link inside of a tab button
+ * look like normal text. Users may want to use links inside of a tab button
+ * so that when it gets focus, the text *inside* the tab button gets a focus
+ * ring around it, instead of the focus ring around the entire tab.
+ */
+.TabbedPanelsTab a {
+ color: black;
+ text-decoration: none;
+}
+
+/* This is the selector for the ContentGroup. The ContentGroup container houses
+ * all of the content panels for each tabbed panel in the widget. For our
+ * default style, this container provides the background color and borders that
+ * surround the content.
+ *
+ * The name of the class ("TabbedPanelsContentGroup") used in this selector is
+ * not necessary to make the widget function. You can use any class name you
+ * want to style the ContentGroup container.
+ */
+.TabbedPanelsContentGroup {
+ clear: both;
+ border-left: solid 2px #900;
+ border-bottom: solid 2px #900;
+ border-top: solid 2px #900;
+ border-right: solid 2px #900;
+ background-color: #fff;
+}
+
+/* This is the selector for the Content panel. The Content panel holds the
+ * content for a single tabbed panel. For our default style, this container
+ * provides some padding, so that the content is not pushed up against the
+ * widget borders.
+ *
+ * The name of the class ("TabbedPanelsContent") used in this selector is
+ * not necessary to make the widget function. You can use any class name you
+ * want to style the Content container.
+ */
+.TabbedPanelsContent {
+ font:12px/18px Arial;
+ padding: 4px;
+}
+
+.TabbedPanelsContent img{
+float:right;
+ padding: 4px;
+ }
+
+/* This selector is an example of how to change the appearnce of the currently
+ * active container panel. The class "TabbedPanelsContentVisible" is
+ * programatically added and removed from the content element as the panel
+ * is activated/deactivated.
+ */
+.TabbedPanelsContentVisible {
+}
+
+/* Vertical Tabbed Panels
+ *
+ * The following rules override some of the default rules above so that the
+ * TabbedPanels widget renders with its tab buttons along the left side of
+ * the currently active content panel.
+ *
+ * With the rules defined below, the only change that will have to be made
+ * to switch a horizontal tabbed panels widget to a vertical tabbed panels
+ * widget, is to use the "VTabbedPanels" class on the top-level widget
+ * container element, instead of "TabbedPanels".
+ */
+
+/* This selector floats the TabGroup so that the tab buttons it contains
+ * render to the left of the active content panel. A border is drawn around
+ * the group container to make it look like a list container.
+ */
+.VTabbedPanels .TabbedPanelsTabGroup {
+ float: left;
+ width: 10em;
+ height: 20em;
+ background-color: #EEE;
+ position: relative;
+ border-top: solid 1px #999;
+ border-right: solid 1px #999;
+ border-left: solid 1px #CCC;
+ border-bottom: solid 1px #CCC;
+}
+
+/* This selector disables the float property that is placed on each tab button
+ * by the default TabbedPanelsTab selector rule above. It also draws a bottom
+ * border for the tab. The tab button will get its left and right border from
+ * the TabGroup, and its top border from the TabGroup or tab button above it.
+ */
+.VTabbedPanels .TabbedPanelsTab {
+ float: none;
+ margin: 0px;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
+/* This selector disables the float property that is placed on each tab button
+ * by the default TabbedPanelsTab selector rule above. It also draws a bottom
+ * border for the tab. The tab button will get its left and right border from
+ * the TabGroup, and its top border from the TabGroup or tab button above it.
+ */
+.VTabbedPanels .TabbedPanelsTabSelected {
+ background-color: #EEE;
+ border-bottom: solid 1px #999;
+}
+
+/* This selector floats the content panels for the widget so that they
+ * render to the right of the tabbed buttons.
+ */
+.VTabbedPanels .TabbedPanelsContentGroup {
+ clear: none;
+ float: left;
+ padding: 0px;
+ width: 30em;
+ height: 20em;
+}
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js"
new file mode 100644
index 0000000..ff13c63
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js"
@@ -0,0 +1,368 @@
+/* SpryTabbedPanels.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.TabbedPanels = function(element, opts)
+{
+ this.element = this.getElement(element);
+ this.defaultTab = 0; // Show the first panel by default.
+ this.bindings = [];
+ this.tabSelectedClass = "TabbedPanelsTabSelected";
+ this.tabHoverClass = "TabbedPanelsTabHover";
+ this.tabFocusedClass = "TabbedPanelsTabFocused";
+ this.panelVisibleClass = "TabbedPanelsContentVisible";
+ this.focusElement = null;
+ this.hasFocus = false;
+ this.currentTabIndex = 0;
+ this.enableKeyboardNavigation = true;
+
+ Spry.Widget.TabbedPanels.setOptions(this, opts);
+
+ // If the defaultTab is expressed as a number/index, convert
+ // it to an element.
+
+ if (typeof (this.defaultTab) == "number")
+ {
+ if (this.defaultTab < 0)
+ this.defaultTab = 0;
+ else
+ {
+ var count = this.getTabbedPanelCount();
+ if (this.defaultTab >= count)
+ this.defaultTab = (count > 1) ? (count - 1) : 0;
+ }
+
+ this.defaultTab = this.getTabs()[this.defaultTab];
+ }
+
+ // The defaultTab property is supposed to be the tab element for the tab content
+ // to show by default. The caller is allowed to pass in the element itself or the
+ // element's id, so we need to convert the current value to an element if necessary.
+
+ if (this.defaultTab)
+ this.defaultTab = this.getElement(this.defaultTab);
+
+ this.attachBehaviors();
+};
+
+Spry.Widget.TabbedPanels.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+}
+
+Spry.Widget.TabbedPanels.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.TabbedPanels.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.TabbedPanels.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.TabbedPanels.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabGroup = function()
+{
+ if (this.element)
+ {
+ var children = this.getElementChildren(this.element);
+ if (children.length)
+ return children[0];
+ }
+ return null;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabs = function()
+{
+ var tabs = [];
+ var tg = this.getTabGroup();
+ if (tg)
+ tabs = this.getElementChildren(tg);
+ return tabs;
+};
+
+Spry.Widget.TabbedPanels.prototype.getContentPanelGroup = function()
+{
+ if (this.element)
+ {
+ var children = this.getElementChildren(this.element);
+ if (children.length > 1)
+ return children[1];
+ }
+ return null;
+};
+
+Spry.Widget.TabbedPanels.prototype.getContentPanels = function()
+{
+ var panels = [];
+ var pg = this.getContentPanelGroup();
+ if (pg)
+ panels = this.getElementChildren(pg);
+ return panels;
+};
+
+Spry.Widget.TabbedPanels.prototype.getIndex = function(ele, arr)
+{
+ ele = this.getElement(ele);
+ if (ele && arr && arr.length)
+ {
+ for (var i = 0; i < arr.length; i++)
+ {
+ if (ele == arr[i])
+ return i;
+ }
+ }
+ return -1;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabIndex = function(ele)
+{
+ var i = this.getIndex(ele, this.getTabs());
+ if (i < 0)
+ i = this.getIndex(ele, this.getContentPanels());
+ return i;
+};
+
+Spry.Widget.TabbedPanels.prototype.getCurrentTabIndex = function()
+{
+ return this.currentTabIndex;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabbedPanelCount = function(ele)
+{
+ return Math.min(this.getTabs().length, this.getContentPanels().length);
+};
+
+Spry.Widget.TabbedPanels.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabClick = function(e, tab)
+{
+ this.showPanel(tab);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabMouseOver = function(e, tab)
+{
+ this.addClassName(tab, this.tabHoverClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabMouseOut = function(e, tab)
+{
+ this.removeClassName(tab, this.tabHoverClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabFocus = function(e, tab)
+{
+ this.hasFocus = true;
+ this.addClassName(this.element, this.tabFocusedClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabBlur = function(e, tab)
+{
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.tabFocusedClass);
+};
+
+Spry.Widget.TabbedPanels.ENTER_KEY = 13;
+Spry.Widget.TabbedPanels.SPACE_KEY = 32;
+
+Spry.Widget.TabbedPanels.prototype.onTabKeyDown = function(e, tab)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != Spry.Widget.TabbedPanels.ENTER_KEY && key != Spry.Widget.TabbedPanels.SPACE_KEY))
+ return true;
+
+ this.showPanel(tab);
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.TabbedPanels.prototype.preorderTraversal = function(root, func)
+{
+ var stopTraversal = false;
+ if (root)
+ {
+ stopTraversal = func(root);
+ if (root.hasChildNodes())
+ {
+ var child = root.firstChild;
+ while (!stopTraversal && child)
+ {
+ stopTraversal = this.preorderTraversal(child, func);
+ try { child = child.nextSibling; } catch (e) { child = null; }
+ }
+ }
+ }
+ return stopTraversal;
+};
+
+Spry.Widget.TabbedPanels.prototype.addPanelEventListeners = function(tab, panel)
+{
+ var self = this;
+ Spry.Widget.TabbedPanels.addEventListener(tab, "click", function(e) { return self.onTabClick(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(e, tab); }, false);
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ // Find the first element within the tab container that has a tabindex or the first
+ // anchor tag.
+
+ var tabIndexEle = null;
+ var tabAnchorEle = null;
+
+ this.preorderTraversal(tab, function(node) {
+ if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
+ {
+ var tabIndexAttr = tab.attributes.getNamedItem("tabindex");
+ if (tabIndexAttr)
+ {
+ tabIndexEle = node;
+ return true;
+ }
+ if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")
+ tabAnchorEle = node;
+ }
+ return false;
+ });
+
+ if (tabIndexEle)
+ this.focusElement = tabIndexEle;
+ else if (tabAnchorEle)
+ this.focusElement = tabAnchorEle;
+
+ if (this.focusElement)
+ {
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "focus", function(e) { return self.onTabFocus(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "blur", function(e) { return self.onTabBlur(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "keydown", function(e) { return self.onTabKeyDown(e, tab); }, false);
+ }
+ }
+};
+
+Spry.Widget.TabbedPanels.prototype.showPanel = function(elementOrIndex)
+{
+ var tpIndex = -1;
+
+ if (typeof elementOrIndex == "number")
+ tpIndex = elementOrIndex;
+ else // Must be the element for the tab or content panel.
+ tpIndex = this.getTabIndex(elementOrIndex);
+
+ if (!tpIndex < 0 || tpIndex >= this.getTabbedPanelCount())
+ return;
+
+ var tabs = this.getTabs();
+ var panels = this.getContentPanels();
+
+ var numTabbedPanels = Math.max(tabs.length, panels.length);
+
+ for (var i = 0; i < numTabbedPanels; i++)
+ {
+ if (i != tpIndex)
+ {
+ if (tabs[i])
+ this.removeClassName(tabs[i], this.tabSelectedClass);
+ if (panels[i])
+ {
+ this.removeClassName(panels[i], this.panelVisibleClass);
+ panels[i].style.display = "none";
+ }
+ }
+ }
+
+ this.addClassName(tabs[tpIndex], this.tabSelectedClass);
+ this.addClassName(panels[tpIndex], this.panelVisibleClass);
+ panels[tpIndex].style.display = "block";
+
+ this.currentTabIndex = tpIndex;
+};
+
+Spry.Widget.TabbedPanels.prototype.attachBehaviors = function(element)
+{
+ var tabs = this.getTabs();
+ var panels = this.getContentPanels();
+ var panelCount = this.getTabbedPanelCount();
+
+ for (var i = 0; i < panelCount; i++)
+ this.addPanelEventListeners(tabs[i], panels[i]);
+
+ this.showPanel(this.defaultTab);
+};
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..619aa3c
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif"
new file mode 100644
index 0000000..ff9ba4d
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif"
new file mode 100644
index 0000000..3b4bc36
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif"
new file mode 100644
index 0000000..8de5f9f
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm"
new file mode 100644
index 0000000..f601189
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm"
@@ -0,0 +1,72 @@
+
+
+
+
+Tab面板
+
+
+
+
+
+
+
+
Home
+
Web Development
+
Web Design
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif"
new file mode 100644
index 0000000..0db0cf9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css"
new file mode 100644
index 0000000..992cd31
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css"
@@ -0,0 +1,106 @@
+@charset "UTF-8";
+
+/* SpryCollapsiblePanel.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* This is the selector for the main CollapsiblePanel container. For our
+ * default style, the CollapsiblePanel is responsible for drawing the borders
+ * around the widget.
+ *
+ * If you want to constrain the width of the CollapsiblePanel widget, set a width on
+ * the CollapsiblePanel container. By default, our CollapsiblePanel expands horizontally to fill
+ * up available space.
+ *
+ * The name of the class ("CollapsiblePanel") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style the
+ * CollapsiblePanel container.
+ */
+.CollapsiblePanel {
+ width:300px;
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the CollapsiblePanelTab. This container houses
+ * the title for the panel. This is also the container that the user clicks
+ * on to open or close the panel.
+ *
+ * The name of the class ("CollapsiblePanelTab") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * CollapsiblePanel panel tab container.
+ */
+.CollapsiblePanelTab {
+ font: bold 1em Arial;
+ color:#630;
+ background: url(col-close-back.gif) no-repeat;
+ line-height:30px;
+ height:30px;
+ margin: 0px;
+ padding: 2px 30px;
+ cursor: pointer;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+/* This is the selector for a CollapsiblePanel's Content area. It's important to note that
+ * you should never put any padding on the content area element if you plan to
+ * use the CollapsiblePanel's open/close animations. Placing a non-zero padding on the content
+ * element can cause the CollapsiblePanel to abruptly grow in height while the panels animate.
+ *
+ * The name of the class ("CollapsiblePanelContent") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style a
+ * CollapsiblePanel content container.
+ */
+.CollapsiblePanelContent {
+ margin: 0px;
+ font: 0.8em Arial;
+ padding: 5px;
+}
+
+.CollapsiblePanelContent img{
+ float:right;
+ padding:2px;
+ margin:5px;
+ border:1px #aaa dashed;
+ }
+
+/* An anchor tag can be used inside of a CollapsiblePanelTab so that the
+ * keyboard focus ring appears *inside* the tab instead of around the tab.
+ * This is an example of how to make the text within the anchor tag look
+ * like non-anchor (normal) text.
+ */
+.CollapsiblePanelTab a {
+ color: black;
+ text-decoration: none;
+}
+
+/* This is an example of how to change the appearance of the panel tab that is
+ * currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ * from panels as the user clicks on the tabs within the CollapsiblePanel.
+ */
+.CollapsiblePanelOpen .CollapsiblePanelTab {
+ background:url(col-open-back.gif) no-repeat;
+}
+
+/* This is an example of how to change the appearance of the panel tab as the
+ * mouse hovers over it. The class "CollapsiblePanelTabHover" is programatically added
+ * and removed from panel tab containers as the mouse enters and exits the tab container.
+ */
+.CollapsiblePanelTabHover {
+ background:url(col-close-hover.gif) no-repeat;
+ color:#FFF;
+}
+
+.CollapsiblePanelOpen .CollapsiblePanelTabHover {
+ background:url(col-open-hover.gif) no-repeat;
+ color:#FFF;
+}
+
+/* This is an example of how to change the appearance of all the panel tabs when the
+ * CollapsiblePanel has focus. The "CollapsiblePanelFocused" class is programatically added and removed
+ * whenever the CollapsiblePanel gains or loses keyboard focus.
+ */
+.CollapsiblePanelFocused .CollapsiblePanelTab {
+
+}
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js"
new file mode 100644
index 0000000..52440f9
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js"
@@ -0,0 +1,465 @@
+/* SpryCollapsiblePanel.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.CollapsiblePanel = function(element, opts)
+{
+ this.init(element);
+
+ Spry.Widget.CollapsiblePanel.setOptions(this, opts);
+
+ this.attachBehaviors();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.init = function(element)
+{
+ this.element = this.getElement(element);
+ this.focusElement = null;
+ this.hoverClass = "CollapsiblePanelTabHover";
+ this.openClass = "CollapsiblePanelOpen";
+ this.closedClass = "CollapsiblePanelClosed";
+ this.focusedClass = "CollapsiblePanelFocused";
+ this.enableAnimation = true;
+ this.enableKeyboardNavigation = true;
+ this.animator = null;
+ this.hasFocus = false;
+ this.contentIsOpen = true;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.CollapsiblePanel.prototype.hasClassName = function(ele, className)
+{
+ if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)
+ return false;
+ return true;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.setDisplay = function(ele, display)
+{
+ if( ele )
+ ele.style.display = display;
+};
+
+Spry.Widget.CollapsiblePanel.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabMouseOver = function()
+{
+ this.addClassName(this.getTab(), this.hoverClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabMouseOut = function()
+{
+ this.removeClassName(this.getTab(), this.hoverClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.open = function()
+{
+ this.contentIsOpen = true;
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, true);
+ this.animator.start();
+ }
+ else
+ this.setDisplay(this.getContent(), "block");
+
+ this.removeClassName(this.element, this.closedClass);
+ this.addClassName(this.element, this.openClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.close = function()
+{
+ this.contentIsOpen = false;
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, false);
+ this.animator.start();
+ }
+ else
+ this.setDisplay(this.getContent(), "none");
+
+ this.removeClassName(this.element, this.openClass);
+ this.addClassName(this.element, this.closedClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabClick = function()
+{
+ if (this.isOpen())
+ this.close();
+ else
+ this.open();
+ this.focus();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onFocus = function(e)
+{
+ this.hasFocus = true;
+ this.addClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onBlur = function(e)
+{
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.CollapsiblePanel.ENTER_KEY = 13;
+Spry.Widget.CollapsiblePanel.SPACE_KEY = 32;
+
+Spry.Widget.CollapsiblePanel.prototype.onKeyDown = function(e)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != Spry.Widget.CollapsiblePanel.ENTER_KEY && key != Spry.Widget.CollapsiblePanel.SPACE_KEY))
+ return true;
+
+ if (this.isOpen())
+ this.close();
+ else
+ this.open();
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.attachPanelHandlers = function()
+{
+ var tab = this.getTab();
+ if (!tab)
+ return;
+
+ var self = this;
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "click", function(e) { return self.onTabClick(); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(); }, false);
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ // Find the first element within the tab container that has a tabindex or the first
+ // anchor tag.
+
+ var tabIndexEle = null;
+ var tabAnchorEle = null;
+
+ this.preorderTraversal(tab, function(node) {
+ if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
+ {
+ var tabIndexAttr = tab.attributes.getNamedItem("tabindex");
+ if (tabIndexAttr)
+ {
+ tabIndexEle = node;
+ return true;
+ }
+ if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")
+ tabAnchorEle = node;
+ }
+ return false;
+ });
+
+ if (tabIndexEle)
+ this.focusElement = tabIndexEle;
+ else if (tabAnchorEle)
+ this.focusElement = tabAnchorEle;
+
+ if (this.focusElement)
+ {
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "focus", function(e) { return self.onFocus(e); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "blur", function(e) { return self.onBlur(e); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "keydown", function(e) { return self.onKeyDown(e); }, false);
+ }
+ }
+};
+
+Spry.Widget.CollapsiblePanel.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.CollapsiblePanel.prototype.preorderTraversal = function(root, func)
+{
+ var stopTraversal = false;
+ if (root)
+ {
+ stopTraversal = func(root);
+ if (root.hasChildNodes())
+ {
+ var child = root.firstChild;
+ while (!stopTraversal && child)
+ {
+ stopTraversal = this.preorderTraversal(child, func);
+ try { child = child.nextSibling; } catch (e) { child = null; }
+ }
+ }
+ }
+ return stopTraversal;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.attachBehaviors = function()
+{
+ var panel = this.element;
+ var tab = this.getTab();
+ var content = this.getContent();
+
+ if (this.contentIsOpen || this.hasClassName(panel, this.openClass))
+ {
+ this.removeClassName(panel, this.closedClass);
+ this.setDisplay(content, "block");
+ this.contentIsOpen = true;
+ }
+ else
+ {
+ this.removeClassName(panel, this.openClass);
+ this.addClassName(panel, this.closedClass);
+ this.setDisplay(content, "none");
+ this.contentIsOpen = false;
+ }
+
+ this.attachPanelHandlers();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getTab = function()
+{
+ return this.getElementChildren(this.element)[0];
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getContent = function()
+{
+ return this.getElementChildren(this.element)[1];
+};
+
+Spry.Widget.CollapsiblePanel.prototype.isOpen = function()
+{
+ return this.contentIsOpen;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.focus = function()
+{
+ if (this.focusElement && this.focusElement.focus)
+ this.focusElement.focus();
+};
+
+/////////////////////////////////////////////////////
+
+Spry.Widget.CollapsiblePanel.PanelAnimator = function(panel, doOpen, opts)
+{
+ this.timer = null;
+ this.interval = 0;
+ this.stepCount = 0;
+
+ this.fps = 0;
+ this.steps = 10;
+ this.duration = 500;
+ this.onComplete = null;
+
+ this.panel = panel;
+ this.content = panel.getContent();
+ this.panelData = [];
+ this.doOpen = doOpen;
+
+ Spry.Widget.CollapsiblePanel.setOptions(this, opts);
+
+
+ // If caller specified speed in terms of frames per second,
+ // convert them into steps.
+
+ if (this.fps > 0)
+ {
+ this.interval = Math.floor(1000 / this.fps);
+ this.steps = parseInt((this.duration + (this.interval - 1)) / this.interval);
+ }
+ else if (this.steps > 0)
+ this.interval = this.duration / this.steps;
+
+ var c = this.content;
+
+ var curHeight = c.offsetHeight ? c.offsetHeight : 0;
+
+ if (doOpen && c.style.display == "none")
+ this.fromHeight = 0;
+ else
+ this.fromHeight = curHeight;
+
+ if (!doOpen)
+ this.toHeight = 0;
+ else
+ {
+ if (c.style.display == "none")
+ {
+ // The content area is not displayed so in order to calculate the extent
+ // of the content inside it, we have to set its display to block.
+
+ c.style.visibility = "hidden";
+ c.style.display = "block";
+ }
+
+ // Unfortunately in Mozilla/Firefox, fetching the offsetHeight seems to cause
+ // the browser to synchronously re-layout and re-display content on the page,
+ // so we see a brief flash of content that is *after* the panel being positioned
+ // where it should when the panel is fully expanded. To get around this, we
+ // temporarily position the content area of the panel absolutely off-screen.
+ // This has the effect of taking the content out-of-flow, so nothing shifts around.
+
+ // var oldPos = c.style.position;
+ // var oldLeft = c.style.left;
+ // c.style.position = "absolute";
+ // c.style.left = "-2000em";
+
+ // Clear the height property so we can calculate
+ // the full height of the content we are going to show.
+ c.style.height = "";
+ this.toHeight = c.offsetHeight;
+
+ // Now restore the position and offset to what it was!
+ // c.style.position = oldPos;
+ // c.style.left = oldLeft;
+ }
+
+ this.increment = (this.toHeight - this.fromHeight) / this.steps;
+ this.overflow = c.style.overflow;
+
+ c.style.height = this.fromHeight + "px";
+ c.style.visibility = "visible";
+ c.style.overflow = "hidden";
+ c.style.display = "block";
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.start = function()
+{
+ var self = this;
+ this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stop = function()
+{
+ if (this.timer)
+ {
+ clearTimeout(this.timer);
+
+ // If we're killing the timer, restore the overflow
+ // properties on the panels we were animating!
+
+ if (this.stepCount < this.steps)
+ this.content.style.overflow = this.overflow;
+ }
+
+ this.timer = null;
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stepAnimation = function()
+{
+ ++this.stepCount;
+
+ this.animate();
+
+ if (this.stepCount < this.steps)
+ this.start();
+ else if (this.onComplete)
+ this.onComplete();
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.animate = function()
+{
+ if (this.stepCount >= this.steps)
+ {
+ if (!this.doOpen)
+ this.content.style.display = "none";
+ this.content.style.overflow = this.overflow;
+ this.content.style.height = this.toHeight + "px";
+ }
+ else
+ {
+ this.fromHeight += this.increment;
+ this.content.style.height = this.fromHeight + "px";
+ }
+};
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..725d5f9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif"
new file mode 100644
index 0000000..46416d6
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif"
new file mode 100644
index 0000000..89d0f03
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif"
new file mode 100644
index 0000000..059f17b
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif"
new file mode 100644
index 0000000..9f03ac9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db"
new file mode 100644
index 0000000..a939b62
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm"
new file mode 100644
index 0000000..da9a333
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm"
@@ -0,0 +1,56 @@
+
+
+
+
+折叠面板
+
+
+
+
+
+
+
+
Learning CSS is Funny
+
+ An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panels as the user clicks on the tabs within the CollapsiblePanel.
+
+
+
+
+
Collapsible Panel is Funny
+
+ The name of the class (" Collapsible Panel Content") used in this selector is not necessary
+ to make the widget function. You can use any class name you want to style a
+ CollapsiblePanel content container.
+
+
+
+
+
CSS is Great
+
+ The name of the class (" Collapsible Panel Content") used in this selector is not necessary
+ to make the widget function. You can use any class name you want to style a
+ CollapsiblePanel content container.
+
+
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif"
new file mode 100644
index 0000000..0db0cf9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css"
new file mode 100644
index 0000000..a19096b
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css"
@@ -0,0 +1,114 @@
+@charset "UTF-8";
+
+/* SpryAccordion.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* This is the selector for the main Accordion container. For our default style,
+ * we draw borders on the left, right, and bottom. The top border of the Accordion
+ * will be rendered by the first AccordionPanelTab which never moves.
+ *
+ * If you want to constrain the width of the Accordion widget, set a width on
+ * the Accordion container. By default, our accordion expands horizontally to fill
+ * up available space.
+ *
+ * The name of the class ("Accordion") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style the
+ * Accordion container.
+ */
+.Accordion {
+ width:300px;
+ overflow: hidden;
+ border-bottom:2px #006 solid;
+}
+
+/* This is the selector for the AccordionPanel container which houses the
+ * panel tab and a panel content area. It doesn't render visually, but we
+ * make sure that it has zero margin and padding.
+ *
+ * The name of the class ("AccordionPanel") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel container.
+*/
+.AccordionPanel {
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the AccordionPanelTab. This container houses
+ * the title for the panel. This is also the container that the user clicks
+ * on to open a specific panel.
+ *
+ * The name of the class ("AccordionPanelTab") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel tab container.
+ */
+.AccordionPanelTab {
+ background: url(ac-open-back.gif) no-repeat;
+ font: bold 16px Arial;
+ color:#006;
+ line-height:30px;
+ height:30px;
+ margin: 0px;
+ padding: 0px 30px;
+ cursor: pointer;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.top{
+ background: url(ac-open-back-top.gif) no-repeat;
+}
+
+/* This is the selector for a Panel's Content area. It's important to note that
+ * you should never put any padding on the panel's content area if you plan to
+ * use the Accordions panel animations. Placing a non-zero padding on the content
+ * area can cause the accordion to abruptly grow in height while the panels animate.
+ *
+ * Anyone who styles an Accordion *MUST* specify a height on the Accordion Panel
+ * Content container.
+ *
+ * The name of the class ("AccordionPanelContent") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel content container.
+ */
+.AccordionPanelContent {
+ background:#ADF;
+ font:12px/18px Arial;
+ overflow: auto;
+ margin: 0px;
+ padding: 0 10px;
+ height: 230px;
+ border-left:2px #006 solid;
+ border-right:2px #006 solid;
+}
+
+.AccordionPanelContent img{
+ float:left;
+ padding:2px;
+ margin:2px;
+ border:1px #aaa dashed;
+ }
+
+/* This is an example of how to change the appearance of the panel tab that is
+ * currently open. The class "AccordionPanelOpen" is programatically added and removed
+ * from panels as the user clicks on the tabs within the Accordion.
+ */
+.AccordionPanelOpen .AccordionPanelTab {
+ background: url(ac-open-back-open.gif) no-repeat;
+}
+
+.AccordionPanelOpen .top {
+ background: url(ac-open-back-top-open.gif) no-repeat;
+}
+
+/* This is an example of how to change the appearance of the panel tab as the
+ * mouse hovers over it. The class "AccordionPanelTabHover" is programatically added
+ * and removed from panel tab containers as the mouse enters and exits the tab container.
+ */
+
+/* This is an example of how to change the appearance of all the panel tabs when the
+ * Accordion has focus. The "AccordionFocused" class is programatically added and removed
+ * whenever the Accordion gains or loses keyboard focus.
+ */
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js"
new file mode 100644
index 0000000..e74390d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js"
@@ -0,0 +1,526 @@
+/* SpryAccordion.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.Accordion = function(element, opts)
+{
+ this.element = this.getElement(element);
+ this.defaultPanel = 0;
+ this.hoverClass = "AccordionPanelTabHover";
+ this.openClass = "AccordionPanelOpen";
+ this.closedClass = "AccordionPanelClosed";
+ this.focusedClass = "AccordionFocused";
+ this.enableAnimation = true;
+ this.enableKeyboardNavigation = true;
+ this.currentPanel = null;
+ this.animator = null;
+ this.hasFocus = null;
+ this.duration = 500;
+
+ this.previousPanelKeyCode = Spry.Widget.Accordion.KEY_UP;
+ this.nextPanelKeyCode = Spry.Widget.Accordion.KEY_DOWN;
+
+ this.useFixedPanelHeights = true;
+ this.fixedPanelHeight = 0;
+
+ Spry.Widget.Accordion.setOptions(this, opts, true);
+
+ // Unfortunately in some browsers like Safari, the Stylesheets our
+ // page depends on may not have been loaded at the time we are called.
+ // This means we have to defer attaching our behaviors until after the
+ // onload event fires, since some of our behaviors rely on dimensions
+ // specified in the CSS.
+
+ if (Spry.Widget.Accordion.onloadDidFire)
+ this.attachBehaviors();
+ else
+ Spry.Widget.Accordion.loadQueue.push(this);
+};
+
+Spry.Widget.Accordion.onloadDidFire = false;
+Spry.Widget.Accordion.loadQueue = [];
+
+Spry.Widget.Accordion.addLoadListener = function(handler)
+{
+ if (typeof window.addEventListener != 'undefined')
+ window.addEventListener('load', handler, false);
+ else if (typeof document.addEventListener != 'undefined')
+ document.addEventListener('load', handler, false);
+ else if (typeof window.attachEvent != 'undefined')
+ window.attachEvent('onload', handler);
+};
+
+Spry.Widget.Accordion.processLoadQueue = function(handler)
+{
+ Spry.Widget.Accordion.onloadDidFire = true;
+ var q = Spry.Widget.Accordion.loadQueue;
+ var qlen = q.length;
+ for (var i = 0; i < qlen; i++)
+ q[i].attachBehaviors();
+};
+
+Spry.Widget.Accordion.addLoadListener(Spry.Widget.Accordion.processLoadQueue);
+
+Spry.Widget.Accordion.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+};
+
+Spry.Widget.Accordion.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.Accordion.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.Accordion.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.Accordion.prototype.onPanelTabMouseOver = function(panel)
+{
+ if (panel)
+ this.addClassName(this.getPanelTab(panel), this.hoverClass);
+};
+
+Spry.Widget.Accordion.prototype.onPanelTabMouseOut = function(panel)
+{
+ if (panel)
+ this.removeClassName(this.getPanelTab(panel), this.hoverClass);
+};
+
+Spry.Widget.Accordion.prototype.openPanel = function(panel)
+{
+ var panelA = this.currentPanel;
+ var panelB = panel;
+
+ if (!panelB || panelA == panelB)
+ return;
+
+ var contentA;
+ if( panelA )
+ contentA = this.getPanelContent(panelA);
+ var contentB = this.getPanelContent(panelB);
+
+ if (! contentB)
+ return;
+
+ if (this.useFixedPanelHeights && !this.fixedPanelHeight)
+ {
+ this.fixedPanelHeight = (contentA.offsetHeight) ? contentA.offsetHeight : contentA.scrollHeight;
+ }
+
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.Accordion.PanelAnimator(this, panelB, { duration: this.duration });
+ this.animator.start();
+ }
+ else
+ {
+ if(contentA)
+ contentA.style.height = "0px";
+ contentB.style.height = (this.useFixedPanelHeights ? this.fixedPanelHeight : contentB.scrollHeight) + "px";
+ }
+
+ if(panelA)
+ {
+ this.removeClassName(panelA, this.openClass);
+ this.addClassName(panelA, this.closedClass);
+ }
+
+ this.removeClassName(panelB, this.closedClass);
+ this.addClassName(panelB, this.openClass);
+
+ this.currentPanel = panelB;
+};
+
+Spry.Widget.Accordion.prototype.openNextPanel = function()
+{
+ var panels = this.getPanels();
+ var curPanelIndex = this.getCurrentPanelIndex();
+
+ if( panels && curPanelIndex >= 0 && (curPanelIndex+1) < panels.length )
+ this.openPanel(panels[curPanelIndex+1]);
+};
+
+Spry.Widget.Accordion.prototype.openPreviousPanel = function()
+{
+ var panels = this.getPanels();
+ var curPanelIndex = this.getCurrentPanelIndex();
+
+ if( panels && curPanelIndex > 0 && curPanelIndex < panels.length )
+ this.openPanel(panels[curPanelIndex-1]);
+};
+
+Spry.Widget.Accordion.prototype.openFirstPanel = function()
+{
+ var panels = this.getPanels();
+ if( panels )
+ this.openPanel(panels[0]);
+};
+
+Spry.Widget.Accordion.prototype.openLastPanel = function()
+{
+ var panels = this.getPanels();
+ if( panels )
+ this.openPanel(panels[panels.length-1]);
+};
+
+Spry.Widget.Accordion.prototype.onPanelClick = function(panel)
+{
+ // if (this.enableKeyboardNavigation)
+ // this.element.focus();
+ if (panel != this.currentPanel)
+ this.openPanel(panel);
+ this.focus();
+};
+
+Spry.Widget.Accordion.prototype.onFocus = function(e)
+{
+ // this.element.focus();
+ this.hasFocus = true;
+ this.addClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.Accordion.prototype.onBlur = function(e)
+{
+ // this.element.blur();
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.Accordion.KEY_UP = 38;
+Spry.Widget.Accordion.KEY_DOWN = 40;
+
+Spry.Widget.Accordion.prototype.onKeyDown = function(e)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != this.previousPanelKeyCode && key != this.nextPanelKeyCode))
+ return true;
+
+ var panels = this.getPanels();
+ if (!panels || panels.length < 1)
+ return false;
+ var currentPanel = this.currentPanel ? this.currentPanel : panels[0];
+ var nextPanel = (key == this.nextPanelKeyCode) ? currentPanel.nextSibling : currentPanel.previousSibling;
+
+ while (nextPanel)
+ {
+ if (nextPanel.nodeType == 1 /* Node.ELEMENT_NODE */)
+ break;
+ nextPanel = (key == this.nextPanelKeyCode) ? nextPanel.nextSibling : nextPanel.previousSibling;
+ }
+
+ if (nextPanel && currentPanel != nextPanel)
+ this.openPanel(nextPanel);
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.Accordion.prototype.attachPanelHandlers = function(panel)
+{
+ if (!panel)
+ return;
+
+ var tab = this.getPanelTab(panel);
+
+ if (tab)
+ {
+ var self = this;
+ Spry.Widget.Accordion.addEventListener(tab, "click", function(e) { return self.onPanelClick(panel); }, false);
+ Spry.Widget.Accordion.addEventListener(tab, "mouseover", function(e) { return self.onPanelTabMouseOver(panel); }, false);
+ Spry.Widget.Accordion.addEventListener(tab, "mouseout", function(e) { return self.onPanelTabMouseOut(panel); }, false);
+ }
+};
+
+Spry.Widget.Accordion.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.Accordion.prototype.initPanel = function(panel, isDefault)
+{
+ var content = this.getPanelContent(panel);
+ if (isDefault)
+ {
+ this.currentPanel = panel;
+ this.removeClassName(panel, this.closedClass);
+ this.addClassName(panel, this.openClass);
+ }
+ else
+ {
+ this.removeClassName(panel, this.openClass);
+ this.addClassName(panel, this.closedClass);
+ content.style.height = "0px";
+ }
+
+ this.attachPanelHandlers(panel);
+};
+
+Spry.Widget.Accordion.prototype.attachBehaviors = function()
+{
+ var panels = this.getPanels();
+ for (var i = 0; i < panels.length; i++)
+ {
+ this.initPanel(panels[i], i == this.defaultPanel);
+ }
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ var tabIndexAttr = this.element.attributes.getNamedItem("tabindex");
+ // if (!tabIndexAttr) this.element.tabindex = 0;
+ if (tabIndexAttr)
+ {
+ var self = this;
+ Spry.Widget.Accordion.addEventListener(this.element, "focus", function(e) { return self.onFocus(e); }, false);
+ Spry.Widget.Accordion.addEventListener(this.element, "blur", function(e) { return self.onBlur(e); }, false);
+ Spry.Widget.Accordion.addEventListener(this.element, "keydown", function(e) { return self.onKeyDown(e); }, false);
+ }
+ }
+};
+
+Spry.Widget.Accordion.prototype.getPanels = function()
+{
+ return this.getElementChildren(this.element);
+};
+
+Spry.Widget.Accordion.prototype.getCurrentPanel = function()
+{
+ return this.currentPanel;
+};
+
+Spry.Widget.Accordion.prototype.getCurrentPanelIndex = function()
+{
+ var panels = this.getPanels();
+ for( var i = 0 ; i < panels.length; i++ )
+ {
+ if( this.currentPanel == panels[i] )
+ return i;
+ }
+ return 0;
+};
+
+Spry.Widget.Accordion.prototype.getPanelTab = function(panel)
+{
+ if (!panel)
+ return null;
+ return this.getElementChildren(panel)[0];
+};
+
+Spry.Widget.Accordion.prototype.getPanelContent = function(panel)
+{
+ if (!panel)
+ return null;
+ return this.getElementChildren(panel)[1];
+};
+
+Spry.Widget.Accordion.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.Accordion.prototype.focus = function()
+{
+ if (this.element && this.element.focus)
+ this.element.focus();
+};
+
+/////////////////////////////////////////////////////
+
+Spry.Widget.Accordion.PanelAnimator = function(accordion, panel, opts)
+{
+ this.timer = null;
+ this.interval = 0;
+ this.stepCount = 0;
+
+ this.fps = 0;
+ this.steps = 10;
+ this.duration = 500;
+ this.onComplete = null;
+
+ this.panel = panel;
+ this.panelToOpen = accordion.getElement(panel);
+ this.panelData = [];
+
+ Spry.Widget.Accordion.setOptions(this, opts, true);
+
+
+ // If caller specified speed in terms of frames per second,
+ // convert them into steps.
+
+ if (this.fps > 0)
+ {
+ this.interval = Math.floor(1000 / this.fps);
+ this.steps = parseInt((this.duration + (this.interval - 1)) / this.interval);
+ }
+ else if (this.steps > 0)
+ this.interval = this.duration / this.steps;
+
+ // Set up the array of panels we want to animate.
+
+ var panels = accordion.getPanels();
+ for (var i = 0; i < panels.length; i++)
+ {
+ var p = panels[i];
+ var c = accordion.getPanelContent(p);
+ if (c)
+ {
+ var h = c.offsetHeight;
+ if (h == undefined)
+ h = 0;
+ if (p == panel || h > 0)
+ {
+ var obj = new Object;
+ obj.panel = p;
+ obj.content = c;
+ obj.fromHeight = h;
+ obj.toHeight = (p == panel) ? (accordion.useFixedPanelHeights ? accordion.fixedPanelHeight : c.scrollHeight) : 0;
+ obj.increment = (obj.toHeight - obj.fromHeight) / this.steps;
+ obj.overflow = c.style.overflow;
+ this.panelData.push(obj);
+
+ c.style.overflow = "hidden";
+ c.style.height = h + "px";
+ }
+ }
+ }
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.start = function()
+{
+ var self = this;
+ this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.stop = function()
+{
+ if (this.timer)
+ {
+ clearTimeout(this.timer);
+
+ // If we're killing the timer, restore the overflow
+ // properties on the panels we were animating!
+
+ if (this.stepCount < this.steps)
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ obj.content.style.overflow = obj.overflow;
+ }
+ }
+ }
+
+ this.timer = null;
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.stepAnimation = function()
+{
+ ++this.stepCount;
+
+ this.animate();
+
+ if (this.stepCount < this.steps)
+ this.start();
+ else if (this.onComplete)
+ this.onComplete();
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.animate = function()
+{
+ var i, obj;
+
+ if (this.stepCount >= this.steps)
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ if (obj.panel != this.panel)
+ obj.content.style.height = "0px";
+ obj.content.style.overflow = obj.overflow;
+ obj.content.style.height = obj.toHeight + "px";
+ }
+ }
+ else
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ obj.fromHeight += obj.increment;
+ obj.content.style.height = obj.fromHeight + "px";
+ }
+ }
+};
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..619aa3c
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif"
new file mode 100644
index 0000000..d5aad98
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif"
new file mode 100644
index 0000000..8b295ee
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif"
new file mode 100644
index 0000000..37bea12
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif"
new file mode 100644
index 0000000..06686a6
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif"
new file mode 100644
index 0000000..9f7c0f1
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm"
new file mode 100644
index 0000000..4f855ab
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm"
@@ -0,0 +1,54 @@
+
+
+
+
+伸缩面板
+
+
+
+
+
+
+
+
Home
+
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panel.
+
+
+
+
Web Design
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Web Dev
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Map
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panel.
+
+
+
+
Web Design
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Web Dev
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Map
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/cup.gif" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/cup.gif"
new file mode 100644
index 0000000..0db0cf9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/cup.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\233\276\347\211\207\345\273\266\350\277\237\345\212\240\350\275\275_\350\200\277/1offsetLeft\345\222\214offsetTop.html" "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\233\276\347\211\207\345\273\266\350\277\237\345\212\240\350\275\275_\350\200\277/1offsetLeft\345\222\214offsetTop.html"
new file mode 100644
index 0000000..408fd22
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\270\211\345\221\250\345\233\276\347\211\207\345\273\266\350\277\237\345\212\240\350\275\275_\350\200\277/1offsetLeft\345\222\214offsetTop.html"
@@ -0,0 +1,47 @@
+
+
+
+
+无标题文档
+
+
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo11-\347\275\221\351\241\265\346\215\242\350\202\244/js/jquery.cookie.js" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo11-\347\275\221\351\241\265\346\215\242\350\202\244/js/jquery.cookie.js"
new file mode 100644
index 0000000..6df1fac
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo11-\347\275\221\351\241\265\346\215\242\350\202\244/js/jquery.cookie.js"
@@ -0,0 +1,96 @@
+/**
+ * Cookie plugin
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+/**
+ * Create a cookie with the given name and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
+ * used when the cookie was set.
+ *
+ * @param String name The name of the cookie.
+ * @param String value The value of the cookie.
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
+ * when the the browser exits.
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+ * require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given name.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param String name The name of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function(name, value, options) {
+ if (typeof value != 'undefined') { // name and value given, set cookie
+ options = options || {};
+ if (value === null) {
+ value = '';
+ options.expires = -1;
+ }
+ var expires = '';
+ if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
+ var date;
+ if (typeof options.expires == 'number') {
+ date = new Date();
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
+ } else {
+ date = options.expires;
+ }
+ expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
+ }
+ // CAUTION: Needed to parenthesize options.path and options.domain
+ // in the following expressions, otherwise they evaluate to undefined
+ // in the packed version for some reason...
+ var path = options.path ? '; path=' + (options.path) : '';
+ var domain = options.domain ? '; domain=' + (options.domain) : '';
+ var secure = options.secure ? '; secure' : '';
+ document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
+ } else { // only name given, get cookie
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = jQuery.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+};
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-1\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-1\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html"
new file mode 100644
index 0000000..3c72067
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-1\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html"
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-2\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-2\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html"
new file mode 100644
index 0000000..11e815f
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo1-2\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226.html"
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo2-\346\226\207\346\234\254\346\241\206\345\206\205\345\256\271\346\273\232\345\212\250.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo2-\346\226\207\346\234\254\346\241\206\345\206\205\345\256\271\346\273\232\345\212\250.html"
new file mode 100644
index 0000000..f0fa010
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo2-\345\244\232\350\241\214\346\226\207\346\234\254\346\241\206\351\253\230\345\272\246\345\217\230\345\214\226/demo2-\346\226\207\346\234\254\346\241\206\345\206\205\345\256\271\346\273\232\345\212\250.html"
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo1.html"
new file mode 100644
index 0000000..6b11f63
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo1.html"
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo2.html"
new file mode 100644
index 0000000..335db0d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo2.html"
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo3.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo3.html"
new file mode 100644
index 0000000..25402a9
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo3-\345\244\215\351\200\211\346\241\206\345\205\250\351\200\211\345\217\215\351\200\211/demo3.html"
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo4-\344\270\213\346\213\211\346\241\206\345\267\246\345\217\263\351\200\211\346\213\251/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo4-\344\270\213\346\213\211\346\241\206\345\267\246\345\217\263\351\200\211\346\213\251/demo1.html"
new file mode 100644
index 0000000..cce8839
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo4-\344\270\213\346\213\211\346\241\206\345\267\246\345\217\263\351\200\211\346\213\251/demo1.html"
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选中添加到右边>>
+ 全部添加到右边>>
+
+
+
+
+
+
+ <<选中删除到左边
+ <<全部删除到左边
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/css/style.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/css/style.css"
new file mode 100644
index 0000000..4aaa247
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/css/style.css"
@@ -0,0 +1,18 @@
+body { font:12px/19px Arial, Helvetica, sans-serif; color:#666;}
+form div { margin:5px 0;}
+.int label { float:left; width:100px; text-align:right;}
+.int input { padding:1px 1px; border:1px solid #ccc;height:16px;}
+.sub { padding-left:100px;}
+.sub input { margin-right:10px; }
+.formtips{width: 200px;margin:2px;padding:2px;}
+.onError{
+ background:#FFE0E9 url(../img/reg3.gif) no-repeat 0 center;
+ padding-left:25px;
+}
+.onSuccess{
+ background:#E9FBEB url(../img/reg4.gif) no-repeat 0 center;
+ padding-left:25px;
+}
+.high{
+ color:red;
+}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo1.html"
new file mode 100644
index 0000000..55f2dd5
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo1.html"
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo2.html"
new file mode 100644
index 0000000..391cc2d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo2.html"
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo3.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo3.html"
new file mode 100644
index 0000000..e14f090
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo3.html"
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo4.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo4.html"
new file mode 100644
index 0000000..e865189
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo4.html"
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo5.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo5.html"
new file mode 100644
index 0000000..f487c3a
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo5.html"
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo6.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo6.html"
new file mode 100644
index 0000000..b4eb35a
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/demo6.html"
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg3.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg3.gif"
new file mode 100644
index 0000000..e1b6bdb
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg3.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg4.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg4.gif"
new file mode 100644
index 0000000..2c69c4a
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo5-\350\241\250\345\215\225\351\252\214\350\257\201/img/reg4.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/css/style.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/css/style.css"
new file mode 100644
index 0000000..385dc46
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/css/style.css"
@@ -0,0 +1,6 @@
+table { border:0;border-collapse:collapse;}
+td { font:normal 12px/17px Arial;padding:2px;width:100px;}
+th { font:bold 12px/17px Arial;text-align:left;padding:4px;border-bottom:1px solid #333;}
+.even { background:#FFF38F;} /* 偶数行样式*/
+.odd { background:#FFFFEE;} /* 奇数行样式*/
+.selected { background:#FF6500;color:#fff;}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo1.html"
new file mode 100644
index 0000000..637ecee
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo1.html"
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo2.html"
new file mode 100644
index 0000000..e79a744
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo2.html"
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo3.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo3.html"
new file mode 100644
index 0000000..775bbd3
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo3.html"
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo4.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo4.html"
new file mode 100644
index 0000000..acd8e8d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo4.html"
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
+
ɽ
㽭
+
+
Ů
㽭
+
+
ϳɳ
+
+
㽭
+
+
Rain
㽭
+
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo5.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo5.html"
new file mode 100644
index 0000000..d08c328
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo5.html"
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
+
ɽ
㽭
+
+
Ů
㽭
+
+
ϳɳ
+
+
㽭
+
+
Rain
㽭
+
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo6.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo6.html"
new file mode 100644
index 0000000..932c3ae
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo6-\350\241\250\346\240\274\345\217\230\350\211\262/demo6.html"
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
+
ɽ
㽭
+
+
Ů
㽭
+
+
ϳɳ
+
+
㽭
+
+
Rain
㽭
+
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/css/style.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/css/style.css"
new file mode 100644
index 0000000..f083036
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/css/style.css"
@@ -0,0 +1,6 @@
+table { border:0;border-collapse:collapse;}
+td { font:normal 12px/17px Arial;padding:2px;width:100px;}
+th { font:bold 12px/17px Arial;text-align:left;padding:4px;border-bottom:1px solid #333;width:100px;}
+.parent { background:#FFF38F;cursor:pointer;} /* 偶数行样式*/
+.odd { background:#FFFFEE;} /* 奇数行样式*/
+.selected { background:#FF6500;color:#fff;}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo1.html"
new file mode 100644
index 0000000..19095b4
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo1.html"
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ǰ̨
+
ɽ
㽭
+
Ů
㽭
+
+
ǰ̨
+
ϳɳ
+
㽭
+
+
̨
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo2.html"
new file mode 100644
index 0000000..319ee10
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo7-\350\241\250\346\240\274\345\261\225\345\274\200\344\274\270\347\274\251/demo2.html"
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ǰ̨
+
ɽ
㽭
+
Ů
㽭
+
+
ǰ̨
+
ϳɳ
+
㽭
+
+
̨
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/css/style.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/css/style.css"
new file mode 100644
index 0000000..b7cd915
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/css/style.css"
@@ -0,0 +1,7 @@
+table { border:0;border-collapse:collapse;}
+div{font:normal 12px/17px Arial;}
+td { font:normal 12px/17px Arial;padding:2px;width:100px;}
+th { font:bold 12px/17px Arial;text-align:left;padding:4px;border-bottom:1px solid #333;width:100px;}
+.even { background:#FFF38F;} /* 偶数行样式*/
+.odd { background:#FFFFEE;} /* 奇数行样式*/
+.selected { background:#FF6500;color:#fff;}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo1.html"
new file mode 100644
index 0000000..34e933d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo1.html"
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
㽭
+
Ů
㽭
+
ϳɳ
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo2.html"
new file mode 100644
index 0000000..87695c5
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo2.html"
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ɸѡ
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
㽭
+
Ů
㽭
+
ϳɳ
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo3.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo3.html"
new file mode 100644
index 0000000..7c282d5
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo8-\350\241\250\346\240\274\345\206\205\345\256\271\350\277\207\346\273\244/demo3.html"
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ɸѡ
+
+
+
+
+
+
+
+
Ա
ס
+
+
+
ɽ
㽭
+
Ů
㽭
+
ϳɳ
+
㽭
+
Rain
㽭
+
MAXMAN
Ů
㽭
+
㽭
+
Ů
㽭
+
ϳɳ
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/css/style.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/css/style.css"
new file mode 100644
index 0000000..c1440aa
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/css/style.css"
@@ -0,0 +1,5 @@
+* { margin:0; padding:0; }
+.msg {width:300px; margin:100px; }
+.msg_caption { width:100%; overflow:hidden; margin-bottom:1px;}
+.msg_caption span { display:block; float:left; margin:0 2px; padding:4px 10px; background:#898989; cursor:pointer;font-size:12px;color:white; }
+.msg textarea{ width:300px; height:80px;height:100px;border:1px solid #000;}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo1.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo1.html"
new file mode 100644
index 0000000..f25beef
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo1.html"
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 放大
+ 缩小
+
+
+
+ This is some text. This is some text. This is some text. This is some text. This
+ is some text. This is some text. This is some text. This is some text. This is some
+ text. This is some text. This is some text. This is some text. This is some text.
+ This is some text. This is some text. This is some text. This is some text. This
+ is some text. This is some text.
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo2.html" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo2.html"
new file mode 100644
index 0000000..d35c8e6
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/Ch5/demo9-\346\216\247\345\210\266\345\255\227\344\275\223\345\244\247\345\260\217/demo2.html"
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 放大
+ 缩小
+
+
+
+ This is some text. This is some text. This is some text. This is some text. This
+ is some text. This is some text. This is some text. This is some text. This is some
+ text. This is some text. This is some text. This is some text. This is some text.
+ This is some text. This is some text. This is some text. This is some text. This
+ is some text. This is some text.
+
+
+
+
+
+
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/scripts/jquery.js" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/scripts/jquery.js"
new file mode 100644
index 0000000..198b3ff
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\345\221\250\346\234\253/\351\224\213\345\210\251\347\232\204JQ \347\254\254\344\272\214\347\211\210\346\272\220\347\240\201/demo/scripts/jquery.js"
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
中的蓝色下边框 */
+ color:#000000;
+ background-color:#FFFFFF;
+}
+body#home li.home a:link, body#home li.home a:visited, /* 当前页面的菜单项的超链接 */
+body#dev li.dev a:link, body#dev li.dev a:visited,
+body#design li.design a:link, body#design li.design a:visited,
+body#map li.map a:link, body#map li.map a:visited{
+ color:#000000;
+ background-color:#FFFFFF;
+}
+body#home li.home a:hover, body#dev li.dev a:hover,
+body#design li.design a:hover, body#map li.map a:hover{
+ color:#006eb3;
+ text-decoration:underline;
+}
\ No newline at end of file
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css"
new file mode 100644
index 0000000..ac150c3
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.css"
@@ -0,0 +1,252 @@
+@charset "UTF-8";
+
+/* SpryTabbedPanels.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* Horizontal Tabbed Panels
+ *
+ * The default style for a TabbedPanels widget places all tab buttons
+ * (left aligned) above the content panel.
+ */
+
+/* This is the selector for the main TabbedPanels container. For our
+ * default style, this container does not contribute anything visually,
+ * but it is floated left to make sure that any floating or clearing done
+ * with any of its child elements are contained completely within the
+ * TabbedPanels container, to minimize any impact or undesireable
+ * interaction with other floated elements on the page that may be used
+ * for layout.
+ *
+ * If you want to constrain the width of the TabbedPanels widget, set a
+ * width on the TabbedPanels container. By default, the TabbedPanels widget
+ * expands horizontally to fill up available space.
+ *
+ * The name of the class ("TabbedPanels") used in this selector is not
+ * necessary to make the widget function. You can use any class name you
+ * want to style the TabbedPanels container.
+ */
+.TabbedPanels {
+ margin: 0px;
+ padding: 0px;
+ float: left;
+ clear: none;
+ width: 500px; /* IE Hack to force proper layout when preceded by a paragraph. (hasLayout Bug)*/
+}
+
+/* This is the selector for the TabGroup. The TabGroup container houses
+ * all of the tab buttons for each tabbed panel in the widget. This container
+ * does not contribute anything visually to the look of the widget for our
+ * default style.
+ *
+ * The name of the class ("TabbedPanelsTabGroup") used in this selector is not
+ * necessary to make the widget function. You can use any class name you
+ * want to style the TabGroup container.
+ javaScript
+ javascript
+ JAVASCRIPT
+ JavaScript
+ */
+.TabbedPanelsTabGroup {
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the TabbedPanelsTab. This container houses
+ * the title for the panel. This is also the tab "button" that the user clicks
+ * on to activate the corresponding content panel so that it appears on top
+ * of the other tabbed panels contained in the widget.
+ *
+ * For our default style, each tab is positioned relatively 1 pixel down from
+ * where it wold normally render. This allows each tab to overlap the content
+ * panel that renders below it. Each tab is rendered with a 1 pixel bottom
+ * border that has a color that matches the top border of the current content
+ * panel. This gives the appearance that the tab is being drawn behind the
+ * content panel.
+ *
+ * The name of the class ("TabbedPanelsTab") used in this selector is not
+ * necessary to make the widget function. You can use any class name you want
+ * to style this tab container.
+ */
+.TabbedPanelsTab {
+ display:block;
+ height:30px;
+ float: left;
+ position: relative;
+ top: 2px;
+ padding: 0px 0px 0px 15px;
+ margin: 0px 0px 0px 0px;
+ background:url('tab-back.gif') no-repeat;
+ list-style: none;
+ cursor: pointer;
+ color:#fff;
+ font: bold 14px Arial;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.TabbedPanelsTab span {
+ display:block;
+ background:url('tab-back.gif') right top no-repeat;
+ padding:7px 25px 7px 0;
+ margin:0px 0 0 0;
+}
+
+/* This selector is an example of how to change the appearnce of a tab button
+ * container as the mouse enters it. The class "TabbedPanelsTabHover" is
+ * programatically added and removed from the tab element as the mouse enters
+ * and exits the container.
+ */
+.TabbedPanelsTabHover {
+ background:url('tab-hover.gif') no-repeat;
+ color:#900;
+}
+
+.TabbedPanelsTabHover span {
+display:block;
+ background:url('tab-hover.gif') right top no-repeat;
+ padding:7px 25px 7px 0;
+}
+
+
+/* This selector is an example of how to change the appearance of a tab button
+ * container after the user has clicked on it to activate a content panel.
+ * The class "TabbedPanelsTabSelected" is programatically added and removed
+ * from the tab element as the user clicks on the tab button containers in
+ * the widget.
+ *
+ * As mentioned above, for our default style, tab buttons are positioned
+ * 1 pixel down from where it would normally render. When the tab button is
+ * selected, we change its bottom border to match the background color of the
+ * content panel so that it looks like the tab is part of the content panel.
+ */
+.TabbedPanelsTabSelected {
+ background:url('tab-current.gif') no-repeat;
+ color:#900;
+}
+
+.TabbedPanelsTabSelected span {
+display:block;
+ background:url('tab-current.gif') no-repeat right top;
+ padding:7px 25px 7px 0;
+ margin:0px 0 0 0;
+}
+
+
+/* This selector is an example of how to make a link inside of a tab button
+ * look like normal text. Users may want to use links inside of a tab button
+ * so that when it gets focus, the text *inside* the tab button gets a focus
+ * ring around it, instead of the focus ring around the entire tab.
+ */
+.TabbedPanelsTab a {
+ color: black;
+ text-decoration: none;
+}
+
+/* This is the selector for the ContentGroup. The ContentGroup container houses
+ * all of the content panels for each tabbed panel in the widget. For our
+ * default style, this container provides the background color and borders that
+ * surround the content.
+ *
+ * The name of the class ("TabbedPanelsContentGroup") used in this selector is
+ * not necessary to make the widget function. You can use any class name you
+ * want to style the ContentGroup container.
+ */
+.TabbedPanelsContentGroup {
+ clear: both;
+ border-left: solid 2px #900;
+ border-bottom: solid 2px #900;
+ border-top: solid 2px #900;
+ border-right: solid 2px #900;
+ background-color: #fff;
+}
+
+/* This is the selector for the Content panel. The Content panel holds the
+ * content for a single tabbed panel. For our default style, this container
+ * provides some padding, so that the content is not pushed up against the
+ * widget borders.
+ *
+ * The name of the class ("TabbedPanelsContent") used in this selector is
+ * not necessary to make the widget function. You can use any class name you
+ * want to style the Content container.
+ */
+.TabbedPanelsContent {
+ font:12px/18px Arial;
+ padding: 4px;
+}
+
+.TabbedPanelsContent img{
+float:right;
+ padding: 4px;
+ }
+
+/* This selector is an example of how to change the appearnce of the currently
+ * active container panel. The class "TabbedPanelsContentVisible" is
+ * programatically added and removed from the content element as the panel
+ * is activated/deactivated.
+ */
+.TabbedPanelsContentVisible {
+}
+
+/* Vertical Tabbed Panels
+ *
+ * The following rules override some of the default rules above so that the
+ * TabbedPanels widget renders with its tab buttons along the left side of
+ * the currently active content panel.
+ *
+ * With the rules defined below, the only change that will have to be made
+ * to switch a horizontal tabbed panels widget to a vertical tabbed panels
+ * widget, is to use the "VTabbedPanels" class on the top-level widget
+ * container element, instead of "TabbedPanels".
+ */
+
+/* This selector floats the TabGroup so that the tab buttons it contains
+ * render to the left of the active content panel. A border is drawn around
+ * the group container to make it look like a list container.
+ */
+.VTabbedPanels .TabbedPanelsTabGroup {
+ float: left;
+ width: 10em;
+ height: 20em;
+ background-color: #EEE;
+ position: relative;
+ border-top: solid 1px #999;
+ border-right: solid 1px #999;
+ border-left: solid 1px #CCC;
+ border-bottom: solid 1px #CCC;
+}
+
+/* This selector disables the float property that is placed on each tab button
+ * by the default TabbedPanelsTab selector rule above. It also draws a bottom
+ * border for the tab. The tab button will get its left and right border from
+ * the TabGroup, and its top border from the TabGroup or tab button above it.
+ */
+.VTabbedPanels .TabbedPanelsTab {
+ float: none;
+ margin: 0px;
+ border-top: none;
+ border-left: none;
+ border-right: none;
+}
+
+/* This selector disables the float property that is placed on each tab button
+ * by the default TabbedPanelsTab selector rule above. It also draws a bottom
+ * border for the tab. The tab button will get its left and right border from
+ * the TabGroup, and its top border from the TabGroup or tab button above it.
+ */
+.VTabbedPanels .TabbedPanelsTabSelected {
+ background-color: #EEE;
+ border-bottom: solid 1px #999;
+}
+
+/* This selector floats the content panels for the widget so that they
+ * render to the right of the tabbed buttons.
+ */
+.VTabbedPanels .TabbedPanelsContentGroup {
+ clear: none;
+ float: left;
+ padding: 0px;
+ width: 30em;
+ height: 20em;
+}
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js"
new file mode 100644
index 0000000..ff13c63
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/SpryTabbedPanels.js"
@@ -0,0 +1,368 @@
+/* SpryTabbedPanels.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.TabbedPanels = function(element, opts)
+{
+ this.element = this.getElement(element);
+ this.defaultTab = 0; // Show the first panel by default.
+ this.bindings = [];
+ this.tabSelectedClass = "TabbedPanelsTabSelected";
+ this.tabHoverClass = "TabbedPanelsTabHover";
+ this.tabFocusedClass = "TabbedPanelsTabFocused";
+ this.panelVisibleClass = "TabbedPanelsContentVisible";
+ this.focusElement = null;
+ this.hasFocus = false;
+ this.currentTabIndex = 0;
+ this.enableKeyboardNavigation = true;
+
+ Spry.Widget.TabbedPanels.setOptions(this, opts);
+
+ // If the defaultTab is expressed as a number/index, convert
+ // it to an element.
+
+ if (typeof (this.defaultTab) == "number")
+ {
+ if (this.defaultTab < 0)
+ this.defaultTab = 0;
+ else
+ {
+ var count = this.getTabbedPanelCount();
+ if (this.defaultTab >= count)
+ this.defaultTab = (count > 1) ? (count - 1) : 0;
+ }
+
+ this.defaultTab = this.getTabs()[this.defaultTab];
+ }
+
+ // The defaultTab property is supposed to be the tab element for the tab content
+ // to show by default. The caller is allowed to pass in the element itself or the
+ // element's id, so we need to convert the current value to an element if necessary.
+
+ if (this.defaultTab)
+ this.defaultTab = this.getElement(this.defaultTab);
+
+ this.attachBehaviors();
+};
+
+Spry.Widget.TabbedPanels.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+}
+
+Spry.Widget.TabbedPanels.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.TabbedPanels.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.TabbedPanels.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.TabbedPanels.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabGroup = function()
+{
+ if (this.element)
+ {
+ var children = this.getElementChildren(this.element);
+ if (children.length)
+ return children[0];
+ }
+ return null;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabs = function()
+{
+ var tabs = [];
+ var tg = this.getTabGroup();
+ if (tg)
+ tabs = this.getElementChildren(tg);
+ return tabs;
+};
+
+Spry.Widget.TabbedPanels.prototype.getContentPanelGroup = function()
+{
+ if (this.element)
+ {
+ var children = this.getElementChildren(this.element);
+ if (children.length > 1)
+ return children[1];
+ }
+ return null;
+};
+
+Spry.Widget.TabbedPanels.prototype.getContentPanels = function()
+{
+ var panels = [];
+ var pg = this.getContentPanelGroup();
+ if (pg)
+ panels = this.getElementChildren(pg);
+ return panels;
+};
+
+Spry.Widget.TabbedPanels.prototype.getIndex = function(ele, arr)
+{
+ ele = this.getElement(ele);
+ if (ele && arr && arr.length)
+ {
+ for (var i = 0; i < arr.length; i++)
+ {
+ if (ele == arr[i])
+ return i;
+ }
+ }
+ return -1;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabIndex = function(ele)
+{
+ var i = this.getIndex(ele, this.getTabs());
+ if (i < 0)
+ i = this.getIndex(ele, this.getContentPanels());
+ return i;
+};
+
+Spry.Widget.TabbedPanels.prototype.getCurrentTabIndex = function()
+{
+ return this.currentTabIndex;
+};
+
+Spry.Widget.TabbedPanels.prototype.getTabbedPanelCount = function(ele)
+{
+ return Math.min(this.getTabs().length, this.getContentPanels().length);
+};
+
+Spry.Widget.TabbedPanels.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabClick = function(e, tab)
+{
+ this.showPanel(tab);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabMouseOver = function(e, tab)
+{
+ this.addClassName(tab, this.tabHoverClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabMouseOut = function(e, tab)
+{
+ this.removeClassName(tab, this.tabHoverClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabFocus = function(e, tab)
+{
+ this.hasFocus = true;
+ this.addClassName(this.element, this.tabFocusedClass);
+};
+
+Spry.Widget.TabbedPanels.prototype.onTabBlur = function(e, tab)
+{
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.tabFocusedClass);
+};
+
+Spry.Widget.TabbedPanels.ENTER_KEY = 13;
+Spry.Widget.TabbedPanels.SPACE_KEY = 32;
+
+Spry.Widget.TabbedPanels.prototype.onTabKeyDown = function(e, tab)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != Spry.Widget.TabbedPanels.ENTER_KEY && key != Spry.Widget.TabbedPanels.SPACE_KEY))
+ return true;
+
+ this.showPanel(tab);
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.TabbedPanels.prototype.preorderTraversal = function(root, func)
+{
+ var stopTraversal = false;
+ if (root)
+ {
+ stopTraversal = func(root);
+ if (root.hasChildNodes())
+ {
+ var child = root.firstChild;
+ while (!stopTraversal && child)
+ {
+ stopTraversal = this.preorderTraversal(child, func);
+ try { child = child.nextSibling; } catch (e) { child = null; }
+ }
+ }
+ }
+ return stopTraversal;
+};
+
+Spry.Widget.TabbedPanels.prototype.addPanelEventListeners = function(tab, panel)
+{
+ var self = this;
+ Spry.Widget.TabbedPanels.addEventListener(tab, "click", function(e) { return self.onTabClick(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(e, tab); }, false);
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ // Find the first element within the tab container that has a tabindex or the first
+ // anchor tag.
+
+ var tabIndexEle = null;
+ var tabAnchorEle = null;
+
+ this.preorderTraversal(tab, function(node) {
+ if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
+ {
+ var tabIndexAttr = tab.attributes.getNamedItem("tabindex");
+ if (tabIndexAttr)
+ {
+ tabIndexEle = node;
+ return true;
+ }
+ if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")
+ tabAnchorEle = node;
+ }
+ return false;
+ });
+
+ if (tabIndexEle)
+ this.focusElement = tabIndexEle;
+ else if (tabAnchorEle)
+ this.focusElement = tabAnchorEle;
+
+ if (this.focusElement)
+ {
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "focus", function(e) { return self.onTabFocus(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "blur", function(e) { return self.onTabBlur(e, tab); }, false);
+ Spry.Widget.TabbedPanels.addEventListener(this.focusElement, "keydown", function(e) { return self.onTabKeyDown(e, tab); }, false);
+ }
+ }
+};
+
+Spry.Widget.TabbedPanels.prototype.showPanel = function(elementOrIndex)
+{
+ var tpIndex = -1;
+
+ if (typeof elementOrIndex == "number")
+ tpIndex = elementOrIndex;
+ else // Must be the element for the tab or content panel.
+ tpIndex = this.getTabIndex(elementOrIndex);
+
+ if (!tpIndex < 0 || tpIndex >= this.getTabbedPanelCount())
+ return;
+
+ var tabs = this.getTabs();
+ var panels = this.getContentPanels();
+
+ var numTabbedPanels = Math.max(tabs.length, panels.length);
+
+ for (var i = 0; i < numTabbedPanels; i++)
+ {
+ if (i != tpIndex)
+ {
+ if (tabs[i])
+ this.removeClassName(tabs[i], this.tabSelectedClass);
+ if (panels[i])
+ {
+ this.removeClassName(panels[i], this.panelVisibleClass);
+ panels[i].style.display = "none";
+ }
+ }
+ }
+
+ this.addClassName(tabs[tpIndex], this.tabSelectedClass);
+ this.addClassName(panels[tpIndex], this.panelVisibleClass);
+ panels[tpIndex].style.display = "block";
+
+ this.currentTabIndex = tpIndex;
+};
+
+Spry.Widget.TabbedPanels.prototype.attachBehaviors = function(element)
+{
+ var tabs = this.getTabs();
+ var panels = this.getContentPanels();
+ var panelCount = this.getTabbedPanelCount();
+
+ for (var i = 0; i < panelCount; i++)
+ this.addPanelEventListeners(tabs[i], panels[i]);
+
+ this.showPanel(this.defaultTab);
+};
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..619aa3c
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif"
new file mode 100644
index 0000000..ff9ba4d
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif"
new file mode 100644
index 0000000..3b4bc36
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-current.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif"
new file mode 100644
index 0000000..8de5f9f
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/SpryAssets/tab-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm"
new file mode 100644
index 0000000..f601189
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/Tab-hover.htm"
@@ -0,0 +1,72 @@
+
+
+
+
+Tab面板
+
+
+
+
+
+
+
+
Home
+
Web Development
+
Web Design
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+ The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
This selector is an example of how to change the appearance
+ of a tab button container after the user has clicked on it
+ to activate a content panel. The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.The class Tabbed Panels Tab Selected
+ is programatically added and removed from the tab element as
+ the user clicks on the tab button containers in the widget.
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif"
new file mode 100644
index 0000000..0db0cf9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/02/cup.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css"
new file mode 100644
index 0000000..992cd31
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.css"
@@ -0,0 +1,106 @@
+@charset "UTF-8";
+
+/* SpryCollapsiblePanel.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* This is the selector for the main CollapsiblePanel container. For our
+ * default style, the CollapsiblePanel is responsible for drawing the borders
+ * around the widget.
+ *
+ * If you want to constrain the width of the CollapsiblePanel widget, set a width on
+ * the CollapsiblePanel container. By default, our CollapsiblePanel expands horizontally to fill
+ * up available space.
+ *
+ * The name of the class ("CollapsiblePanel") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style the
+ * CollapsiblePanel container.
+ */
+.CollapsiblePanel {
+ width:300px;
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the CollapsiblePanelTab. This container houses
+ * the title for the panel. This is also the container that the user clicks
+ * on to open or close the panel.
+ *
+ * The name of the class ("CollapsiblePanelTab") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * CollapsiblePanel panel tab container.
+ */
+.CollapsiblePanelTab {
+ font: bold 1em Arial;
+ color:#630;
+ background: url(col-close-back.gif) no-repeat;
+ line-height:30px;
+ height:30px;
+ margin: 0px;
+ padding: 2px 30px;
+ cursor: pointer;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+/* This is the selector for a CollapsiblePanel's Content area. It's important to note that
+ * you should never put any padding on the content area element if you plan to
+ * use the CollapsiblePanel's open/close animations. Placing a non-zero padding on the content
+ * element can cause the CollapsiblePanel to abruptly grow in height while the panels animate.
+ *
+ * The name of the class ("CollapsiblePanelContent") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style a
+ * CollapsiblePanel content container.
+ */
+.CollapsiblePanelContent {
+ margin: 0px;
+ font: 0.8em Arial;
+ padding: 5px;
+}
+
+.CollapsiblePanelContent img{
+ float:right;
+ padding:2px;
+ margin:5px;
+ border:1px #aaa dashed;
+ }
+
+/* An anchor tag can be used inside of a CollapsiblePanelTab so that the
+ * keyboard focus ring appears *inside* the tab instead of around the tab.
+ * This is an example of how to make the text within the anchor tag look
+ * like non-anchor (normal) text.
+ */
+.CollapsiblePanelTab a {
+ color: black;
+ text-decoration: none;
+}
+
+/* This is an example of how to change the appearance of the panel tab that is
+ * currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ * from panels as the user clicks on the tabs within the CollapsiblePanel.
+ */
+.CollapsiblePanelOpen .CollapsiblePanelTab {
+ background:url(col-open-back.gif) no-repeat;
+}
+
+/* This is an example of how to change the appearance of the panel tab as the
+ * mouse hovers over it. The class "CollapsiblePanelTabHover" is programatically added
+ * and removed from panel tab containers as the mouse enters and exits the tab container.
+ */
+.CollapsiblePanelTabHover {
+ background:url(col-close-hover.gif) no-repeat;
+ color:#FFF;
+}
+
+.CollapsiblePanelOpen .CollapsiblePanelTabHover {
+ background:url(col-open-hover.gif) no-repeat;
+ color:#FFF;
+}
+
+/* This is an example of how to change the appearance of all the panel tabs when the
+ * CollapsiblePanel has focus. The "CollapsiblePanelFocused" class is programatically added and removed
+ * whenever the CollapsiblePanel gains or loses keyboard focus.
+ */
+.CollapsiblePanelFocused .CollapsiblePanelTab {
+
+}
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js"
new file mode 100644
index 0000000..52440f9
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/SpryCollapsiblePanel.js"
@@ -0,0 +1,465 @@
+/* SpryCollapsiblePanel.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.CollapsiblePanel = function(element, opts)
+{
+ this.init(element);
+
+ Spry.Widget.CollapsiblePanel.setOptions(this, opts);
+
+ this.attachBehaviors();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.init = function(element)
+{
+ this.element = this.getElement(element);
+ this.focusElement = null;
+ this.hoverClass = "CollapsiblePanelTabHover";
+ this.openClass = "CollapsiblePanelOpen";
+ this.closedClass = "CollapsiblePanelClosed";
+ this.focusedClass = "CollapsiblePanelFocused";
+ this.enableAnimation = true;
+ this.enableKeyboardNavigation = true;
+ this.animator = null;
+ this.hasFocus = false;
+ this.contentIsOpen = true;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.CollapsiblePanel.prototype.hasClassName = function(ele, className)
+{
+ if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)
+ return false;
+ return true;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.setDisplay = function(ele, display)
+{
+ if( ele )
+ ele.style.display = display;
+};
+
+Spry.Widget.CollapsiblePanel.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabMouseOver = function()
+{
+ this.addClassName(this.getTab(), this.hoverClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabMouseOut = function()
+{
+ this.removeClassName(this.getTab(), this.hoverClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.open = function()
+{
+ this.contentIsOpen = true;
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, true);
+ this.animator.start();
+ }
+ else
+ this.setDisplay(this.getContent(), "block");
+
+ this.removeClassName(this.element, this.closedClass);
+ this.addClassName(this.element, this.openClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.close = function()
+{
+ this.contentIsOpen = false;
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.CollapsiblePanel.PanelAnimator(this, false);
+ this.animator.start();
+ }
+ else
+ this.setDisplay(this.getContent(), "none");
+
+ this.removeClassName(this.element, this.openClass);
+ this.addClassName(this.element, this.closedClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onTabClick = function()
+{
+ if (this.isOpen())
+ this.close();
+ else
+ this.open();
+ this.focus();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onFocus = function(e)
+{
+ this.hasFocus = true;
+ this.addClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.CollapsiblePanel.prototype.onBlur = function(e)
+{
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.CollapsiblePanel.ENTER_KEY = 13;
+Spry.Widget.CollapsiblePanel.SPACE_KEY = 32;
+
+Spry.Widget.CollapsiblePanel.prototype.onKeyDown = function(e)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != Spry.Widget.CollapsiblePanel.ENTER_KEY && key != Spry.Widget.CollapsiblePanel.SPACE_KEY))
+ return true;
+
+ if (this.isOpen())
+ this.close();
+ else
+ this.open();
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.attachPanelHandlers = function()
+{
+ var tab = this.getTab();
+ if (!tab)
+ return;
+
+ var self = this;
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "click", function(e) { return self.onTabClick(); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseover", function(e) { return self.onTabMouseOver(); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(tab, "mouseout", function(e) { return self.onTabMouseOut(); }, false);
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ // Find the first element within the tab container that has a tabindex or the first
+ // anchor tag.
+
+ var tabIndexEle = null;
+ var tabAnchorEle = null;
+
+ this.preorderTraversal(tab, function(node) {
+ if (node.nodeType == 1 /* NODE.ELEMENT_NODE */)
+ {
+ var tabIndexAttr = tab.attributes.getNamedItem("tabindex");
+ if (tabIndexAttr)
+ {
+ tabIndexEle = node;
+ return true;
+ }
+ if (!tabAnchorEle && node.nodeName.toLowerCase() == "a")
+ tabAnchorEle = node;
+ }
+ return false;
+ });
+
+ if (tabIndexEle)
+ this.focusElement = tabIndexEle;
+ else if (tabAnchorEle)
+ this.focusElement = tabAnchorEle;
+
+ if (this.focusElement)
+ {
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "focus", function(e) { return self.onFocus(e); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "blur", function(e) { return self.onBlur(e); }, false);
+ Spry.Widget.CollapsiblePanel.addEventListener(this.focusElement, "keydown", function(e) { return self.onKeyDown(e); }, false);
+ }
+ }
+};
+
+Spry.Widget.CollapsiblePanel.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.CollapsiblePanel.prototype.preorderTraversal = function(root, func)
+{
+ var stopTraversal = false;
+ if (root)
+ {
+ stopTraversal = func(root);
+ if (root.hasChildNodes())
+ {
+ var child = root.firstChild;
+ while (!stopTraversal && child)
+ {
+ stopTraversal = this.preorderTraversal(child, func);
+ try { child = child.nextSibling; } catch (e) { child = null; }
+ }
+ }
+ }
+ return stopTraversal;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.attachBehaviors = function()
+{
+ var panel = this.element;
+ var tab = this.getTab();
+ var content = this.getContent();
+
+ if (this.contentIsOpen || this.hasClassName(panel, this.openClass))
+ {
+ this.removeClassName(panel, this.closedClass);
+ this.setDisplay(content, "block");
+ this.contentIsOpen = true;
+ }
+ else
+ {
+ this.removeClassName(panel, this.openClass);
+ this.addClassName(panel, this.closedClass);
+ this.setDisplay(content, "none");
+ this.contentIsOpen = false;
+ }
+
+ this.attachPanelHandlers();
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getTab = function()
+{
+ return this.getElementChildren(this.element)[0];
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getContent = function()
+{
+ return this.getElementChildren(this.element)[1];
+};
+
+Spry.Widget.CollapsiblePanel.prototype.isOpen = function()
+{
+ return this.contentIsOpen;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.CollapsiblePanel.prototype.focus = function()
+{
+ if (this.focusElement && this.focusElement.focus)
+ this.focusElement.focus();
+};
+
+/////////////////////////////////////////////////////
+
+Spry.Widget.CollapsiblePanel.PanelAnimator = function(panel, doOpen, opts)
+{
+ this.timer = null;
+ this.interval = 0;
+ this.stepCount = 0;
+
+ this.fps = 0;
+ this.steps = 10;
+ this.duration = 500;
+ this.onComplete = null;
+
+ this.panel = panel;
+ this.content = panel.getContent();
+ this.panelData = [];
+ this.doOpen = doOpen;
+
+ Spry.Widget.CollapsiblePanel.setOptions(this, opts);
+
+
+ // If caller specified speed in terms of frames per second,
+ // convert them into steps.
+
+ if (this.fps > 0)
+ {
+ this.interval = Math.floor(1000 / this.fps);
+ this.steps = parseInt((this.duration + (this.interval - 1)) / this.interval);
+ }
+ else if (this.steps > 0)
+ this.interval = this.duration / this.steps;
+
+ var c = this.content;
+
+ var curHeight = c.offsetHeight ? c.offsetHeight : 0;
+
+ if (doOpen && c.style.display == "none")
+ this.fromHeight = 0;
+ else
+ this.fromHeight = curHeight;
+
+ if (!doOpen)
+ this.toHeight = 0;
+ else
+ {
+ if (c.style.display == "none")
+ {
+ // The content area is not displayed so in order to calculate the extent
+ // of the content inside it, we have to set its display to block.
+
+ c.style.visibility = "hidden";
+ c.style.display = "block";
+ }
+
+ // Unfortunately in Mozilla/Firefox, fetching the offsetHeight seems to cause
+ // the browser to synchronously re-layout and re-display content on the page,
+ // so we see a brief flash of content that is *after* the panel being positioned
+ // where it should when the panel is fully expanded. To get around this, we
+ // temporarily position the content area of the panel absolutely off-screen.
+ // This has the effect of taking the content out-of-flow, so nothing shifts around.
+
+ // var oldPos = c.style.position;
+ // var oldLeft = c.style.left;
+ // c.style.position = "absolute";
+ // c.style.left = "-2000em";
+
+ // Clear the height property so we can calculate
+ // the full height of the content we are going to show.
+ c.style.height = "";
+ this.toHeight = c.offsetHeight;
+
+ // Now restore the position and offset to what it was!
+ // c.style.position = oldPos;
+ // c.style.left = oldLeft;
+ }
+
+ this.increment = (this.toHeight - this.fromHeight) / this.steps;
+ this.overflow = c.style.overflow;
+
+ c.style.height = this.fromHeight + "px";
+ c.style.visibility = "visible";
+ c.style.overflow = "hidden";
+ c.style.display = "block";
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.start = function()
+{
+ var self = this;
+ this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stop = function()
+{
+ if (this.timer)
+ {
+ clearTimeout(this.timer);
+
+ // If we're killing the timer, restore the overflow
+ // properties on the panels we were animating!
+
+ if (this.stepCount < this.steps)
+ this.content.style.overflow = this.overflow;
+ }
+
+ this.timer = null;
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.stepAnimation = function()
+{
+ ++this.stepCount;
+
+ this.animate();
+
+ if (this.stepCount < this.steps)
+ this.start();
+ else if (this.onComplete)
+ this.onComplete();
+};
+
+Spry.Widget.CollapsiblePanel.PanelAnimator.prototype.animate = function()
+{
+ if (this.stepCount >= this.steps)
+ {
+ if (!this.doOpen)
+ this.content.style.display = "none";
+ this.content.style.overflow = this.overflow;
+ this.content.style.height = this.toHeight + "px";
+ }
+ else
+ {
+ this.fromHeight += this.increment;
+ this.content.style.height = this.fromHeight + "px";
+ }
+};
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..725d5f9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif"
new file mode 100644
index 0000000..46416d6
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif"
new file mode 100644
index 0000000..89d0f03
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-close-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif"
new file mode 100644
index 0000000..059f17b
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif"
new file mode 100644
index 0000000..9f03ac9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/SpryAssets/col-open-hover.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db"
new file mode 100644
index 0000000..a939b62
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm"
new file mode 100644
index 0000000..da9a333
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/collapsible.htm"
@@ -0,0 +1,56 @@
+
+
+
+
+折叠面板
+
+
+
+
+
+
+
+
Learning CSS is Funny
+
+ An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panels as the user clicks on the tabs within the CollapsiblePanel.
+
+
+
+
+
Collapsible Panel is Funny
+
+ The name of the class (" Collapsible Panel Content") used in this selector is not necessary
+ to make the widget function. You can use any class name you want to style a
+ CollapsiblePanel content container.
+
+
+
+
+
CSS is Great
+
+ The name of the class (" Collapsible Panel Content") used in this selector is not necessary
+ to make the widget function. You can use any class name you want to style a
+ CollapsiblePanel content container.
+
+
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif"
new file mode 100644
index 0000000..0db0cf9
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/03/cup.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css"
new file mode 100644
index 0000000..a19096b
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.css"
@@ -0,0 +1,114 @@
+@charset "UTF-8";
+
+/* SpryAccordion.css - Revision: Spry Preview Release 1.4 */
+
+/* Copyright (c) 2006. Adobe Systems Incorporated. All rights reserved. */
+
+/* This is the selector for the main Accordion container. For our default style,
+ * we draw borders on the left, right, and bottom. The top border of the Accordion
+ * will be rendered by the first AccordionPanelTab which never moves.
+ *
+ * If you want to constrain the width of the Accordion widget, set a width on
+ * the Accordion container. By default, our accordion expands horizontally to fill
+ * up available space.
+ *
+ * The name of the class ("Accordion") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style the
+ * Accordion container.
+ */
+.Accordion {
+ width:300px;
+ overflow: hidden;
+ border-bottom:2px #006 solid;
+}
+
+/* This is the selector for the AccordionPanel container which houses the
+ * panel tab and a panel content area. It doesn't render visually, but we
+ * make sure that it has zero margin and padding.
+ *
+ * The name of the class ("AccordionPanel") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel container.
+*/
+.AccordionPanel {
+ margin: 0px;
+ padding: 0px;
+}
+
+/* This is the selector for the AccordionPanelTab. This container houses
+ * the title for the panel. This is also the container that the user clicks
+ * on to open a specific panel.
+ *
+ * The name of the class ("AccordionPanelTab") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel tab container.
+ */
+.AccordionPanelTab {
+ background: url(ac-open-back.gif) no-repeat;
+ font: bold 16px Arial;
+ color:#006;
+ line-height:30px;
+ height:30px;
+ margin: 0px;
+ padding: 0px 30px;
+ cursor: pointer;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+}
+
+.top{
+ background: url(ac-open-back-top.gif) no-repeat;
+}
+
+/* This is the selector for a Panel's Content area. It's important to note that
+ * you should never put any padding on the panel's content area if you plan to
+ * use the Accordions panel animations. Placing a non-zero padding on the content
+ * area can cause the accordion to abruptly grow in height while the panels animate.
+ *
+ * Anyone who styles an Accordion *MUST* specify a height on the Accordion Panel
+ * Content container.
+ *
+ * The name of the class ("AccordionPanelContent") used in this selector is not necessary
+ * to make the widget function. You can use any class name you want to style an
+ * accordion panel content container.
+ */
+.AccordionPanelContent {
+ background:#ADF;
+ font:12px/18px Arial;
+ overflow: auto;
+ margin: 0px;
+ padding: 0 10px;
+ height: 230px;
+ border-left:2px #006 solid;
+ border-right:2px #006 solid;
+}
+
+.AccordionPanelContent img{
+ float:left;
+ padding:2px;
+ margin:2px;
+ border:1px #aaa dashed;
+ }
+
+/* This is an example of how to change the appearance of the panel tab that is
+ * currently open. The class "AccordionPanelOpen" is programatically added and removed
+ * from panels as the user clicks on the tabs within the Accordion.
+ */
+.AccordionPanelOpen .AccordionPanelTab {
+ background: url(ac-open-back-open.gif) no-repeat;
+}
+
+.AccordionPanelOpen .top {
+ background: url(ac-open-back-top-open.gif) no-repeat;
+}
+
+/* This is an example of how to change the appearance of the panel tab as the
+ * mouse hovers over it. The class "AccordionPanelTabHover" is programatically added
+ * and removed from panel tab containers as the mouse enters and exits the tab container.
+ */
+
+/* This is an example of how to change the appearance of all the panel tabs when the
+ * Accordion has focus. The "AccordionFocused" class is programatically added and removed
+ * whenever the Accordion gains or loses keyboard focus.
+ */
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js"
new file mode 100644
index 0000000..e74390d
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/SpryAccordion.js"
@@ -0,0 +1,526 @@
+/* SpryAccordion.js - Revision: Spry Preview Release 1.4 */
+
+// Copyright (c) 2006. Adobe Systems Incorporated.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+// * Neither the name of Adobe Systems Incorporated nor the names of its
+// contributors may be used to endorse or promote products derived from this
+// software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+var Spry;
+if (!Spry) Spry = {};
+if (!Spry.Widget) Spry.Widget = {};
+
+Spry.Widget.Accordion = function(element, opts)
+{
+ this.element = this.getElement(element);
+ this.defaultPanel = 0;
+ this.hoverClass = "AccordionPanelTabHover";
+ this.openClass = "AccordionPanelOpen";
+ this.closedClass = "AccordionPanelClosed";
+ this.focusedClass = "AccordionFocused";
+ this.enableAnimation = true;
+ this.enableKeyboardNavigation = true;
+ this.currentPanel = null;
+ this.animator = null;
+ this.hasFocus = null;
+ this.duration = 500;
+
+ this.previousPanelKeyCode = Spry.Widget.Accordion.KEY_UP;
+ this.nextPanelKeyCode = Spry.Widget.Accordion.KEY_DOWN;
+
+ this.useFixedPanelHeights = true;
+ this.fixedPanelHeight = 0;
+
+ Spry.Widget.Accordion.setOptions(this, opts, true);
+
+ // Unfortunately in some browsers like Safari, the Stylesheets our
+ // page depends on may not have been loaded at the time we are called.
+ // This means we have to defer attaching our behaviors until after the
+ // onload event fires, since some of our behaviors rely on dimensions
+ // specified in the CSS.
+
+ if (Spry.Widget.Accordion.onloadDidFire)
+ this.attachBehaviors();
+ else
+ Spry.Widget.Accordion.loadQueue.push(this);
+};
+
+Spry.Widget.Accordion.onloadDidFire = false;
+Spry.Widget.Accordion.loadQueue = [];
+
+Spry.Widget.Accordion.addLoadListener = function(handler)
+{
+ if (typeof window.addEventListener != 'undefined')
+ window.addEventListener('load', handler, false);
+ else if (typeof document.addEventListener != 'undefined')
+ document.addEventListener('load', handler, false);
+ else if (typeof window.attachEvent != 'undefined')
+ window.attachEvent('onload', handler);
+};
+
+Spry.Widget.Accordion.processLoadQueue = function(handler)
+{
+ Spry.Widget.Accordion.onloadDidFire = true;
+ var q = Spry.Widget.Accordion.loadQueue;
+ var qlen = q.length;
+ for (var i = 0; i < qlen; i++)
+ q[i].attachBehaviors();
+};
+
+Spry.Widget.Accordion.addLoadListener(Spry.Widget.Accordion.processLoadQueue);
+
+Spry.Widget.Accordion.prototype.getElement = function(ele)
+{
+ if (ele && typeof ele == "string")
+ return document.getElementById(ele);
+ return ele;
+};
+
+Spry.Widget.Accordion.prototype.addClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) != -1))
+ return;
+ ele.className += (ele.className ? " " : "") + className;
+};
+
+Spry.Widget.Accordion.prototype.removeClassName = function(ele, className)
+{
+ if (!ele || !className || (ele.className && ele.className.search(new RegExp("\\b" + className + "\\b")) == -1))
+ return;
+ ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
+};
+
+Spry.Widget.Accordion.setOptions = function(obj, optionsObj, ignoreUndefinedProps)
+{
+ if (!optionsObj)
+ return;
+ for (var optionName in optionsObj)
+ {
+ if (ignoreUndefinedProps && optionsObj[optionName] == undefined)
+ continue;
+ obj[optionName] = optionsObj[optionName];
+ }
+};
+
+Spry.Widget.Accordion.prototype.onPanelTabMouseOver = function(panel)
+{
+ if (panel)
+ this.addClassName(this.getPanelTab(panel), this.hoverClass);
+};
+
+Spry.Widget.Accordion.prototype.onPanelTabMouseOut = function(panel)
+{
+ if (panel)
+ this.removeClassName(this.getPanelTab(panel), this.hoverClass);
+};
+
+Spry.Widget.Accordion.prototype.openPanel = function(panel)
+{
+ var panelA = this.currentPanel;
+ var panelB = panel;
+
+ if (!panelB || panelA == panelB)
+ return;
+
+ var contentA;
+ if( panelA )
+ contentA = this.getPanelContent(panelA);
+ var contentB = this.getPanelContent(panelB);
+
+ if (! contentB)
+ return;
+
+ if (this.useFixedPanelHeights && !this.fixedPanelHeight)
+ {
+ this.fixedPanelHeight = (contentA.offsetHeight) ? contentA.offsetHeight : contentA.scrollHeight;
+ }
+
+ if (this.enableAnimation)
+ {
+ if (this.animator)
+ this.animator.stop();
+ this.animator = new Spry.Widget.Accordion.PanelAnimator(this, panelB, { duration: this.duration });
+ this.animator.start();
+ }
+ else
+ {
+ if(contentA)
+ contentA.style.height = "0px";
+ contentB.style.height = (this.useFixedPanelHeights ? this.fixedPanelHeight : contentB.scrollHeight) + "px";
+ }
+
+ if(panelA)
+ {
+ this.removeClassName(panelA, this.openClass);
+ this.addClassName(panelA, this.closedClass);
+ }
+
+ this.removeClassName(panelB, this.closedClass);
+ this.addClassName(panelB, this.openClass);
+
+ this.currentPanel = panelB;
+};
+
+Spry.Widget.Accordion.prototype.openNextPanel = function()
+{
+ var panels = this.getPanels();
+ var curPanelIndex = this.getCurrentPanelIndex();
+
+ if( panels && curPanelIndex >= 0 && (curPanelIndex+1) < panels.length )
+ this.openPanel(panels[curPanelIndex+1]);
+};
+
+Spry.Widget.Accordion.prototype.openPreviousPanel = function()
+{
+ var panels = this.getPanels();
+ var curPanelIndex = this.getCurrentPanelIndex();
+
+ if( panels && curPanelIndex > 0 && curPanelIndex < panels.length )
+ this.openPanel(panels[curPanelIndex-1]);
+};
+
+Spry.Widget.Accordion.prototype.openFirstPanel = function()
+{
+ var panels = this.getPanels();
+ if( panels )
+ this.openPanel(panels[0]);
+};
+
+Spry.Widget.Accordion.prototype.openLastPanel = function()
+{
+ var panels = this.getPanels();
+ if( panels )
+ this.openPanel(panels[panels.length-1]);
+};
+
+Spry.Widget.Accordion.prototype.onPanelClick = function(panel)
+{
+ // if (this.enableKeyboardNavigation)
+ // this.element.focus();
+ if (panel != this.currentPanel)
+ this.openPanel(panel);
+ this.focus();
+};
+
+Spry.Widget.Accordion.prototype.onFocus = function(e)
+{
+ // this.element.focus();
+ this.hasFocus = true;
+ this.addClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.Accordion.prototype.onBlur = function(e)
+{
+ // this.element.blur();
+ this.hasFocus = false;
+ this.removeClassName(this.element, this.focusedClass);
+};
+
+Spry.Widget.Accordion.KEY_UP = 38;
+Spry.Widget.Accordion.KEY_DOWN = 40;
+
+Spry.Widget.Accordion.prototype.onKeyDown = function(e)
+{
+ var key = e.keyCode;
+ if (!this.hasFocus || (key != this.previousPanelKeyCode && key != this.nextPanelKeyCode))
+ return true;
+
+ var panels = this.getPanels();
+ if (!panels || panels.length < 1)
+ return false;
+ var currentPanel = this.currentPanel ? this.currentPanel : panels[0];
+ var nextPanel = (key == this.nextPanelKeyCode) ? currentPanel.nextSibling : currentPanel.previousSibling;
+
+ while (nextPanel)
+ {
+ if (nextPanel.nodeType == 1 /* Node.ELEMENT_NODE */)
+ break;
+ nextPanel = (key == this.nextPanelKeyCode) ? nextPanel.nextSibling : nextPanel.previousSibling;
+ }
+
+ if (nextPanel && currentPanel != nextPanel)
+ this.openPanel(nextPanel);
+
+ if (e.stopPropagation)
+ e.stopPropagation();
+ if (e.preventDefault)
+ e.preventDefault();
+
+ return false;
+};
+
+Spry.Widget.Accordion.prototype.attachPanelHandlers = function(panel)
+{
+ if (!panel)
+ return;
+
+ var tab = this.getPanelTab(panel);
+
+ if (tab)
+ {
+ var self = this;
+ Spry.Widget.Accordion.addEventListener(tab, "click", function(e) { return self.onPanelClick(panel); }, false);
+ Spry.Widget.Accordion.addEventListener(tab, "mouseover", function(e) { return self.onPanelTabMouseOver(panel); }, false);
+ Spry.Widget.Accordion.addEventListener(tab, "mouseout", function(e) { return self.onPanelTabMouseOut(panel); }, false);
+ }
+};
+
+Spry.Widget.Accordion.addEventListener = function(element, eventType, handler, capture)
+{
+ try
+ {
+ if (element.addEventListener)
+ element.addEventListener(eventType, handler, capture);
+ else if (element.attachEvent)
+ element.attachEvent("on" + eventType, handler);
+ }
+ catch (e) {}
+};
+
+Spry.Widget.Accordion.prototype.initPanel = function(panel, isDefault)
+{
+ var content = this.getPanelContent(panel);
+ if (isDefault)
+ {
+ this.currentPanel = panel;
+ this.removeClassName(panel, this.closedClass);
+ this.addClassName(panel, this.openClass);
+ }
+ else
+ {
+ this.removeClassName(panel, this.openClass);
+ this.addClassName(panel, this.closedClass);
+ content.style.height = "0px";
+ }
+
+ this.attachPanelHandlers(panel);
+};
+
+Spry.Widget.Accordion.prototype.attachBehaviors = function()
+{
+ var panels = this.getPanels();
+ for (var i = 0; i < panels.length; i++)
+ {
+ this.initPanel(panels[i], i == this.defaultPanel);
+ }
+
+ if (this.enableKeyboardNavigation)
+ {
+ // XXX: IE doesn't allow the setting of tabindex dynamically. This means we can't
+ // rely on adding the tabindex attribute if it is missing to enable keyboard navigation
+ // by default.
+
+ var tabIndexAttr = this.element.attributes.getNamedItem("tabindex");
+ // if (!tabIndexAttr) this.element.tabindex = 0;
+ if (tabIndexAttr)
+ {
+ var self = this;
+ Spry.Widget.Accordion.addEventListener(this.element, "focus", function(e) { return self.onFocus(e); }, false);
+ Spry.Widget.Accordion.addEventListener(this.element, "blur", function(e) { return self.onBlur(e); }, false);
+ Spry.Widget.Accordion.addEventListener(this.element, "keydown", function(e) { return self.onKeyDown(e); }, false);
+ }
+ }
+};
+
+Spry.Widget.Accordion.prototype.getPanels = function()
+{
+ return this.getElementChildren(this.element);
+};
+
+Spry.Widget.Accordion.prototype.getCurrentPanel = function()
+{
+ return this.currentPanel;
+};
+
+Spry.Widget.Accordion.prototype.getCurrentPanelIndex = function()
+{
+ var panels = this.getPanels();
+ for( var i = 0 ; i < panels.length; i++ )
+ {
+ if( this.currentPanel == panels[i] )
+ return i;
+ }
+ return 0;
+};
+
+Spry.Widget.Accordion.prototype.getPanelTab = function(panel)
+{
+ if (!panel)
+ return null;
+ return this.getElementChildren(panel)[0];
+};
+
+Spry.Widget.Accordion.prototype.getPanelContent = function(panel)
+{
+ if (!panel)
+ return null;
+ return this.getElementChildren(panel)[1];
+};
+
+Spry.Widget.Accordion.prototype.getElementChildren = function(element)
+{
+ var children = [];
+ var child = element.firstChild;
+ while (child)
+ {
+ if (child.nodeType == 1 /* Node.ELEMENT_NODE */)
+ children.push(child);
+ child = child.nextSibling;
+ }
+ return children;
+};
+
+Spry.Widget.Accordion.prototype.focus = function()
+{
+ if (this.element && this.element.focus)
+ this.element.focus();
+};
+
+/////////////////////////////////////////////////////
+
+Spry.Widget.Accordion.PanelAnimator = function(accordion, panel, opts)
+{
+ this.timer = null;
+ this.interval = 0;
+ this.stepCount = 0;
+
+ this.fps = 0;
+ this.steps = 10;
+ this.duration = 500;
+ this.onComplete = null;
+
+ this.panel = panel;
+ this.panelToOpen = accordion.getElement(panel);
+ this.panelData = [];
+
+ Spry.Widget.Accordion.setOptions(this, opts, true);
+
+
+ // If caller specified speed in terms of frames per second,
+ // convert them into steps.
+
+ if (this.fps > 0)
+ {
+ this.interval = Math.floor(1000 / this.fps);
+ this.steps = parseInt((this.duration + (this.interval - 1)) / this.interval);
+ }
+ else if (this.steps > 0)
+ this.interval = this.duration / this.steps;
+
+ // Set up the array of panels we want to animate.
+
+ var panels = accordion.getPanels();
+ for (var i = 0; i < panels.length; i++)
+ {
+ var p = panels[i];
+ var c = accordion.getPanelContent(p);
+ if (c)
+ {
+ var h = c.offsetHeight;
+ if (h == undefined)
+ h = 0;
+ if (p == panel || h > 0)
+ {
+ var obj = new Object;
+ obj.panel = p;
+ obj.content = c;
+ obj.fromHeight = h;
+ obj.toHeight = (p == panel) ? (accordion.useFixedPanelHeights ? accordion.fixedPanelHeight : c.scrollHeight) : 0;
+ obj.increment = (obj.toHeight - obj.fromHeight) / this.steps;
+ obj.overflow = c.style.overflow;
+ this.panelData.push(obj);
+
+ c.style.overflow = "hidden";
+ c.style.height = h + "px";
+ }
+ }
+ }
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.start = function()
+{
+ var self = this;
+ this.timer = setTimeout(function() { self.stepAnimation(); }, this.interval);
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.stop = function()
+{
+ if (this.timer)
+ {
+ clearTimeout(this.timer);
+
+ // If we're killing the timer, restore the overflow
+ // properties on the panels we were animating!
+
+ if (this.stepCount < this.steps)
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ obj.content.style.overflow = obj.overflow;
+ }
+ }
+ }
+
+ this.timer = null;
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.stepAnimation = function()
+{
+ ++this.stepCount;
+
+ this.animate();
+
+ if (this.stepCount < this.steps)
+ this.start();
+ else if (this.onComplete)
+ this.onComplete();
+};
+
+Spry.Widget.Accordion.PanelAnimator.prototype.animate = function()
+{
+ var i, obj;
+
+ if (this.stepCount >= this.steps)
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ if (obj.panel != this.panel)
+ obj.content.style.height = "0px";
+ obj.content.style.overflow = obj.overflow;
+ obj.content.style.height = obj.toHeight + "px";
+ }
+ }
+ else
+ {
+ for (i = 0; i < this.panelData.length; i++)
+ {
+ obj = this.panelData[i];
+ obj.fromHeight += obj.increment;
+ obj.content.style.height = obj.fromHeight + "px";
+ }
+ }
+};
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db"
new file mode 100644
index 0000000..619aa3c
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/Thumbs.db" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif"
new file mode 100644
index 0000000..d5aad98
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-bak.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif"
new file mode 100644
index 0000000..8b295ee
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-open.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif"
new file mode 100644
index 0000000..37bea12
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top-open.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif"
new file mode 100644
index 0000000..06686a6
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back-top.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif"
new file mode 100644
index 0000000..9f7c0f1
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/SpryAssets/ac-open-back.gif" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm" "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm"
new file mode 100644
index 0000000..4f855ab
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\344\272\224\345\221\250\350\204\261\344\272\247\347\217\255/\345\221\250\345\233\233/\347\254\254\344\270\211\345\221\250\345\221\250\346\234\253\351\200\211\351\241\271\345\215\241\345\222\214DOM\345\272\223_20160320/spry/04/accordion-hover.htm"
@@ -0,0 +1,54 @@
+
+
+
+
+伸缩面板
+
+
+
+
+
+
+
+
Home
+
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panel.
+
+
+
+
Web Design
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Web Dev
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Map
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the
+ key board focus ring appears *inside* the tab instead of around the tab.
+ This is an example of how to make the text within the anchor tag look
+ like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is
+ currently open. The class "CollapsiblePanelOpen" is programatically added and removed
+ from panel.
+
+
+
+
Web Design
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Web Dev
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
Map
+
An anchor tag can be used inside of a Collapsible Panel Tab so that the key board focus ring appears *inside* the tab instead of around the tab. This is an example of how to make the text within the anchor tag look like non-anchor (normal) text.This is an example of how to change the appearance of the panel tab that is currently open. The class "CollapsiblePanelOpen" is programatically added and removed from panels as the user clicks on the tabs within the CollapsiblePanel. on the tabs within the CollapsiblePanel
+
+
+
+
+
+
+
+
diff --git "a/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jQueryAPI-100214.chm" "b/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jQueryAPI-100214.chm"
new file mode 100644
index 0000000..ad3801f
Binary files /dev/null and "b/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jQueryAPI-100214.chm" differ
diff --git "a/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jquery-1.9.1.js" "b/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jquery-1.9.1.js"
new file mode 100644
index 0000000..4507b35
--- /dev/null
+++ "b/\350\256\262\344\271\211/\347\254\254\345\233\233\345\221\250_jQuery_2016_03_24/jquery-1.9.1.js"
@@ -0,0 +1,9772 @@
+/*!
+ * jQuery JavaScript Library v1.9.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-2-4
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+ // The deferred used on DOM ready
+ readyList,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // Support: IE<9
+ // For `typeof node.method` instead of `node.method !== undefined`
+ core_strundefined = typeof undefined,
+
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+ location = window.location,
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // [[Class]] -> type pairs
+ class2type = {},
+
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+
+ core_version = "1.9.1",
+
+ // Save a reference to some core methods
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Used for matching numbers
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
+
+ // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ },
+
+ // The ready event handler
+ completed = function( event ) {
+
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
+ if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+ detach();
+ jQuery.ready();
+ }
+ },
+ // Clean-up method for dom ready events
+ detach = function() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+
+ } else {
+ document.detachEvent( "onreadystatechange", completed );
+ window.detachEvent( "onload", completed );
+ }
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return core_slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+ },
+
+ slice: function() {
+ return this.pushStack( core_slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: core_push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var src, copyIsArray, copy, name, options, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger("ready").off("ready");
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ isWindow: function( obj ) {
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return String( obj );
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ core_toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !core_hasOwn.call(obj, "constructor") &&
+ !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || core_hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ // data: string of html
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+ if ( scripts ) {
+ jQuery( scripts ).remove();
+ }
+ return jQuery.merge( [], parsed.childNodes );
+ },
+
+ parseJSON: function( data ) {
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
+ }
+
+ if ( data === null ) {
+ return data;
+ }
+
+ if ( typeof data === "string" ) {
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+ }
+ }
+ }
+
+ jQuery.error( "Invalid JSON: " + data );
+ },
+
+ // Cross-browser xml parsing
+ parseXML: function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ try {
+ if ( window.DOMParser ) { // Standard
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data , "text/xml" );
+ } else { // IE
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
+ xml.async = "false";
+ xml.loadXML( data );
+ }
+ } catch( e ) {
+ xml = undefined;
+ }
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && jQuery.trim( data ) ) {
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data );
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+ function( text ) {
+ return text == null ?
+ "" :
+ core_trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ core_push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ var len;
+
+ if ( arr ) {
+ if ( core_indexOf ) {
+ return core_indexOf.call( arr, elem, i );
+ }
+
+ len = arr.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in arr && arr[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var l = second.length,
+ i = first.length,
+ j = 0;
+
+ if ( typeof l === "number" ) {
+ for ( ; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var retVal,
+ ret = [],
+ i = 0,
+ length = elems.length;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return core_concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var args, proxy, tmp;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = core_slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[0], key ) : emptyGet;
+ },
+
+ now: function() {
+ return ( new Date() ).getTime();
+ }
+});
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ // Standards-based browsers support DOMContentLoaded
+ } else if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+
+ // If IE event model is used
+ } else {
+ // Ensure firing before onload, maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", completed );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", completed );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = window.frameElement == null && document.documentElement;
+ } catch(e) {}
+
+ if ( top && top.doScroll ) {
+ (function doScrollCheck() {
+ if ( !jQuery.isReady ) {
+
+ try {
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll("left");
+ } catch(e) {
+ return setTimeout( doScrollCheck, 50 );
+ }
+
+ // detach all dom ready events
+ detach();
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ })();
+ }
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || type !== "function" &&
+ ( length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( list && ( !fired || stack ) ) {
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var action = tuple[ 0 ],
+ fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = core_slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+ if( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+jQuery.support = (function() {
+
+ var support, all, a,
+ input, select, fragment,
+ opt, eventName, isSupported, i,
+ div = document.createElement("div");
+
+ // Setup
+ div.setAttribute( "className", "t" );
+ div.innerHTML = "
a";
+
+ // Support tests won't run in some limited or non-browser environments
+ all = div.getElementsByTagName("*");
+ a = div.getElementsByTagName("a")[ 0 ];
+ if ( !all || !a || !all.length ) {
+ return {};
+ }
+
+ // First batch of tests
+ select = document.createElement("select");
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName("input")[ 0 ];
+
+ a.style.cssText = "top:1px;float:left;opacity:.5";
+ support = {
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ getSetAttribute: div.className !== "t",
+
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: div.firstChild.nodeType === 3,
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName("tbody").length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName("link").length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ style: /top/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: a.getAttribute("href") === "/a",
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.5/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+ checkOn: !!input.value,
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Tests for enctype support on a form (#6743)
+ enctype: !!document.createElement("form").enctype,
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>",
+
+ // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+ boxModel: document.compatMode === "CSS1Compat",
+
+ // Will be defined later
+ deleteExpando: true,
+ noCloneEvent: true,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableMarginRight: true,
+ boxSizingReliable: true,
+ pixelPosition: false
+ };
+
+ // Make sure checked status is properly cloned
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode( true ).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<9
+ try {
+ delete div.test;
+ } catch( e ) {
+ support.deleteExpando = false;
+ }
+
+ // Check if we can trust getAttribute("value")
+ input = document.createElement("input");
+ input.setAttribute( "value", "" );
+ support.input = input.getAttribute( "value" ) === "";
+
+ // Check if an input maintains its value after becoming a radio
+ input.value = "t";
+ input.setAttribute( "type", "radio" );
+ support.radioValue = input.value === "t";
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "checked", "t" );
+ input.setAttribute( "name", "t" );
+
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( input );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<9
+ // Opera does not clone events (and typeof div.attachEvent === undefined).
+ // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+ if ( div.attachEvent ) {
+ div.attachEvent( "onclick", function() {
+ support.noCloneEvent = false;
+ });
+
+ div.cloneNode( true ).click();
+ }
+
+ // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
+ for ( i in { submit: true, change: true, focusin: true }) {
+ div.setAttribute( eventName = "on" + i, "t" );
+
+ support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container, marginDiv, tds,
+ divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+ body = document.getElementsByTagName("body")[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ container = document.createElement("div");
+ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+ body.appendChild( container ).appendChild( div );
+
+ // Support: IE8
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ div.innerHTML = "
t
";
+ tds = div.getElementsByTagName("td");
+ tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Support: IE8
+ // Check if empty table cells still have offsetWidth/Height
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+ // Check box-sizing and margin behavior
+ div.innerHTML = "";
+ div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+ support.boxSizing = ( div.offsetWidth === 4 );
+ support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
+ if ( window.getComputedStyle ) {
+ support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+ support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ marginDiv = div.appendChild( document.createElement("div") );
+ marginDiv.style.cssText = div.style.cssText = divReset;
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+
+ support.reliableMarginRight =
+ !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+ }
+
+ if ( typeof div.style.zoom !== core_strundefined ) {
+ // Support: IE<8
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ div.innerHTML = "";
+ div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+ // Support: IE6
+ // Check if elements with layout shrink-wrap their children
+ div.style.display = "block";
+ div.innerHTML = "";
+ div.firstChild.style.width = "5px";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+ if ( support.inlineBlockNeedsLayout ) {
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ // Support: IE<8
+ body.style.zoom = 1;
+ }
+ }
+
+ body.removeChild( container );
+
+ // Null elements to avoid leaks in IE
+ container = div = tds = marginDiv = null;
+ });
+
+ // Null elements to avoid leaks in IE
+ all = select = fragment = opt = a = input = null;
+
+ return support;
+})();
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, ret,
+ internalKey = jQuery.expando,
+ getByName = typeof name === "string",
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+ return;
+ }
+
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ cache[ id ] = {};
+
+ // Avoids exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( getByName ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var i, l, thisCache,
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split(" ");
+ }
+ }
+ } else {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
+
+ for ( i = 0, l = name.length; i < l; i++ ) {
+ delete thisCache[ name[i] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
+ }
+ }
+
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
+
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+ delete cache[ id ];
+
+ // When all else fails, null
+ } else {
+ cache[ id ] = null;
+ }
+}
+
+jQuery.extend({
+ cache: {},
+
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name );
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ // Do not set data on non-element because it will not be cleared (#8335).
+ if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+ return false;
+ }
+
+ var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ // nodes accept data unless otherwise specified; rejection can be conditional
+ return !noData || noData !== true && elem.getAttribute("classid") === noData;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var attrs, name,
+ elem = this[0],
+ i = 0,
+ data = null;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
+
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
+
+ if ( !name.indexOf( "data-" ) ) {
+ name = jQuery.camelCase( name.slice(5) );
+
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ return jQuery.access( this, function( value ) {
+
+ if ( value === undefined ) {
+ // Try to fetch any internally stored data first
+ return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+ }
+
+ this.each(function() {
+ jQuery.data( this, key, value );
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ var name;
+ for ( name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray(data) ) {
+ queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ hooks.cur = fn;
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while( i-- ) {
+ tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var nodeHook, boolHook,
+ rclass = /[\t\r\n]/g,
+ rreturn = /\r/g,
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
+ ruseDefault = /^(?:checked|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ name = jQuery.propFix[ name ] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[ name ] = undefined;
+ delete this[ name ];
+ } catch( e ) {}
+ });
+ },
+
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+ elem.className = jQuery.trim( cur );
+
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = arguments.length === 0 || typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+ elem.className = value ? jQuery.trim( cur ) : "";
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.match( core_rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ // Toggle whole class name
+ } else if ( type === core_strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery._data( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var ret, hooks, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val,
+ self = jQuery(this);
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, self.val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map(val, function ( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // oldIE doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var values = jQuery.makeArray( value );
+
+ jQuery(elem).find("option").each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ },
+
+ attr: function( elem, name, value ) {
+ var hooks, notxml, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === core_strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( notxml ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+
+ // In IE9+, Flash objects don't have .getAttribute (#12945)
+ // Support: IE9+
+ if ( typeof elem.getAttribute !== core_strundefined ) {
+ ret = elem.getAttribute( name );
+ }
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( core_rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( rboolean.test( name ) ) {
+ // Set corresponding property to false for boolean attributes
+ // Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
+ if ( !getSetAttribute && ruseDefault.test( name ) ) {
+ elem[ jQuery.camelCase( "default-" + name ) ] =
+ elem[ propName ] = false;
+ } else {
+ elem[ propName ] = false;
+ }
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ } else {
+ jQuery.attr( elem, name, "" );
+ }
+
+ elem.removeAttribute( getSetAttribute ? name : propName );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ propFix: {
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ "for": "htmlFor",
+ "class": "className",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ cellpadding: "cellPadding",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ usemap: "useMap",
+ frameborder: "frameBorder",
+ contenteditable: "contentEditable"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ return ( elem[ name ] = value );
+ }
+
+ } else {
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ return elem[ name ];
+ }
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ var attributeNode = elem.getAttributeNode("tabindex");
+
+ return attributeNode && attributeNode.specified ?
+ parseInt( attributeNode.value, 10 ) :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+ }
+ }
+});
+
+// Hook for boolean attributes
+boolHook = {
+ get: function( elem, name ) {
+ var
+ // Use .prop to determine if this attribute is understood as boolean
+ prop = jQuery.prop( elem, name ),
+
+ // Fetch it accordingly
+ attr = typeof prop === "boolean" && elem.getAttribute( name ),
+ detail = typeof prop === "boolean" ?
+
+ getSetInput && getSetAttribute ?
+ attr != null :
+ // oldIE fabricates an empty string for missing boolean attributes
+ // and conflates checked/selected into attroperties
+ ruseDefault.test( name ) ?
+ elem[ jQuery.camelCase( "default-" + name ) ] :
+ !!attr :
+
+ // fetch an attribute node for properties not recognized as boolean
+ elem.getAttributeNode( name );
+
+ return detail && detail.value !== false ?
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ // IE<8 needs the *property* name
+ elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+ // Use defaultChecked and defaultSelected for oldIE
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+ }
+
+ return name;
+ }
+};
+
+// fix oldIE value attroperty
+if ( !getSetInput || !getSetAttribute ) {
+ jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return jQuery.nodeName( elem, "input" ) ?
+
+ // Ignore the value *property* by using defaultValue
+ elem.defaultValue :
+
+ ret && ret.specified ? ret.value : undefined;
+ },
+ set: function( elem, value, name ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ // Does not return so that setAttribute is also used
+ elem.defaultValue = value;
+ } else {
+ // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+ return nodeHook && nodeHook.set( elem, value, name );
+ }
+ }
+ };
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+ // Use this for any attribute in IE6/7
+ // This fixes almost every IE6/7 issue
+ nodeHook = jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
+ ret.value :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ // Set the existing or create a new attribute node
+ var ret = elem.getAttributeNode( name );
+ if ( !ret ) {
+ elem.setAttributeNode(
+ (ret = elem.ownerDocument.createAttribute( name ))
+ );
+ }
+
+ ret.value = value += "";
+
+ // Break association with cloned elements by also using setAttribute (#9646)
+ return name === "value" || value === elem.getAttribute( name ) ?
+ value :
+ undefined;
+ }
+ };
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ get: nodeHook.get,
+ set: function( elem, value, name ) {
+ nodeHook.set( elem, value === "" ? false : value, name );
+ }
+ };
+
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+ // This is for removals
+ jQuery.each([ "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ set: function( elem, value ) {
+ if ( value === "" ) {
+ elem.setAttribute( name, "auto" );
+ return value;
+ }
+ }
+ });
+ });
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ get: function( elem ) {
+ var ret = elem.getAttribute( name, 2 );
+ return ret == null ? undefined : ret;
+ }
+ });
+ });
+
+ // href/src property should get the full normalized URL (#10299/#12915)
+ jQuery.each([ "href", "src" ], function( i, name ) {
+ jQuery.propHooks[ name ] = {
+ get: function( elem ) {
+ return elem.getAttribute( name, 4 );
+ }
+ };
+ });
+}
+
+if ( !jQuery.support.style ) {
+ jQuery.attrHooks.style = {
+ get: function( elem ) {
+ // Return undefined in the case of empty string
+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
+ // .cssText, that would destroy case senstitivity in URL's, like in "background"
+ return elem.style.cssText || undefined;
+ },
+ set: function( elem, value ) {
+ return ( elem.style.cssText = value + "" );
+ }
+ };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ return null;
+ }
+ });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+ jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ get: function( elem ) {
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+ };
+ });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ });
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+ var tmp, events, t, handleObjIn,
+ special, eventHandle, handleObj,
+ handlers, type, namespaces, origType,
+ elemData = jQuery._data( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+ var j, handleObj, tmp,
+ origCount, t, events,
+ special, handlers, type,
+ namespaces, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+ var handle, ontype, cur,
+ bubbleType, special, tmp, i,
+ eventPath = [ elem || document ],
+ type = core_hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ event.isTrigger = true;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+ event.preventDefault();
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, ret, handleObj, matched, j,
+ handlerQueue = [],
+ args = core_slice.call( arguments ),
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var sel, handleObj, matches, i,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG