js js杂记

//1 创建正则表达式两种方式
//1.1 用new
var box = new RegExp(‘Box‘);//第1个参数模式是必须的
alert(box);//[/Box/] 两个反斜杠是正则表达式的字面量表示形成

var box =  new RegExp(‘Box‘,‘gi‘);//第2个模式修饰符参数可选 i:忽略大小写 g:全局匹配 m:多行匹配

//1.2 用字面量的形式
var box = /Box/;
var box = /Box/gi;

//test()
var pattern = new RegExp(‘Box‘);//模式
var str = ‘box‘;//测试字符串
alert(pattern.test(str));//[false] 大小写不一致

var pattern = new RegExp(‘Box‘,‘i‘);//模式
var str = ‘box‘;//测试字符串
alert(pattern.test(str));//[true] 忽略大小写

var pattern = /Box/i;//模式
var str = ‘box‘;//测试字符串
alert(pattern.test(str));//[true] 忽略大小写

alert(/Box/i.test(‘box‘));//[true] 忽略大小写

var pattern = /Box/i;
var str = ‘This is a box!‘;
alert(pattern.test(str));//[true] 字符串中是否包含正则中的Box忽略大小写

//exec()
var pattern = /Box/i;
var str = ‘box‘;
alert(pattern.exec(str));//[box] 返回的是数组,数组有值则返回数组的值,否则返回null
alert(typeof pattern.exec(str));//[object]

var pattern = /Box/i;
var str = ‘sss‘;
alert(pattern.exec(str));//[null]

//使用String对象的4个正则表达式方法
//match()
var pattern = /Box/i;//没有开启全局
var str = ‘This is a Box! That is a Box!‘;
alert(str.match(pattern));//[Box] 返回数组,匹配到第一个字符串Box

var pattern = /Box/ig;//开启全局
var str = ‘This is a Box! That is a Box!‘;
alert(str.match(pattern));//[Box,Box] 返回数组,匹配到所有字符串Box

var pattern = /Box/ig;//g无效
var str = ‘This is a Box! That is a Box!‘;
alert(str.search(pattern));//[10] 返回第一个匹配到的Box位置

var pattern = /xox/ig;//g无效
var str = ‘This is a Box! That is a Box!‘;
alert(str.search(pattern));//[-1] 找不到返回-1

var pattern = /Box/i;//没有开启全局
var str = ‘This is a Box! That is a Box!‘;
alert(str.replace(pattern,‘Pen‘));//[This is a Pen! That is a Box!]

var pattern = /Box/ig;//开启全局
var str = ‘This is a Box! That is a Box!‘;
alert(str.replace(pattern,‘Pen‘));//[This is a Pen! That is a Pen!]

var pattern = /!/ig;//开启全局
var str = ‘This is a Box! That is a Box!‘;
alert(str.split(pattern));//[This is a Pen,That is a Pen,]

//静态属性
var pattern = /google/i;
var str = ‘This is a google!‘;
str.test(pattern);
alert(RegExp.input);//[This is a google!]//$_ :当前被匹配的字符串
alert(RegExp[‘$_‘]);//[This is a google!]//所有的都可以用这种形式的短名
alert(RegExp.$_);//[This is a google!]//这个短名使用是input的特殊用法,其他不可.
alert(RegExp.leftContext);//[This is a] //$` :最后一次匹配前的字符串
alert(RegExp.rightContext);//[!] //$‘ :上次匹配的字符串之后
alert(RegExp.lastMatch);//[google]//$& :最后一个被匹配的字符串
alert(RegExp.lastParen);//var pattern = /(g)oogle/i;--->[g] //$+ :最后一对圆括号,分组
alert(RegExp.multiline);//[false] (是否支持多行) //$* :用于指定是否所有的表达式都用于多行的布尔值

//实例属性
var pattern = /google/;
alert(pattern.global)//false
var pattern = /google/g;
alert(pattern.global)//true

var pattern = /google/;
alert(pattern.ignoreCase)//false
var pattern = /google/i;
alert(pattern.ignoreCase)//true

var pattern = /google/;
alert(pattern.multiline)//false
var pattern = /google/m;
alert(pattern.multiline)//true //ie不支持multiline属性,很多的浏览器也不支持该属性,基本废弃

var pattern = /google/igm;
alert(pattern.source)//google

var pattern = /google/g;//如果没有开启全局,ie和其他浏览器匹配位置可能不一样
var str = ‘google google google‘;
pattern.test(str);
alert(pattern.lastIndex)//6
pattern.test(str);
alert(pattern.lastIndex)//13
pattern.test(str);
alert(pattern.lastIndex)//20

pattern.lastIndex = 100;//设置lastIndex的值

