Javascript 高级程序设计--总结【三】
******************** Chapter 8 BOM ********************
BOM由浏览器提供商扩展
window:
既是js访问浏览器窗口的接口,又是Global对象
全局变量会成为window 的属性,但是定义全局变量和window属性还是有差别,在于能否通过delete删除
var age = 10;//本质上来说,configurable 属性设置为false, 所以不能delete 删除
window.name = 'test';
delete window.age;//false, IE<9 抛出错误
delete window.name;//true, IE<9 抛出错误
console.log(window.age);//10
console.log(window.name);//undefined
var n = window.a;//undefined 这里不会抛出错误,相当于是一次属性查询
窗口关系及框架:
window.frames.length;
top.frames[''];//最好使用 top 的方式,因为top始终指向最高层的框架window
parent:
表示当前框架的父框架
除非最高层的窗口是通过window.open()打开的,否则其window对象的name属性不会包含任何值
self:
始终指向window
窗口位置:
其他: screenLeft\screenTop
Firefox: screenX\screenY
var leftPos = (typeof window.screenLeft == 'number') ? window.screenLeft : window.screenX;
var leftPos = (typeof window.screenTop == 'number') ? window.screenTop : window.screenY;
IE\Chrome: screenTop 表示的是可见区域的离屏幕顶端距离,也就是工具栏高度值
这两个方法移动窗口,但是一般会被浏览器禁用
window.moveTo(10,10);//移动到指定位置
window.moveBy(10,10);//移动指定像素距离
窗口大小:
//获取窗口视图的大小
var pageW = window.innerWidth,
pageH = window.innerHeight;//IE8及以前的版本不支持
if (typeof pageW != 'number') {
if (document.compatMode == 'CSS1Compat') {
pageW = document.documentElement.clientWidth;
pageH = document.documentElement.clientHeight;
} else {
pageW = document.body.clientWidth;
pageH = document.body.clientHeight;
}
}
//调整窗口大小,但是一般会被浏览器禁用
window.resizeTo(100,100);
window.resizeBy(10,20);
导航和打开窗口:
window.open('http://......',frameName);
window.open('http://......',_self);//_parent,_top,_blank
第三个参数: fullscreen\height\left\location\menubar\resizable\scrollbars\status\toolbar\top\width
var newWin = window.open('','','height=200,width=400,top=10,resizable=yes');
//对于新的打开窗口,可以执行以下两个方法
newWin.resizeTo(500,500);
newWin.moveTo(100,100);
newWin.close();
newWin.closed;//获取新窗口的关闭状态
newWin.opner;//调用 window.open() 的对象
setTimeout\ setInterval:
var id = setTimeout(function(){},1000);
clearTimeout(id);
setTimeout(function(){},1000);
setInterval(function(){},1000);
//一般使用 setTimeout() 来替代setInterval()
var num = 0;
var max = 10;
function increment() {
num++;
if (num < max) {
setTimeout(increment, 1000);
} else {
alert('OK');
}
}
setTimeout(increment, 1000);
系统对话框:
alert()\confirm()\prompt()
window.print()
window.find()
location对象:
window.location 和 document.location 引用的是同一个对象
属性:
hash '#contents'
host 'www,google.com:80'
hostname 'www,google.com'
href 'http://www,google.com'
pathname '/Login/'
prot '80'
protocol 'http:'
search '?name=test'
查询字符串参数:
//封装获取查询字符串的方法
function getQuery() {
var res = {};
var sear = location.search.length > 0 ? location.search.substring(1) : "";
var items = sear.length ? sear.split('&') : [];
var len = items.length, item = null, key = null,value=null;
for (var i = 0; i < len; i++) {
item = items[i].split('=');
key = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if (key.length) {
res[key] = value;
}
}
return res;
}
url位置操作:
//以下的方式都是等价的
window.location.assign("http://www.baidu.com");
window.location = 'http://www.baidu.com';
location.href = 'http://www.baidu.com';
//可以动态修改地址参数
location.hash = '#section';
location.search = '?test=1';
以上方式都会在浏览器产生历史记录,可以在浏览器进行后退操作,但是如果使用replace()操作就不会产生历史记录。
location.replace("http://www.baidu.com");//没有历史记录
location.reload();//可能从缓存中加载
location.reload(true);//强制从服务器加载
navigator对象:
navigator.appCodeName; //浏览器名称:Mozilla
navigator.appName;//完整浏览器名称 :Netscape
navigator.userAgent;//浏览器的用户代理字符串
检测插件:
navigator.plugins
//只能在非IE的环境中使用
function hasPlugin(name) {
name = name.toLowerCase();
var len = navigator.plugins.length;
for (var i = 0; i < len; i++) {
if (navigator.plugins[i].name.toLowerCase().indexOf(name) > -1) {
return true;
}
}
return false;
}
//对于IE的检测方式,COM的方式实现,所以name表示插件的标识符
//Flash 标识符 ShockwaveFlash.ShockwaveFlash
function hasIEPlugin(name) {
try {
new ActiveXObject(name);
return true;
} catch (e) {
return false;
}
}
//测试
function hasFlashPlugin() {
var res = hasPlugin('Flash ');
if (!res) {
return hasIEPlugin(name);
}
return res;
}
//plugins 集合的refresh()方法更新集合,如果参数传入 true,那么会刷新所有的包含插件的页面
navigator.plugins.refresh();
注册处理程序:
//将一个站点注册为Rss源
navigator.registerContentHandler('application/rss+xml','http://www.somereader.com?feed=%s','some reader');
navigator.registerProtocolHandler('mailto','http://www.somemailclient.com?cmd=%s','some mail client');
screen 对象:
screen.availLeft;//未被系统占用的左侧像素值
screen.availTop ;//未被系统占用的上方像素值
screen.colorDepth;//颜色位数
history对象:
history.length;//历史页面数量
history.back();//后退一页
history.forward();//前进一页
history.go(1);
******************** Chapter 9 客户端检测 ********************
//这里研究过深,难度太大,并且实用性不强,后续有时间需要,可以再研究
******************** Chapter 10 DOM ********************
IE中所有的DOM对象都是以COM对象的形式实现的。这些对象与原生的JavaScript对象的行为或活动特点不一致。
节点层次
Node类型://除IE之外都可以访问的类型
Node.ELEMENT_NODE(1);
Node.ATTRIBUTE_NODE(2);
Node.TEXT_NODE(3);
Node.CDATE_SECTION_NODE(4);
Node.ENTITY_REFRENCE_NODE(5);
Node.ENTITY_NODE(6);
Node.PROCESSING_INSTRUCTION_NODE(7);
Node.COMMIT_NODE(8);
Node.DOCUMENT_NODE(9);
Node.DOCUMENT_TYPE_NODE(10);
Node.DOCUMENT_FRAGMENT_NODE(11);
Node.NOTATION_NODE(12);
var ele = document.getElementById('test');
if (ele.nodeType == Node.ELEMENT_NODE) {//IE没有公开Node类型的构造函数,这里会报错
if (window.console) {
console.log("node is an element");
}
}
//适用于所有的浏览器
if (ele.nodeType == 1) {}
NodeList:
根据实际DOM情况变化的对象
var chil = ele.childNodes[0];
chil = ele.childNodes.item(0);
//将NodeList转换为数组,但是IE8及以下的浏览器不支持,因为都是COM对象
Array.prototype.slice.call(ele.childNodes, 0);
//更加通用的方式
function toArray(nodes) {
var arr = null;
try {
arr = Array.prototype.slice.call(nodes, 0);
} catch (e) {
arr = new Array();
for (var i = 0, len = nodes.length; i < len ; i++) {
arr.push(node[i]);
}
}
}
//nextElementSibling 和 previousSibling
if (ele.nextElementSibling == null) {
console.log("this is last one");
} else if (ele.previousSibling == null) {
console.log("this is first one....");
}
//parentNode
//hasChildNodes
if (ele.hasChildNodes()) {
console.log('has children...');
}
//ownerDocument 表示整个文档的文档节点
ele.ownerDocument;
节点操作:
var ele = document.getElementById("test");
//返回新增的节点,如果node已经是文档的一部分,那么就是移动到新的节点位置的效果
var newNode = ele.appendChild(node);
//如果第二个参数为null,那么效果就是appendChild()
ele.insertBefore(node,null);
ele.insertBefore(node,ele.firstChild);//插入后成为第一个节点
//替换最后一个节点
var retNode = ele.replaceChild(newNode,ele.lastChild);
//移除最后一个节点并返回
var lNode = ele.removeChild(ele.lastChild);
//深拷贝,包括后代元素
ele.cloneNode(true);
//浅拷贝,不包括后代元素
ele.cloneNode(true);
//处理文本节点,删除后代空文本节点,合并相邻文本节点
ele.normalize();
Document类型:
document 是HTMLDocument的实例;
nodeType: 9;
nodeName: '#document';
//访问子节点
document.documentElement;//始终指向HTML元素 <html>
document.childNodes;
//获取 body 元素
document.body;
//获取文档结构
document.doctype;
不同的浏览器对document.doctype 的支持差别很大
document.title;
document.URL;
document.referrer;
document.domain;
//如果原地址是 www.baidu.com, 那么只能设置 baidu.com
document.domain = 'baidu.com';
document.domain = 'sina.com';//这样设置为出错的
//对于含有内嵌框架的页面很有用,因为不同子域的页面无法通过JavaScript通信的,但是如果把document.domain 都设置成相同的值,那么就可以通信了
同样如果一开始设置为了 松散的,就不能设置为紧绷的
document.domain = 'baidu.com';
document.domain = 'www.baidu.com';//不能再设置回紧绷的
//namedItem
var ps = document.getElementsByTagName("p");//NodeList
//寻找结果集中的 name=p1 的项
console.log(ps.namedItem('p1'));//ps['p1']
document.getElementsByName('');//
特殊集合:
document.anchors;// 带有name 的<a>
document.forms;
document.images;
document.links;//带有 href 的<a>
DOM一致性检测:
//一般不使用这种方式,并不准确,还是使用能力检测
document.implementation.hasFeature('XML','1.0');
//注意转义
document.write("<script type='' src=''><\/script>");
//多一个换行符
document.writeln("<script type='' src=''><\/script>");
//重写整个页面
window.onload = function () {
document.write("onload 之后重写整个页面");
}
open()和close() 分别用于打开的关闭网页输出流
Element 类型
nodeType: 1
tagName 等价于 nodeName
ele.id;
ele.title;
ele.className;
ele.lang;
ele.dir;//左右对齐方式
ele.getAttribute('id');
ele.getAttribute('class');
html5 规范: 自定义特性添加 data- 前缀
setAttribute('id','test');
removeAttribute('class');
DOM元素本身属性的访问:
div.id;
div.align;
var atrs = ele.attributes;
var id = atrs.getNamedItem('id');
atrs.removeNamedItem('class');
atrs.setNamedItem(newatr);
function getAttrs(ele) {
var name, val, arr = new Array();
for (var i = 0, len = ele.attributes.length; i < len; i++) {
//specified 表示是否设置了该属性,为了兼容IE7
if (ele.attributes[i].specified) {
name = ele.attributes[i].nodeName;
val = ele.attributes[i].nodeValue;
arr.push(name + "=" + val);
}
}
return arr.join(" ");
}
createElement():
//这种方式对于IE7 是有问题的
var div = document.createElement("div");
div.id = 'a';
IE7问题总结:
不能设置动态创建的 iframe 的name特性;
不能通过表单的reset() 方法重设动态创建的 input 元素
动态创建的 type='reset' 重设不了表单
动态创建的一批name 相同的单选按钮彼此毫无关系
子节点操作:
for (var i = 0, len = ele.childNodes.length; i < len; i++) {
if (ele.childNodes[i].nodeType == 1) {
//执行元素操作
}
}
Text类型:
nodeType: 3
nodeName: '#text'
nodeValue(date): 文本值
normalize:
var ele = document.getElementById("div1");
//创建文本节点
var txt = document.createTextNode('text');
ele.appendChild(txt);
//同一个元素可以添加多个文本节点
var txt1 = document.createTextNode('txt2');
ele.appendChild(txt1);
console.log(ele.childNodes.length);//3
//合并元素中所有的文本节点
ele.normalize();
console.log(ele.childNodes.length);//1
splitText:
var div = document.createElement('div');
var txt = document.createTextNode('this is good!');
div.appendChild(txt);
document.body.appendChild(div);
console.log(div.childNodes.length);//1
//分割子节点, 返回4之前的节点
var before = div.firstChild.splitText(4);
console.log(div.firstChild.nodeValue);//this
console.log(before.nodeValue);//is good
console.log(div.childNodes.length);//2
Comment 类型:
noteType:8
nodeName:'#comment'
//创建
var comment =document.createComment("this is commnet");
CDATASection 类型: 主要是针对XML文档
nodeType:4
nodeName:'#cdata-section'
//在XML文档中可以如下创建
document.createCDataSection()
DocumentType 类型: Firefox\Safari\Opera 支持
nodType:10
document.doctype.name;
IE及更早版本不支持DocumentType,会被解释为注释
DocumentFragment 类型:
nodeType;11
nodeName:'#document-fragment'
文档片段不会再文档中显示,相当于一个‘仓库’来使用,也不占用资源,把文档片段可以添加到文档中,但是只会将文档片段的子节点添加到文档中去
//通过fragment 的方式多次添加元素,可以让页面少量的渲染
var frag = document.createDocumentFragment();
var li = null;
for(var i =0;i<3;i++){
li = document.createElement("li");
li.appendChild(document.createTextNode('hello '+i));
frag.appendChild(li);
}
document.getElementById("ul").appendChild(frag);
Attr 类型:
nodeType: 11
属性:name\value\specified
var attr = document.createAttribute('align');
attr.value='left';
ele.setAttributeNode(attr);
console.log(ele.attributes['align'].value);//left
console.log(ele.getAttributeNode('align').value);//left
console.log(ele.getAttribute('align'));//left
DOM 操作技术:
动态脚本:
function loadJs(url){
var script = document.createElement('script');
script.type='text/javascript';
script.src=url;
document.body.appendChild(script);
}
//直接加载js 代码的方式,考虑IE的兼容性
function loadjsText(txt){
var script = document.createElement("script");
script.type='text/javascript';
try
{
script.appendChild(document.createTextNode(txt)
}catch(e){
//IE 是不允许 script 节点访问子节点的,所以上面进行异常捕捉
script.text=txt;
}
document.body.appendChild(script);
}
动态样式:
function loadStyle(){
var link = document.createElement('link');
link.rel='stylesheet';
link.type='text/css';
link.href='style.css';
var head = document.getElementsByTagName('head')[0];
head.appenChild(link);
}
function loadStyleText(txt){
var style = document.createElement('style');
style.type='text/css';
try{
style.appenChild(document.createTextNode(txt));
}catch(e){
//重用设置styleSheet.cssText 或者设置为空字符串,容易让IE崩溃
style.styleSheet.cssText = txt;
}
var head = document.getElementsByTagName('head')[0];
head.appenChild(style);
}
操作表格:
var tb = document.createElement('table');
var body = document.createElement('body');
tb.appenChild(body);
body.insertRow(0);
body.rows[0].insertCell(0)
body.rows[0].cells[0].appenChild(document.createTextNode('testTb'));
document.body.appendChild(tb);
使用NodeList:
这是动态改变的,应当尽量减少对NodeList 的访问
var divs = document.getElementsByTagName('div'),t;
//由于divs.length 是动态更新的,所以这里会造成无限循环
for(var i=0; i < divs.length; i++){
t = document.createElement('div');
document.body.appendChild(t);
}
//这样在使用,保存在临时变量中
for(var i=0, len = divs.length; i < len; i++){
t = document.createElement('div');
document.body.appendChild(t);
}
Javascript 高级程序设计--总结【三】的更多相关文章
- JavaScript高级程序设计第三版.CHM【带实例】
从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- 22.1 高级函数【JavaScript高级程序设计第三版】
函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...
- 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域
上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...
- JavaScript高级程序设计 第三章 基本概念
ch3 基本概念 标签(空格分隔): JavaScript 语法 标识符 - 第一个字符必须是字母.下划线或美元 - 驼峰大小写格式 严格模式 ECMAScript5引入,定义了一种解析和执行模型.此 ...
- 14.5 富文本编辑【JavaScript高级程序设计第三版】
富文本编辑,又称为WYSIWYG(What You See Is What You Get,所见即所得).在网页中编辑富文本内容,是人们对Web 应用程序最大的期待之一.虽然也没有规范,但在IE 最早 ...
- DOM 操作技术【JavaScript高级程序设计第三版】
很多时候,DOM 操作都比较简明,因此用JavaScript 生成那些通常原本是用HTML 代码生成的内容并不麻烦.不过,也有一些时候,操作DOM 并不像表面上看起来那么简单.由于浏览器中充斥着隐藏的 ...
- JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...
- 21.1 XMLHttpRequest 对象【JavaScript高级程序设计第三版】
IE5 是第一款引入XHR 对象的浏览器.在IE5 中,XHR 对象是通过MSXML 库中的一个ActiveX对象实现的.因此,在IE 中可能会遇到三种不同版本的XHR 对象,即MSXML2.XMLH ...
随机推荐
- LINUX负载均衡LVS-NAT搭建
1.搭建前的规划工作 这里从lvs官方网站找了一个nat模型的图,如下: 我这里使用虚拟机模拟出了4台rhel6机器.一台服务器作为lvs调度器(40网段使用的都是仅主机模式,168网段使用桥接模式) ...
- 开发-封闭原则(OCP)
1.什么是“开放-封闭” 随着软件系统规模的不断增大,软件系统的维护和修改的复杂性不断提高,这种困境促使法国工程院士Bertrand Meyer在1998年提出了“开放-封闭”(Open-Close ...
- vue+vue-router+vuex实战
shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...
- PXE+kickstart无人值守安装CentOS 7
kickstart+cobbler系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 本文是PXE+kickstart无人值守安装CentOS ...
- 使用xmanager接收图形界面
假设在win(192.168.0.101)上安装了xmanager,想接收来自linux(192.168.100.16)的图形界面. 1.在win端打开Xmanager - Passive 2.在li ...
- [转]usdt omnicore testnet 测试网络
本文转自:https://www.jianshu.com/p/417c280b8f9f Testnet 模式允许 omni core 运行在比特币测试链上,用于安全测试. 为了在 testnet 上收 ...
- C#调用存储过程执行缓慢,但在数据库中执行却很快的问题
参考: http://www.debugease.com/mssqlbasic/976568.html https://www.cnblogs.com/Irving/p/3951220.html ht ...
- WPF TextBlock IsTextTrimmed 判断文本是否超出
WPF TextBlock/TextBox 设置TextTrimming情况下 判断 isTextTrimmed(Text 文本是否超出 是否出现了省略号) private bool IsTextTr ...
- ubuntu16.4系统和Gentos6.8系统查看开机自启动服务
ubuntu16.4系统查看自启服务: 需要自行安装一个sysv-rc-conf的工具来查看: sudo apt-get install sysv-rc-conf 查看自启命令: sudo sysv- ...
- 4.6 explain 之 rows
一.说明 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数. 二.示例 关注我的公众号,精彩内容不能错过