《JavaScript高级程序设计》补充笔记2

l  有权访问私有变量的公共方法叫做特权方法,共有方法可以使用闭包来实现


私有变量


在构造函数中构造私有方法,能让外部有权访问私有变量,但是必须使用构造函数模式,每次调用都会创建一个新方法


静态私有变量


静态的、所有实例共享属性,使用原型增进代码复用

(1)       私有变量例子:

function Person(name) {

//特权方法

this.getName = function() {

return name;

};

this.setName = function(value) {

name = value;

};

}

var person = new Person("Nicholas");

alert(person.getName()); //"Nicholas"

person.setName("Greg");

alert(person.getName()); //"Greg"

(2)       静态私有变量例子:

(function() {

//私有变量和私有函数

var name = "";

//构造函数

Person = function(value) {

name = value;

};

Person.prototype.getName = function() {

return name;

};

Person.prototype.setName = function(value) {

name = value;

};

})();

var person1 = new Person("Nicholas");

alert(person1.getName()); //"Nicholas"

person1.setName("Greg");

console.info(person1.getName()); //"Greg"

var person2 = new Person("Michael");

console.info(person1.getName()); //"Michael"

console.info(person2.getName()); //"Michael"

l   模式模块--------------------------单例

使用情况:如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法。。。。最终要通过一个对象字面量来表示它,创建公共的方法和属性

比如:

var application = function(){
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//公共
return {
   getComponentCount : function(){
   return components.length;
},
registerComponent : function(component){
  if (typeof component ==
"object"){
     components.push(component);
  }
}
};

}();

l  增强的模块模式

使用情况:适用于单例必须是某种类型的实例

比如:

var application = function(){
//私有变量和函数
var components = new Array();
//初始化
components.push(new BaseComponent());
//创建
application 的一个局部副本
var app = new BaseComponent();
//公共接口
app.getComponentCount = function(){
return components.length;
};
app.registerComponent = function(component){
if (typeof component == "object"){
components.push(component);
}
};return app;

}();

l  查找框架最好使用top【始终指向最外层的框架】,不要使用window,框架可以通过位置索引也可以通过name属性查找。

l  窗口


窗口位置


screenTop、screenLeft—IE、Safari、opera、chrome

screenX、screenY—Firefox、Safari、chrome


var leftPos = (typeof window.screenLeft == "number")?window.screenLeft:window.screenX;

全屏的情况下,浏览器之间会有差异,位置会不一样


窗口移动


moveTo—移动的位置

moveBy—移动的像素

  • opera、IE7+默认禁用

窗口大小


innerHeight

innerWidth

  • outerHeight
  • outerWidth

1、innerHeight、innerWidth容器中页面视图区的大小(减去边框宽度)

2、IE9+、
Safari 和 Firefox中, outerWidth
和 outerHeight 返回浏览器窗口本身的尺寸,Opera示页面视图容器的大小

3、在
Chrome 中, outerWidth、 outerHeight 与
innerWidth、 innerHeight 返回相同的值


调整窗口大小


resizeTo

resizeBy

(1)      
窗口大小

var pageWidth = window.innerWidth,

pageHeight
= window.innerHeight;

if (typeof pageWidth != "number"){

if (document.compatMode
== "CSS1Compat"){//页面视口的信息

pageWidth = document.documentElement.clientWidth;

pageHeight = document.documentElement.clientHeight;

} else {//IE6

pageWidth = document.body.clientWidth;

pageHeight = document.body.clientHeight;

}

}

l  screen


availHeight

availWidth


屏幕的像素高度减系统部件

l  history


go()


go(1)前进一页、go(-1)后退一页

go(-2)后退两页


back()后退一页

forward()前进一页

l  JSON:


JSON对象


与对象字面量相比,没有声明变量,末尾没有分号,并且对象的属性必须加“”


JSON数组


采用数组字面量,可以把数组和对象结合起来


方法


JSON.stringify()


把js对象序列化为JSON字符串


可以接受三个参数,第一个是对象,第二个是过滤器(数组、函数),第三个是数值(字符串缩进的是空格)/字符串(缩进的是字符串)【最长不超过10个】


JSON.parse()


把JSON字符串解析为js对象


可以接受两个参数,第一个是json,第二个是一个function(key,value)


toJSON