//获取控制
var patter = /g.ogle/;//.任意字符
var patter = /go*gle/;//*0个,1个或者多个o
var patter = /go+gle/;//+1个或者多个o
var patter = /go?gle/;//? 0个或者1个o
var patter = /g.?gle/;//.? 0个或者1个任意字符
var patter = /go{2}gle/;//{2} 2个o
var patter = /go{2,4}gle/;//{2,4} 2~4个o
var patter = /go{2,}gle/;//{2,} 2个o或者2个以上
var patter = /[a-z]oogle/;//[a-z] a-z中的任意一个字符
var patter = /[A-Z]oogle/;//[A-Z] A-Z中的任意一个字符
var patter = /[0-9]oogle/;//[0-9]0-9中的任意一个字符
var patter = /[0-9]*oogle/;//[0-9]* 0-9中的任意一个字符任意次
var patter = /[0-9a-zA-Z]oogle/;//[0-9a-zA-Z]0-9 a-z A-Z中的任意一个字符
var patter = /[^0-9]oogle/;//[^0-9]0-9之外的任意一个字符
var patter = /^[0-9]oogle/;//^[0-9]以0-9中的任意一个字符oogle开头
var patter = /^google$/;//以google开头并且以google结尾 ^首匹配,$尾匹配
var patter = /\woogle/;//\w 匹配数字,字母和_
var patter = /\Woogle/;//\W \w之外
var patter = /\doogle/;//\d 匹配数字
var patter = /\Woogle/;//\D \d之外
var patter = /goo gle/;//直接使用空格匹配
var patter = /goo\sgle/;//\s空格匹配
var patter = /goo\bgle/;//\b表示到达边界
var patter = /google|baidu|bing/;//|表示或选择包含模式
var patter = /google{4,8}/;//e可以重复4到8次
var patter = /(google){4,8}/;//google可以重复4到8次

var pattern = /8(.*)8/;
var str = ‘This is a 8google8‘;
pattern.test(str);
alert(RegExp.$1)//google
document.write(str.replace(pattern,‘<strong>$1</strong>‘))

var pattern = /(.*)\s(.*)/;
var str = ‘baidu google‘;
alert(str.replace(pattern,‘$2 $1‘))//google baidu

var pattern = /[a-z]+/;
var str = ‘abcdef‘;
alert(str.replace(pattern,‘贪婪‘))//贪婪

var pattern = /[a-z]+?/;
var str = ‘abcdef‘;
alert(str.replace(pattern,‘惰性‘))//惰性bcef

var pattern = /[a-z]+?/g;
var str = ‘abcdef‘;
alert(str.replace(pattern,‘惰性‘))//惰性惰性惰性惰性惰性

var pattern = /8(.*)8/;//贪婪
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(pattern,‘<strong>$1</strong>‘))//<strong>google8 8google8 8google</strong>

var pattern = /8(.*?)8/g;//惰性
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(pattern,‘<strong>$1</strong>‘))
//<strong>google</strong> 8google8 8google8

var pattern = /8(.*?)8/g;//惰性
var str = ‘8google8 8google8 8google8‘;
document.write(str.replace(pattern,‘<strong>$1</strong>‘))
//<strong>google</strong> <strong>google</strong> <strong>google</strong>

var pattern = /(\d+)([a-z]+)/;
var str = ‘123abc‘;
var arr = pattern.exec(str);
//这个叫做捕获性分组,所有的分组都捕获返回.
//arr[0]:匹配到的所有字符串;arr[1]:第一组匹配的字符串;arr[2]:第二组匹配的字符串

var pattern = /(\d+)(?:[a-z]+)/;
var str = ‘123abc‘;
var arr = pattern.exec(str);
//非捕获性分组,第二组不再返回
//arr[0]:匹配到的所有字符串;arr[1]:第一组匹配的字符串

var pattern = /(a?(b?(c?)))/;
var str = ‘abc‘;
alert(pattern.exec(str));
//嵌套分组,从外往内捕获
//a[0]:整个匹配到的字符串abc
//a[1]:匹配第一个分组(a?(b?(c?)))abc
//a[2]:匹配第二个分组(b?(c?))bc
//a[3]:匹配第三个分组(c?)c

var pattern = /goo(?=gle)/;//前瞻性捕获 goo后面必须是gle才能返回goo
var str = ‘good‘;
alert(pattern.exec(str));

//邮政编码:必须是6位,必须是数字,第一位不能为0
var pattern = /[1-9][0-9]{5}/;
var pattern = /[1-9]\d{5}/;

//压缩包:文件名 字母数字_.zip,gz,rar,7z
var pattern = /^[\w\-]+\.(zip|gz|rar)$/;

//删除空格
var pattern = /\s+/g;
‘11 22 33‘.replace(pattern,‘‘);

//删除首位空格
var pattern = ‘/^\s+/‘;
var str = ‘  google and baidu  ‘;
str = str.replace(pattern,‘‘);
pattern = ‘/\s+$/‘;
str = str.replace(pattern,‘‘);

var pattern = ‘/^\s+(.+)\s+$/‘;//贪婪模式
var str = ‘  google and baidu  ‘;
alert(‘--‘ + pattern.exec(str)[1] + ‘--‘); //--google and baidu  --
pattern = ‘/^\s+(.+)\s+$/‘;//惰性模式
alert(‘--‘ + pattern.exec(str)[1] + ‘--‘);//--google and baidu--

pattern = ‘/^\s+(.+)\s+$/‘;//惰性模式
alert(‘--‘ + str.replace(pattern,‘$1‘) + ‘--‘);//--google and baidu--

//电子邮件
var pattern = /^([\w\.\-]+)@([\w\-])\.([a-zA-Z]{2,4})$/;

//第十一章 函数类型
//用变量初始化函数
var box = function(num1,num2){
    return num1+num2;
};
alert(box(1,2));

