JavaScript学习——浏览器对象

1. 本文是在学习廖雪峰先生的JavaScrip教程 后的归纳

一、浏览器对象

  1. 常用的浏览器: Chrome,Firefox,Sarafi
  2. window 对象
    • window对象不但充当全局作用域,而且表示浏览器窗口
    • window对象有innerWidthinnerHeght属性,可以获取浏览器窗口的内部宽度和高度(内部宽高指的是除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高)
    • outerWidthouterHeight属性,可以获取浏览器窗口的整个宽高
    • navigator对象表示浏览器的信息,最常用的属性包括:
      • navigator.appName: 浏览器名称;
      • navigator.appVersion:浏览器版本;
      • navigator.language: 浏览器设置的语言
      • navigator.platform: 操作系统类型
      • navigator.userAgent:浏览器设定的User-Agent字符串
      • navigator的值可以被用户修改,JavaScript读取的值不一定正确
  3. screen对象
    • screen对象表示屏幕的信息,常用的属性有:
      • screen.width:屏幕宽度,以像素为单位
      • screen.height: 屏幕高度,以像素为单位
      • screen.colorDepth:返回颜色位数,如8、16、24
  4. location对象
    • location对象表示当前页面的URL信息
      • location.protocol; //'http'
      • location.host;//'www.example.com'
      • location.port;//'8080'
      • location.pathname;//'/path/index.html`
      • location.search;//'?a=1&b=2'
      • location.hash;//'TOP'
      • location.assign('')//加载一个新页面
      • location.reload()//重新加载当前页面
  5. document对象
    • document对象表示当前页面,由于HTML在浏览器中以DOM形式表示为树形结构,document对象就是整个DOM数的根节点
    • documenttitle属性是从HTML文档中<title>xxx<title>读取的,可以动态改变document.title='ab';
    • 查找DOM数的某个节点,需要从document对象开始查找,最常用的查找是根据IDTAGName`
    • document对象提供的getElementeById()getElementsByTagName()
    • document还有一个cookie属性,可以获取当前页面的cookie
    • Cookie是有服务器发送的key-value标识符, 因为HTTP协议是无状态的,服务器使用Cookie区分哪个用户
    • Cookie还存储网站的一些设置:如页面显示的语言等
    • JavaScript通过document.cookie读取到当前页面的Cookie
    • 为了安全,服务器端设置Cookie时可以使用httpOnly,设定了httpOnly的Cookie将不能被JavaScript读取,这个行为由浏览器实现,主流浏览器均支持httpOnly选项
  6. histroy对象
    • history 对象保存了浏览器的的历史记录
    • 调用history对象的back()forward() 后退或前进
    • 由于交互不好,建议不要使用history对象

二、操作DOM

  1. DOM简介
    • DOM是一个树形结构
    • 操作DOM的操作有:
      • 更新: 更新该DOM节点的内容
      • 遍历: 遍历该DOM节点下的子节点
      • 添加: 添加子节点
      • 删除: 从HTML中删除该节点
    • 取得节点方法有:document.getElementById()document.getElementByTagName(),以及CSS选择器document.getElementsByClassName()
    • document.getElemnetById() 定位唯一的一个DOM节点,而document.getElementByTagName()documente.getElementesByClassName()返回一组DOM节点
    • querySelector()querySelectorAll()
    // 通过querySelector获取ID为q1的节点:
    var q1 = document.querySelector('#q1');
    
    // 通过querySelectorAll获取q1节点内的符合条件的所有节点:
    var ps = q1.querySelectorAll('div.highlighted > p');
    
    注意:低版本的IE<8不支持querySelector和querySelectorAll。IE8仅有限支持。
    
    • DOM节点实际上是Node,而Node包括ElementComment,CDATA_SECTION等很多种以及根节点Document类型,绝大多数我们仅关心Element,即实际控制页面结构的Node,其他类型的Node忽略即可
    • 根节点Document已经自动绑定为全局变量document
  2. 更新DOM
    • 方法1: 修改innerHTML属性,不仅仅可以修改一个DOM节点的文本内容,还可以直接通过HTML片段修改DOM节点内部的子树
    • 方法2: 修改innerTexttextContent属性,可以自动对字符串进行HTML编码,保证无法设置任何HTML标签
    • 区别: innerText不返回隐藏元素的文本,而textContent返回所有文本,另外,IE<9不支持textContent
    • DOM节点的style属性对应所有的CSS,可以直接获取或设置,CSS允许font-size这样的名称,它并非JavaScript有效的属性名,所以需要在JavaScript中改写为驼峰式命名fontSize
    // 获取<p id="p-id">...</p>
    var p = document.getElementById('p-id');
    // 设置CSS:
    p.style.color = '#ff0000';
    p.style.fontSize = '20px';
    p.style.paddingTop = '2em';
    
  3. 插入DOm
    • innerHTML可以插入DOM节点,如果这个DOM节点不是空的,innerHTML会直接替换点原来的所有子节点
    • appendChild 插入一个子节点到父节点
    • insertBefore parentElemnt.insertBefore(newElement,referenceElement); 子节点会插入到referenceElement之前
    • insertBefore重点是要拿到一个参考子节点的引用,很多时候,需要循环一个父节点的所有子节点,可以通过迭达children属性实现
  4. 删除DOM
    • 删除一个DOM比插入要容易的多
    • 要删除一个节点,首先要获得该节点本身以及它的父节点,然后调用removeChild把自己删除
    // 拿到待删除节点:
    var self = document.getElementById('to-be-removed');
    // 拿到父节点:
    var parent = self.parentElement;
    // 删除:
    var removed = parent.removeChild(self);
    removed === self; // true
    
    • 删除的节点虽不在文档树中,但它还在内存中,children属性是一个只读属性,并且它在子节点变化时会实时更新
    • 在删除多个节点时,要注意children属性时刻都在变化

三、操作表单

  1. 表单
    • 用JavaScript操作表单和操作DOM类似,表单是特殊的DOM
    • 常见的表单:
      • 文本框,对应的<input type="text">,用于输入文本
      • 口令框,对应的<input type="password">,用于口令
      • 单选框,对应的<input type="radio">,用于选择一项
      • 复选框,对应的<input type="checkbox">,用于选择多项
      • 下拉框,对应的<select>,用于选择一项
      • 隐藏文本框,对应的<input type="hidden">,用户不可见,提交表单时可以把隐藏文本发送到服务器
    • input节点的引用,可以直接调用value获得对应的用户输入值
    • 对于radiocheckboxvalue属性返回的永远是HTML的预设值
    • 更新值,直接改value,而checkbox需要设置checkedtruefasle
  2. HTML5控件
    • 新增大量标准控件,常用的包括date,datetime,datetime-local,color
    • 不支持HTML5的浏览器无法识别新的控件,会被当做type="text"来显示
    • 支持HTML5的浏览器可以获得格式的字符串
  3. 提交表单
    • 方式一: <form>元素的submit()方法提交表单
    • 方式二: 响应<form>本身的onsubmit事件,在提交form时作修改
    • 安全起见,提交表单时一般不传输明文口令

四、操作文件

  1. 上传控件
    • HTML表单中,可以上传文件的唯一控件就是<input type='file'>
    • 当一个表单包含<input type='file'>时,表单enctype必须指定为multipart/form-data,method必须指定为post,浏览器才能正确编码并以mutipart/form-data格式发送表单的数据
    • 出于安全考虑,浏览器只允许用户点击<input type='file'>来选择本地文件,用JavaScript对其value赋值是没有效果的
  2. File API
    • HTML5的API提供了FileFileReader两个主要对象,可以获得文件信息并读取文件
  3. 单线程执行模式
    • 在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行
    • JavaScript处理多任务,采用的是异步调用,由于是异步调用,无法知道什么时候操作结束,所以需要先设置一个回调函数,但函数调用完毕时,JavaScript引擎将自动调用我们设置的回调函数

五、Ajax

  1. Ajax定义
    • Asynchronous JavaScript and XML 用JavaScript执行异步网络请求
    • Web的运作原理就是:一个Http请求对应一个页面
    • 现代浏览器写Ajax主要依靠XMLHttpRequest对象,对于低版本的IE,需要换一个ActiveXObject对象
    • 创建XMLHttpRequest对象后,要先设置onreadystatechange的回调函数,在回调函数中,通常只需通过readyState===4判断请求是否完成,如果已完成,再根据status===200判断是否是一成功的响应
    • XMLHttpRequest对象的open()方法有3个参数,第一个参数指定是Get还是POST方式,第二参数指定URL地址,第三个参数指定是否使用异步,默认为true(该参数不要只用为false,否则浏览器将停止响应,直到Ajax请求完成)
    • send()方法才真正发送请求,Get请求不需要参数,POST请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去
  2. 安全限制
    • 默认情况下,JavaScript在发送Ajax请求时,URL的域名必须和当前页面完全一致(即域名要相同,协议要相同,端口要相同)
    • 用JavaScript请求外域,可以使用Flash插件,或在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器,或使用JSONP方式(必须为GET请求,并要求返回JavaScript)
    • CORS是HTML5新的跨域策略,全称Cross-Orign Resource Sharing,是HTML5规范定义的如何跨域访问资源
    • Access-Control-Allow-Origin 在返回的Access-Control-Allow-Origin包含本域,b本次请求就可以成功
    • 是否跨域成功,取决于对方服务器是否愿意你设置一个正确的Access-Control-Allow-Orign,决定权始终在对方手中
    • 简单请求包括GETHEADPOST(Post的Content-Type类型,仅限application/x-www-form-urlencoded,multipart/form-datatext/plain,并且不能出现任何自定义头)
    • 对于PUTDELETE以及其他类型如application/json的POST请求,在发送Ajax请求之前,浏览器会先发送一个OPTIONS请求(成为preflighted请求)到这个URL上,询问目标服务器是否接受,服务器必须明确指出允许的Method,如:Access-Control-Allow-Methods:POST,GET,PUT,OPTIONS
    • 由于以POSTPUT方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理POSTPUT请求,服务器必须正确响应OPTIONS请求

六、Promise

  1. 定义
    • Promise有各种开源实现,在ES6中被统一规范,由浏览器统一支持
    `use strict`;
    function test(resolve, reject) {
      var timeOut = Math.random() * 2;
      console.log('set timeout to: ' + timeOut + ' seconds.');
      setTimeout(function () {
        if (timeOut<1) {
          console.log('call resolve()...');
          resolve('200 OK');
        } 
        else {
          console.log('call reject()...');
          reject('timeout in ' + timeOut + ' seconds.');
        }
      }, timeOut * 1000);
    }
    new Promise(test).then(function(result){
      console.log('Success'+result);  
    }).catch(function(result){
        console.log('failure'+result);
    })
    
    • 成功执行then,失败执行catch
    • Promise的最大好处是在异步执行的流程中,把执行代码和处理结果的代码清晰地分离
    • 并行执行任务: Promise.all()
    • 多个异步任务是为了容错: Promise.race()
    var p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 500, 'P1');
    });
    var p2 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 600, 'P2');
    });
    Promise.race([p1, p2]).then(function (result) {
    console.log(result); // 'P1'
    });
    //由于p1执行较快,Promise()`then`将先获得结果`p1`,`p2`仍在执行,但执行结果将被抛弃
    * 组合使用Promise,可以将很多异步任务以并行和串行的方式组合起来执行
    

七、Canvas

  1. Canvas用法
    • HTML5新增的组件,类似一块幕布,可以在JavaScript在上面绘制各种图表、动画等
    • 一个Canvas定义了一个指定尺寸的矩形框,在这个框内可以随意绘制
      <canvas id="test-canvas" width="300" height="200"></canvas>
    • canvas.getContext来测试浏览器是否支持Canvas
    • getContext('2d')方法让我们拿到一个CanvasRenderingContext2D对象,所有绘图操作都需要通过这个对象完成
    • `getContext('webgl')方法 是可以使用WebGL规范,允许在Canvas中绘制3D图形
  2. 基本绘制
    • Canvas的坐标系统: Canvas的坐标以左上角为原点,水平向右为x轴,垂直向下为Y轴,以像素为单位,所以每个点都是非负数
    • CanvasRenderingContext2D对象有若干方法来绘制图形
    • Canvas可以绘制基本的形状和文本,还可以实现动画、缩放、各种滤镜和像素转换等高级操作
    • 实现复杂操作,可以考虑以下优化方案
      • 通过创建一个不可见的Canvas来绘图,然后将最终绘制结果复制到页面的可见Canvas中
      • 尽量使用整数坐标而不是浮点数
      • 可以创建多个重叠的Canvas绘制不同的层,而不是在一个Canvas中绘制非常复杂的图
      • 背景图片如果不变可以直接用<img>标签并放到最底层
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容