放在对象里面,toJSON: function() {return this.title+","+this.authors;},这样对象序列化为JSON的时候就只有toJSON中返回的字符串

DOM

l


Node类型(换行也是一个节点)


nodeType


1、=数值的话,所有浏览器适用

2、=NODE.XXX_NODE的对IE无效


childeNodes(保存着一个NodeList对象)


1、  childeNodes[0]

2、  childeNodes.item(0)

3、  childeNodes.length

4、  将NodeList转换成数组  IE9+

Array.prototype.slice.call(someNode.childNodes,0)


nextSibling下一个子节点

previousSibling上一个子节点

firstChild第一个子节=childeNodes[0]

lastChild最后一个子节点


firstChild = someNode.childeNodes[0]

firstChild = someNode.childeNodes[someNode.length-1]


hasChildNodes()


判断是否包含子节点


appendChild(newNode)


向childNodes末尾添加一个新的节点


insertBefore(newNode,位置)


向childNodes某个位置上添加一个新的节点


replaceChild(newNode,要替换的node)


把childNodes某个位置上的node替换成newNode


removeChild(要移除节点的位置)


cloneNode(true/false)


是否深复制


normalize()


处理文档中的文本节点,有相邻的文本节点合并为一个文本节点,有空白文本节点就删除

(1)      
将NodeList转换成数组

function convertToArray(nodes){
var array = null;
try {
array = Array.prototype.slice.call(nodes, 0); //针对非 IE 浏览器
} catch (ex) {
array = new Array();
for (var i=0, len=nodes.length; i < len; i++){
array.push(nodes[i]);
}
}
return array;

}

l


Document


document.documentElement

document.body

document.doctype(各浏览器存在不同)


documentElement始终指向最外层的元素


document.title

document.URL 完整路径

document.domain 域名


查找元素


document.geiElementById
(IE8+,更早之前的版本会返回null,IE8不区分大小写)

document.geiElementByTagName

document.geiElementByName


一致性检测


document.implementation.hasFeature(“XML”,”1.0”)

l


Element


someElement.tagName

someElement.id

someElement.title

someElement.lang

someElement.dir

someElement.className


标签名

判断的时候最好是:

element.tagName.tolowerCase == “div”


someElement.getAttribute

someElement.setAttribute

someElement.removeAttribute


取得特性,特性名称不区分大小写

someElement.getAttribute(“id”)

取得的特性长度

div.attributes.length

自定义的特性最好加上data-前缀(自定义的特性在IE以外的不存在)


document.createElement(“div”);

.appendChild()

.


createElement在ie中可以直接将完整的元素标签加上属性,但是在IE8以下会出现问题,解决,在(2)

(1)      
获取所有属性

function outputAttributes(element) {

var pairs = new Array(),

attrName,

attrValue,

i,

len;

for (i = 0, len = element.attributes.length;
i < len; i++) {

attrName = element.attributes[i].nodeName;

attrValue = element.attributes[i].nodeValue;

//

if (element.attributes[i].specified) {

pairs.push(attrName +
"=\"" + attrValue + "\"");
}

}

return pairs.join(" ");

}

(2)      
解决IE中自动创建元素产生的问题

if
(client.browser.ie && client.browser.ie <=7){
//创建一个带 name 特性的 iframe 元素
var iframe = document.createElement("<iframe
name=\"myframe\"></iframe>");
//创建 input 元素
var input = document.createElement("<input
type=\"checkbox\">");
//创建 button 元素
var button = document.createElement("<button
type=\"reset\"></button>");
//创建单选按钮
var radio1 = document.createElement("<input
type=\"radio\" name=\"choice\" "+"value=\"1\">");
var radio2 = document.createElement("<input
type=\"radio\" name=\"choice\" "+
"value=\"2\">");
}

l  Text


Text


appendData(“”)

deleteData(offset,count)

insertData(offset,””)

replaceData(offset,count,””)

splitText(offset)

subStringData(offset,count)


将文本添加到节点的末尾


删除


插入


替换


分割


提取


document.createChildNode(“”)


创建文本节点

l  documentFragment


documentFragment


document.createDocuemntFragment()


创建文档片段

l  Attr


Attr


setAttrbuteNode()

getAttrbuteNode()

removeAttrNode()


name

value

special


document.createAttribute(“align”)


传入特性名称,创建新的特性


getAttributeNode()


返回特性的节点,使用的时候要获取到值