//使用Function的构造函数,不推荐使用
var box = new Funtion(‘num1‘,‘num2‘,‘return num1+num2‘);
alert(box(1,2));

//函数可以传递函数
function box(mySum,num){
    return mySum(num);
}
function sum(num){
    return 10+num;
}
alert(box(sum,10));//20

function box(num){
    if(num==1){
        return 1;
    }else{
        return num * arguments.callee(num-1);//arguments.callee,调用自身
    }
}
//window是一个对象,而且是js里最大的对象,最外围的对象,window表示全局
alert(window);//[object window]
alert(typeof window)//window
alert(this);//[object window]
alert(typeof this)//window

var color = ‘red‘;//color是全局变量,也是window的属性
alert(window.color);//red
alert(this.color);//red

window.color = ‘red‘;//全局变量
alert(this.color);//red

var box = {
    color:‘blue‘;//局部变量
    getColor : function(){
        alert(this.color);//blue
    }
};

function box(name,age){
    return name + age;
}
alert(box.length);//box.length表示函数接收的参数个数

//prototype的apply()
//apply() 和call()可以冒充另一个函数
function sum(name,age){
    return box.apply(this,[name,age]);//this表示window作用域,[]表示传递的参数
    //or
    //return box.apply(this,arguments);//如果参数太多,可以用arguments代替
}
function sum(name,age){
    return box.apply(this,name,age);//call只是和apply传递参数不一样,其他一样
}
//此时调用sum函数,将会完成与调用box一样的功能

var color = "红色";
var box = {
    color = "蓝色"
};
function sayColor(){
    alert(this.color);
}
sayColor.call(window);//红色
sayColor.call(box);//蓝色

alert(box instanceof Array);
if(){},for(){}//{}没有封闭作用域,其中的变量为全局变量,window的变量
var box = new Object();
box = null; //销毁引用,等待垃圾收集器来清理

var box = "lee";//基本类型->基本包装类型 string -> String 可以调用系统内置的方法,但是不能为自己添加属性和方法
var box1 = new String("lee"); //引用类型可以为自己添加属性和方法
alert(box.subString(2));//e 索引从0开始,表示从第2个位置开始截取到末尾的字符
box.name = ‘zhang‘;//不可以
box1.name = ‘zhang‘;//可以

var box = 1000
box.toLocaleString();// 1,000 本地化
box.toFixed(2);//保留两位小数,并转换成字符串,四舍五入
box.toExponential();//以指数形式输出
box.toPrecision(5);//根据传参来决定指数或者点数(5位有效位,可以转换为指数形式)

var box = "Lee"
box.constructor();//返回String的构造函数
box.charAt(0);//L
box.charCodeAt(0);//76,返回的是ascii码
box.concat("is","teacher")//Lee is teacher
box.slice(1,2);//ee 返回12之间的字符串,2可以省略,默认到尾
box.substring(1,2);//ee 返回12之间的字符串 2可以省略,默认到尾
box.substr(1,2);//ee 从第1个开始,选择两个 2可以省略,默认到尾

box.slice(-2);//从右开始向左两位
box.substring(-2);//返回所有字符串
box.substr(-2);//从右开始向左两位 但是ie遇到负值会把字符串全部返回

box.slice(2,-1);//从2到倒数第二位
box.slice(-2,-1);//从倒数第三位到倒数第二位
box.substring(2,-1);//按(0,2)返回.如果第二个参数为负数,直接转为0,并且把较小的数字提前
box.substr(2,-1);//第二个参数为负数,直接转为0,但是不调整位置 按(2,0)返回,什么也没有
box.indexOf(‘‘);//-1 找不到返回-1
box.indexOf(‘L‘);//0 返回L从出事位置开始的位置
box.indexOf(‘L‘,2);//返回从第二个位置开始向后L第一次出现的位置
box.lastIndexOf(‘L‘,2);//从第二个位置向前搜索L的位置

var boxarr = []
var pos = box.indexOf(‘L‘)

var box = "Mr.Lee";
box.toLowerCase();//小写
box.toUpperCase();//大写
box.toLocaleLowerCase();//本地化小写
box.toLocaleUpperCase();//本地化大写
box.match("L");//找到L返回L,找不到返回null
box.search("L");//找到L的位置 4
box.replace("L","Q");//替换
box.split("\.");//用"."分割成数组
String.fromCharCode(76);//输出ascii码对应的字符
box.localeCompare("lee");//比较大小,相等返回0,大于返回1,小于返回-1
box.link("http://www.baidu.com");//链接网址
box.bold();//加粗

var box = "//lee李";
encodeURI(box);//对中文编码
encodeURIComponent(box);//对特殊字符(//)和中文编码
decodeURI(box);//对中文解码
decodeURIComponent(box);//对特殊字符(//)和中文解码
eval("var box = 100");//把字符串解析为js代码

Math.E;
Math.PI;
Math.min(1,2,3,4,5,6);
Math.max(1,2,3,4,5,6);
Math.ceil(25.1);//26向上入
Math.floor(25.9);//25向下舍
Math.round(25.5);//26四舍五入
Math.round(25.4);//25四舍五入
Math.random();//0到1之间的随机数,不包含0和1