getAttributeNode(“align”).value

l  DOM扩展


querySelector()   IE8+


取得匹配的第一个元素


querySelectorAll()   IE8+


取得匹配的所有元素


HTML5新增加的


getElementByClassName  IE9+


classList(firefox/chrome支持)


1、  add(“”),添加类

2、  containes(“”) 判断是否含有这个类

3、  remove(“”) 从类表中删除

4、  toggle(“”) 有就添加,没有就删除


document.activeElement


文档加载期间为null


readyState


document.head


document.charset


自定义属性data-myname


获取值myDiv.dataset.myname


innerHTML

  • outerHTML

元素遍历


childElementCount


返回子元素的的个数,不包括文本和注释


firstElementChild


lastElementChild


previousElementSibling


nextElementSibling

时间: 2024-10-08 10:34:44

《JavaScript高级程序设计》补充笔记2的相关文章

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

JavaScript高级程序设计学习笔记--错误处理与调试

try-catch语句 只要代码中包含finally子句,则无论try或catch语句块中包含什么代码--甚至return语句,都不会阻止finally子句的执行,来看下面这个函数: function testFinally(){ try{ return 2; }catch(error){ return 1; }finally{ return 0; } } 调用这个函数会返回0(PS:但我实际执行的时候会先返回0,再返回2) 抛出错误 与try-catch语句相配的还有一个throw操作符,用于

JavaScript高级程序设计学习笔记--面向对象程序设计

工厂模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用 工厂模式的一种变体. function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var

Javascript高级程序设计学习笔记

3. 基本概念 基本数据类型:Undefined,Null,Boolean,Number,String. 复杂数据类型:Object. 3.6 语句 switch比较值时用的是全等运算符 “===” ,因此不会进行类型转换.例如 “10” 不等于10. 3.7 函数 ECMAScript函数不介意传递进来多少个参数,也不在乎参数的类型.即使定义的函数只接受两个参数,在调用的时候也可以传递任意多个或者0个.因为ECMAScript的参数在内部是用一个数组表示的,在函数体内部可以通过argument

JavaScript高级程序设计学习笔记--高级技巧

惰性载入函数 因为浏览器之间行为的差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中,看看下面来自上一章的createXHR()函数. function createXHR(){ if (typeof XMLHttpRequest != "undefined"){ return new XMLHttpRequest(); } else if (typeof ActiveXObject != "undefined"){ if (typeo

JavaScript高级程序设计学习笔记--DOM

DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口). Document类型 文档的子节点 虽然DOM标准规定Document节点的子节点可以是DocumentType,Element,ProcessingInstruction或Comment,但还有两个内置的访问其子节点的快捷方式.第一个就是documnetElement属性,该属性始终指向HTML页面中的<html>元素.另一个就是通过childNodes列表访问文档元素,但通过documentElement属性则

JavaScript高级程序设计学习笔记--BOM

window对象 BOM的核心对象是window,它表示浏览器的一个实例.在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMScript规定的Global对象. 全局作用域 由于window对象同时扮演着ECMAScript中Global对象的角色,因此所有在全局作用域中声明的变量.函数都会变成window对象的属性和方法.来看下面的例子: var age=29; function sayAge(){ alert(this.age); }

javascript高级程序设计阅读笔记(一)

javascript高级程序设计阅读笔记(一) 工作之余开发些web应用作为兴趣,在交互方面需要掌握javascript和css.HTML5等技术,因此读书笔记是必要的. javascript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 文档对象模型 DOM doc

JavaScript高级程序设计学习笔记--引用类型

Object类型 对象字面量表示法: var person={ name:"Nicholas", age:29, 5:true }; 这人例子会创建一个对象,包含三个属性:name,age和5.但这里的数值属性名会自动转换为字符串. 对象属性的访问:点表示法和方括号语法 alert(person["name"]); // "Nicholas" alert(person.name); // "Nicholas" 从功能上看,这两

《javascript高级程序设计》笔记三

第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计>,更具我自己工作中体会,下面列出一些注意点和有用的东西(⊙o⊙)- ①命名规则.推荐采用驼峰命名.比如:userName. ②块级注释. 1 /* 2 * 推荐块级注释,这里对代码进行注释说明! 3 */ ③JavaScript中采用严格模式.在严格模式下,ECMAScript3中的一些不确定的行为将得到处