第十五章 面向对象与原型
1.创建对象
var box = new Object();
2.添加实例属性
box.name = "Lee";
box.age = 28;
3.添加实例方法
box.run = function(){
    return this.name + this.age + "run()...";
};

工厂模式创建对象:存在对象识别问题
function creatObject(name,age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.run = function(){
        return this.name + this.age + "run()...";
    };//or[this.run = new Function("return this.run + this.age + ‘run()...‘");]
    return obj;
}
var  myBox1 = createObject("Lee",28);
var  myBox2 = createObject("Lee",28);

构造函数创建对象:解决对象识别问题
function Box(name,age){
    this.name = name;
    this.age = age;
    this.run = function(){
        return this.name + this.age + "run()...";
    };
}
var  myBox1 = new Box("Lee",28);
var  myBox2 = new Box("Lee",28);

对象冒充
var o = new Object();
Box.call(o,"Lee",28);//o冒充Box,具备Box的属性和功能
o.run();//所以o可以调用Box的run方法

把构造函数中的方法通过全局函数来实现引用地址相等,但是破坏了封装性,不推荐
function Box(name,age){
    this.name = name;
    this.age = age;
    this.run = run;
}
function run(){
        return this.name + this.age + "run()...";
}
var  myBox1 = new Box("Lee",28);
var  myBox2 = new Box("Lee",28);
alert(myBox1.run == myBox2.run); //true;

原型属性和原型方法共享
function Box(){}
1.添加原型属性
Box.prototype.name = "Lee";
Box.prototype.age = 28;
2.添加原型方法
Box.prototype.run = function(){
    return this.name + this.age + ‘run()...‘;
};
var  myBox1 = new Box("Lee",28);
var  myBox2 = new Box("Lee",28);
myBox1.__proto__ :指向原型对象的指针
Box.prototype
myBox1.constructor:构造属性,可以获取到构造函数

判定一个对象实例是不是指向了原型对象
Box.prototype.isPrototypeOf(myBox1);//true

删除实例属性
delete myBox1.name;
删除原型属性
delete Box.prototype.name;
覆盖
Box.prototype.name = "KK";
判断实例属性中是否存在指定属性
myBox1.hasOwnProperty("name");
实例属性或者原型属性中是否存在指定属性
alert("name" in myBox1);

使用字面量的方式创建原型对象
function Box(){}
Box.prototype = {
    name : "Lee",
    age : 10,
    fun : function(){
        return this.name + this.age;
    }
};
var myBox = new Box();
字面量创建原型对象使用constructor属性指向Object,构造函数创建原型对象使用constructor属性指向Box.
因为Box.prototype={};这种写法其实是创建了一个新对象.

alert(myBox1.constructor);//function Box(){...}
alert(myBox.constructor);//function Object(){...}

function Box(){}
Box.prototype = {
    constructor : Box,
    name : "Lee",
    age : 10,
    fun : function(){
        return this.name + this.age;
    }
};
var myBox = new Box();
alert(myBox.constructor == Box);//true

Box.prototype = {...}重写会切断实例与原来原型的关系.

数组排序
var box = [5,3,4,2,1];
box.sort();
box.push(6);
alert(box);//1,2,3,4,5,6

查看sort是否是Array原型对象里的方法
alert(Array.prototype.sort);

String.prototype.addString = function(){
    return this + ",被添加了!";
}
var box = "Lee";
alert(box.addString());//"Lee,被添加了!"

组合构造函数和原型模式
function Box(name,age){//保持独立的用构造函数
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘,‘姐姐‘];
}
Box.prototype = {//保持共享的用原型
    constructor : Box,
    run : function(0{
        return this.name + this.age;
    }
}

动态原型模式,把原型封装到构造函数里
function Box(name,age){//保持独立的用构造函数
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘,‘姐姐‘];
    //原型初始化只有第一次才执行.
    if(typeof this.run != ‘function‘){
        Box.prototype.run = function(){
            return this.name + this.age;
        };
    }
}

寄生构造函数 = 工厂模式 + 构造函数
function Box(name,age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.run = function(){
        return this.name + this.age;
    };
    return obj;
}
var box = new Box("Lee",28);

稳妥构造函数
function Box(name,age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.run = function(){
        return this.name + this.age;
    };
    return obj;
}
var box1 = Box("Lee",28);//不能使用new

//继承
function Box(){
    this.name = "Lee";
}
function Desk(){
    this.age = 100;
}
//通过原型链继承,超类型实例化后的对象实例,赋值给与类型的原型属性
//new Box()会将Box构造里的信息和原型里的信息都交给Desk
//Desk得到了Box的构造和原型里的信息
Desk.prototype = new Box();

function Box(){
    this.name = "Lee";//L1
}
Box.prototype.name = "Jack";
function Desk(){
    this.age = 100;
}
Desk.prototype = new Box();
var desk = new Desk();
alert(desk.name);//Lee就近原则,如果L1(实例属性)没有,打印出Jack()原型属性

使用对象冒充,只能继承构造里的实例属性,不能继承原型属性
function Box(name,age){
    this.name = name;
    this.age = age;
    this.family = [‘哥哥‘,‘姐姐‘,‘妹妹‘];//引用类型在构造里不会被共享

}
Box.prototype.run = function(0{
    return this.name + this.age;
}
function Desk(name,age){
    Box.call(this,name,age)
}
var desk = new Desk(‘Lee‘,28);
//添加原型链继承
Desk.prototype = new Box();//出错后添加

alert(desk.name);
alert(desk.family);
alert(desk.run());//出错,因为继承不到原型里的方法,故加上原型链继承,称为组合继承

//原型式继承
//临时中转函数
function obj(o){//o表示将要传递进入的一个对象
    function F(){}//F构造是一个临时新建的对象,用来存储传递过来的对象
    F.prototype = o;//将o对象实例赋值给F构造的原型对象
    return new F();//最后返回这个得到传递过来对象的对象实例
}

var box = {
    name : "Lee",
    age : 100,
    family : [‘哥哥‘,‘姐姐‘,‘妹妹‘]//共享
};
//myBox就等于new F()
var myBox = obj(box)

寄生式继承 = 原型式 + 工厂模式,目的是为了封装函数继承的过程
//临时中转函数
function obj(o){//o表示将要传递进入的一个对象
    function F(){}//F构造是一个临时新建的对象,用来存储传递过来的对象
    F.prototype = o;//将o对象实例赋值给F构造的原型对象
    return new F();//最后返回这个得到传递过来对象的对象实例
}
//寄生函数
function create(o){
    var f = obj(o);
    f.run = function(){
        return this.name;
    };
    return f;
}

var box = {
    name : "Lee",
    age : 100,
    family : [‘哥哥‘,‘姐姐‘,‘妹妹‘]//共享
};
var myBox = create(box);

寄生组合函数
//临时中转函数
function obj(box,desk){//o表示将要传递进入的一个对象
    function F(){}//F构造是一个临时新建的对象,用来存储传递过来的对象
    F.prototype = o;//将o对象实例赋值给F构造的原型对象
    return new F();//最后返回这个得到传递过来对象的对象实例
}
//寄生函数
function create(o){
    var f = obj(box.prototype);
    f.constructor = desk;//调整构造指针
    desk.prototype = f;
}
function Box(name,age){
    this.name = name;
    this.age = age;
}
Box.prototype.run = function(){
    return this.name + this.age;
}
function Desk(name,age){
    Box.call(this,name,age);//对象冒充
}

通过寄生组合继承来实现继承
create(Box,Desk);

第十六章 匿名函数和闭包
把匿名函数赋值给变量
var box = funtion (){
    return "Lee";
};
alert(box());
通过自我执行来执行匿名函数(匿名函数)();
(function(){alert("Lee");})();
var box = (function(){return "Lee";})();
alert(box);

匿名函数自我传参
(function(age){alert(age);})(100);

普通函数里添加匿名函数
function box(){
    return function(){//闭包
        return 10;
    }
}
alert(box()());//10

通过闭包返回局部变量
function box(0{
    var age = 100;
    return function(){
        return age;
    };
}

使用匿名函数实现局部变量驻留内存中从而累加
function box(){
    var age = 100;
    return function(){
        age++;
        return age;
    }
}
var b = box();
alert(b());//101
alert(b());//102
alert(b());//103
b = null;

关于闭包的this对象
var this.name = window;
var box = {
    this.name : "box",
    getThis : function(){
        //var that = this;
        return function(){//闭包函数
            return this.name;
            //return that.name;
        }
    }
}
alert(box.getThis()());//[window]闭包的this指向window
alert(box.getThis().call(box));//对象冒充 [box]

使用块级作用域(私有作用域)
function box(){
    (function(){
        for(var i = 0; i < 5; i++){//包含自我执行的匿名函数,就可以实现私有作用域

        }
    })();
}

function Box(){
    var age = 100;//私有变量
    function run(){//私有函数
        return "运行中";
    }
    this.publicFun = function(){//对外可见的公有接口
        return age + run();
    };
}

var box = new Box();
alert(box.publicFun());

(function(){
    var user = ‘‘;//私有变量
    Box = function(value){
        user = value;
    };//全局,构造函数

    Box.prototype.getUser = function(){//方法共享,user变成了静态属性
        return user;
    }
})();

DOM

if(confirm("请选择!")){//有确定和取消两个按钮
    alert("刚刚你选择的是确定按钮");
}else{
    alert("刚刚你选择的是取消按钮");
}
//输入提示框
var box = prompt("请输入一个数字",0);//第一个参数是说明文字,第二个参数是默认值,返回结果是输入的内容
if(box != null){
    alert("你刚刚输入的内容是" + box);
}else{
    alert("你刚刚什么也没有输入!");
}
pint();
find();
defaultStatus = "Lee";//状态栏默认值
status = "Lee";//状态栏设置值

open(...)
第一个参数:导航到的url
第二个参数:窗口的名称或者目标,命名可以给新窗口设置一个名称,相同名称的URL在同一个窗口打开
            目标:_blank:新建一个窗口
                _parent:在本窗口加载
第三个参数:特定的字符串,表示各种窗口的配置功能
            width,height,top,left
            location:显示地址栏
            status,toolbar:工具条

var box = open()返回子窗口的window
box.alert();子窗口弹出的

window.opener.document.write("子窗口控制该语句,在父窗口输出")

screenLeft//火狐不认识该属性-->screenX(ie不支持该属性)
screenTop//火狐不认识该属性--->screenY(ie不支持该属性)
如果跨浏览器可以进行判定
var leftX = typeof window.screenLeft == ‘number‘ ? window.screenLeft : window.screenX;
var topY = typeof window.screenTop == ‘number‘ ? window.screenTop : window.screenY;

innerWidth//ie不支持该属性
innerHeight//ie不支持该属性
outerWidth//ie不支持该属性
outerHeigth//ie不支持该属性
document.documentElement.clientWidth//ie支持该属性
document.documentElement.clientHeight//ie支持该属性
跨浏览器获取可视范围的页面窗口
var width = window.innerWidth;
var heigth = window.innerHeigth;
if(typeof width != ‘number‘){
    if(document.compatMode == ‘CSS1Compat‘){//biaozhun
        width = document.documentElement.clientWidth
        heigth = document.documentElement.clientHeight
    }else{
        width = document.body.clientWidth;
        heigth = document.body.clientHeigth;
    }
}

moveTo(100,100);//把窗口移动到坐标100,100位置 3.x火狐支持,新版不支持
moveBy(10,10);//10,10的移动ie原版支持,谷歌新版不支持
resizeTo(200,200);//调整窗口大小为200,200
resizeBy(-10,-10);//按10,10逐步减小窗口

间歇调用和超时调用
setTimeout("alert(‘Lee‘)",2000);
//第一个参数是需要执行的代码.可以是字符串,因为它有解析功能.第二个参数是间隔时间,单位为毫秒

function box(){
    alert(‘Lee‘);
}
setTimeout(box,2000);//box不需要()
以上都不推荐,第一种容易出错,不容易扩展;第二种封装行不好,代码分离.推荐以下写法
setTimeout(function(){
    alert("Lee");
},2000)

var box = setTimeout(function(){//返回值是超时调用的ID
    alert("Lee");
},2000)//[2]

clearTimeout(box);//取消超时调用

var box = setInterval(function(){//间歇调用

},1000)
clearInterval(box);//取消间歇调用

window.location
window.document.location

location.hash = ‘#66‘//会跳转到新的包含#66的URL,
location.port = 8888; //会跳转到端口为8888的
location.search = ‘?id=5‘; //如果设置search会不停地跳转,死循环
location.href = "http://www.baidu.com";跳转到百度
location.assign("http://www.baidu.com");跳转到百度
location.reload(true);重新加载
location.replace("http://www.baidu.com");不产生历史记录的跳转到百度

history.length 历史记录条数
history.back();前一条历史记录
history.forward();后一条历史记录
history.go(num);按num寻找前面或者后面的历史记录

navigator.appName 完整的浏览器名称,但是不精确
navigator.userAgent 用户代理字符串
navigator.platform 浏览器所在系统

插件检测
for(var i =0; i < navigator.plugins.length; i++){
    document.write(‘插件名‘ + navigator.plugins[i].name);
    document.write(‘文件名‘ + navigator.plugins[i].filename);
    document.write(‘描  述‘ + navigator.plugins[i].description);
}

检测非ie浏览器插件是否存在
function hasPlugin(name){
    var name = name.toLowerCase();
    for(var i = 0; i < navigator.plugins.length; i++){
        if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){
            return true;
        }
    }
    return false;
}

检测ie浏览器的控件
function hasIEPlugin(name){
    try{
        new ActiveXObject(name)//name必须是控件的唯一标识ID
        return true;
    }catch(e){
        return false;
    }
}

跨浏览器检测flash是否存在
function hasFlash(){
    //检测非ie浏览器
    var result = hasPlugin("Flash");
    if(!result){
        result = hasIEPlugin("ShockwaveFlash.ShockwaveFlash");//Flash的唯一标识符ID
    }
}

mime类型
遍历非IE下所有mime类型信息
for(var i = 0; i< navigator.mimeTypes.length; i++){
    if(navigator.mimeTypes[i].enabledPlugin != null){
        document.write("<dl>");
        document.write("<dd>类型名称:"+navigator.mimeTypes[i].type+"</dd>");
        document.write("<dd>类型引用:"+navigator.mimeTypes[i].enabledPlugin.name+"</dd>");
        document.write("<dd>类型描述:"+navigator.mimeTypes[i].description+"</dd>");
        document.write("<dd>类型后缀:"+navigator.mimeTypes[i].suffixes+"</dd>");
        document.write("</dl>");
    }
}

能力检测
怪癖检测(bug检测)
var box = {
    toString : function(){},//其他浏览器能够答应出toString方法,但是IE不能,因为此toString和原型里的toString方法重名,所以不打印
    myToString : function(){}
};
for(var o in box){
    alert(o);//ie只打印出myToString
}
用户代理检测
var client = function () {                    //创建一个对象

    //引擎
    var engine = {
        ie : false,                                    //这个属性用于确定是否是IE引擎
        gecko : false,
        webkit : false,
        khtml : false,
        opera : false,

        //引擎的版本
        ver : 0
    };

    //浏览器
    var browser = {
        ie : false,
        firefox : false,
        chrome : false,
        safari : false,
        opera : false,

        //浏览器的版本号
        ver : 0,
        //浏览器通用名称
        name : ‘‘
    };

    //系统
    var system = {
        win : false,
        mac : false,
        x11 : false,

        //系统名称
        sysname : ‘‘
    };

    //核心检测程序区
    var ua = navigator.userAgent;
    var p = navigator.platform;

    if (p.indexOf(‘Win‘) == 0) {
        system.win = true;                        //用于确定是windows系统
        system.sysname = ‘Windows‘;
    } else if (p.indexOf(‘Mac‘) == 0) {
        system.mac = true;                        //用于确定是Mac系统
        system.sysname = ‘Macintosh‘;
    } else if (p == ‘X11‘ || p.indexOf(‘Linux‘) == 0) {
        system.x11 = true;                        //用于确定是Mac系统
        system.sysname = ‘Linux‘;
    }

    if (window.opera) {
        engine.opera = browser.opera = true;                //表示确定opera引擎
        engine.ver = browser.ver = window.opera.version();
        browser.name = ‘Opera‘;
    } else if (/AppleWebKit\/(\S+)/.test(ua)) {
        engine.webkit = true;                //表示确定webkit引擎
        engine.ver = RegExp[‘$1‘];
        if (/Chrome\/(\S+)/.test(ua)) {
            browser.chrome = true;
            browser.ver = RegExp[‘$1‘];
            browser.name = ‘Chrome‘;
        } else {
            browser.safari = true;
            if (/Version\/(\S+)/.test(ua)) browser.ver = RegExp[‘$1‘];
            browser.name = ‘Safari‘;
        }
    } else if (/rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)) {
        engine.gecko = true;                //表示确定gecko引擎
        engine.ver = RegExp[‘$1‘];
        if (/Firefox\/(\S+)/.test(ua)) {
            browser.firefox = true;
            browser.ver = RegExp[‘$1‘];
            browser.name = ‘Firefox‘;
        }
    } else if (/MSIE ([^;]+)/.test(ua)) {
        engine.ie = browser.ie = true;                        //表示确定ie引擎
        engine.ver = browser.ver = RegExp[‘$1‘];
        browser.name = ‘Internet Explorer‘;
    }

    return {                                        //返回一个对象,可以同时返回引擎,浏览器和系统的对象
        engine : engine,                        //前一个engine是属性,后一个engine是对象值
        browser : browser,
        system : system
    }

}();                                                    //自我执行,并赋值

alert(client.system.sysname + ‘|‘ +client.browser.name + client.browser.ver);

window.onload = function(){
    var box = doument.getElementById("box")
    box.tagName;标签名
    box.innerHTML;获取标签的文本,包含HTML标签
    box.innerHTML = "";    赋值
    box.style.color;获取style属性中的color值
    box.className;class为保留字,所以用className代替class
    自定义属性直接获取非ie浏览器不支持

    var li = document.getElementsByTagName("li");参数是一个标签名
    li.length;返回一个数组集合,获取长度
    li[0];
    li.item(0);
    li.item(0).innerHTML
    var all = document.getElementsByTagName("*");获取所有的标签
    火狐浏览器的firebug打开后,会自动生成一个div,所以获取的标签会多一个
    ie浏览器多一个节点,是把<!..>文档声明也算进去了

    var box = document.getElementsByName("test");
    box.getAttribute(‘style‘);非ie返回style的字符串,ie返回对象
    box.getAttribute(‘class‘);非ie可以获取到,ie需要用className获取
    box.getAttribute("onclick");ie7及以下会返回函数式,非ie返回字符串
    通过这中方法可以获取自定义的属性

    box.setAttribute("style","color:red")ie7及以下,style和onclick没有效果,避免使用
    box.removeAttribute("style")ie7以上才具有

    box.nodeName; 获取元素节点的标签名,和tagName等价
    box.nodeType; 获取元素节点的类型值 1元素 2属性 3文本
    box.nodeValue; 获取文本节点的文本内容,没有返回null

    box.childNodes //NodeList集合,返回当前节点的所有子节点
    box.firstChild.nodeValue;//获取第一个子节点
    box.lastChild.nodeValue;//获取最后一个子节点
    box.ownerDocument;//返回文档对象,也就是根节点

    box.parentNode;//父节点
    box.previousSibling;//前一个兄弟节点
    box.nextSibling;//后一个兄弟节点
    box.attributes;//集合数组,保存这个元素节点的属性列表 从后向前罗列属性
    box.attributes[0];
    box.attributes[‘id‘];

    document.write("测试");
    var p = document.createElement("p");//创建一个p节点
    box.appendChild(p);//添加到box的子节点列表的最后
    var text = document.createTextNode("测试");
    p.appendChild(text);//把文本添加到p节点里

    box.parentNode.insertBefore(p,box);//在box前面添加一个节点p
    var span = document.createElement(‘span‘);
    box.parentNode.replaceChild(p,span);//把p标签替换成span标签

    var clone = box.firstChild.cloneNode(true);//true克隆标签和其内容 ,false 只克隆标签
    box.appendChild(clone);
    box.removeChild(box.firstChild)
}

dom进阶
Node类型
window.onload = function(){
    alert(Node);//ie不支持,可以添加一个全局的Node对象 window.Node={ELEMENT_NODE:1,TEXT_NODE:3};
    xxx.nodeType == Node.ELEMENT_NODE;//(Node.ELEMENT_NODE:1)
    xxx.nodeType == Node.TEXT_NODE;//(Node.TEXT_NODE:3)
}

Document类型
document.title :标题
document.URL :URL路径
document.domain :域名,服务器端
document.referrer :上一个URL,服务器端

Text类型
box.normalize();//合并同一级别的文本节点
box.childNodes[0].splitText(3);//把前三个字符分离出来成一个新的节点
box.childNodes[0].deleteData(0,3);//把前三个字符删除
box.childNodes[0].insertData(0,‘Hello‘);//在第一个字符前面插入hello
box.childNodes[0].replaceData(0,2,‘miss‘);//把第0个到2个替换成miss
box.childNodes[0].substringData(0,2);//获取第0个到2个

document.compatMode:浏览器模式分为标准模式(CSS1Compat)和怪异模式(BackCompat)
if(document.compatMode == CSS1Compat){
    alert(document.documentElement.clientWidth);
}else{
    alert(document.body.clientWidth);
}

document.getElementById(‘box‘).scrollIntoView();//每次刷新,都让box处于可见范围内

box.children.length;该children会忽略空白节点

box = document.getElementById(‘box‘);
p = box.firstChild;
box.contains(p);//判定box是不是p的父节点
//火狐旧版本不支持 创建了自己的方法 box.compareDocumentPosition(p);

function contains(refNode,otherNode){
    if( typeof refNode.contains != ‘undefined‘){
        return refNode.contains(otherNode);
    }else if(typeof refNode.compareDocumentPosition == ‘function‘){
        return refNode.compareDocumentPosition(otherNode)>16;
    }
}

box.innerText;//获取文本并过滤掉html,火狐不支持(box.textContent);赋值不解析,html标签原样输出
box.innerHTML;//获取文本不过滤HTML,赋值html标签会被解析.
box.outerText;//和innerText一致
box.outerHTML;//和innerHTML一致
时间: 2024-11-12 16:18:00

js js杂记的相关文章

[Android学习系列2]用webview写界面,加载本地js,js,html文件

以jquery mobile为例 1.在android界面拖入一个webview,然后添加一个internet权限 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.INTERNET"/> <application ........

knockout.js(js)代码在IE中出现“意外地调用了方法或属性”的错误

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 var CartListViewModel = function () {     var self = this;     self.payment = [                 { name: "", value: 1

android 的webview调用php服务器js , js 调用Android的webview

最近项目的需求: Android通过webView调用php的数据 , 这时候是需要整理webview和JavaScript之间相互调用的时候了 一. 理清思路: (1) . 双方都是客户端 , 一个是Android , 一个是js( js当然是客户端 , 后面说明) (2) . Android的webview需要支持JavaScript , 即 WebSettings settings = myWebView.getSettings(); settings.setJavaScriptEnabl

JS~js里实现队列与堆栈

在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一 看一下它们的性质,这种性质决定了它们的使用场合 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出! 二 看一下实现的代码(JS代码) var a=new Array(); a.unshift(1); a.unshift(2);

js问题杂记

问题一: 由于jquery可以动态异步添加页面元素,很多时候我们都不知道一个页面元素什么时候加载完成.常规的jquery的ready和js的document.onload执行是也许我们需要操作的元素还没生成完成.所以我们只能用定时器不断的循环,判断如果元素生成了.则执行我们想要的操作. 1 //页面加载完成是执行 2 $(function () { 3 customTimer(); 4 }); 5 //自定义 定时器(假设div_digg是动态生成) 6 function customTimer

js基础杂记

document.write(); //表示在当前页面上输出内容 如果<script>标签引入了外部文件,那么在这个script标签内就不能在执行其他script代码了.例如<script type="text/javascript" src="xxx.js"></script>的中间再写执行不到哦 如果要输出文本类型的</script>可以用&lt代替左尖括号(<),用&gt代替右尖括号(>

js angularjs 杂记

angular.element(document.querySelector("#hotelAttach"))[0].innerText; angular.forEach(array, function(data,index,arrayCopy){ // array:需要遍历的集合 // data:遍历时当前的数据 // index:遍历时当前索引 // arrayCopy:需要遍历的集合,每次遍历时都会把array原样的传一次. // index,arrayCopy此两个参数可以省去

关于js闭包杂记

闭包:一个函数oneF里return了另一个函数innerF,然后在oneF外面运行了函数innerF,如果innerF里有用到在oneF里定义的变量,则此时依然可以引用到, 但是变量值不是定义函数innerF那时变量的值,而是运行函数innerF时变量的值(此时很可能由于已经运行了函数oneF而导致变量值与定义函数innerF时变量的值不同). function oneF(){ var arr=[]; for(var i=0;i<3;i++){ arr[i]=function(){alert(

JS对象杂记

delete 关键词从对象中删除属性,会同时删除属性的值和属性本身,删除完成后,属性在被添加回来之前是无法使用的, delete 操作符被设计用于对象属性.它对变量或函数没有影响. delete 操作符不应被用于预定义的 JavaScript 对象属性.这样做会使应用程序崩溃. arguments 对象 JavaScript 函数有一个名为 arguments 对象的内置对象.它包含函数调用时使用的参数数组.我们可以方便的使用它来进行一些操作,比如获取最大或最小值. 1 function fin