zoukankan      html  css  js  c++  java
  • JavaScript(核心、BOM、DOM)

    http://www.flyne.org/article/407

    JavaScript(核心、BOM、DOM)

    JavaScript是基于对象事件驱动的客户端脚本语言。有如下特点:

      • 交互性
      • 安全性(不可以直接访问本地硬盘)
      • 跨平台性(只要是可以解析js的浏览器都可以执行,和平台无关)

    1、JavaScript和Java不同! ①所属:NetScape和Sun ②基于对象和面向对象 ③JS可以直接解析执行,Java需先编译在运行 ④JavaScript是一种弱类型的语言,Java是强类型的语言。

    2、JavaScript的实现包括以下3个部分:

    1)核心(ECMAScript):描述了JS的语法和基本对象

    2)文档对象模型 ☆(DOM):处理网页内容的方法和接口

    3)浏览器对象模型(BOM):与浏览器交互的方法和接口

    three parts of JS

    ECMAScript扩展知识:

    ① ECMAScript是一个标准,JS只是它的一个实现,其他实现包括ActionScript。

    ② “ECMAScript可以为不同种类的宿主环境提供核心的脚本编程能力……”,即ECMAScript不与具体的宿主环境相绑定,如JS的宿主环境是浏览器,AS的宿主环境是Flash。

    ③ECMAScript描述了以下内容:语法、类型、语句、关键字、保留字、运算符、对象。

    3、在HTML中使用JavaScript

    1)在<script></script>标签内部直接编写JS代码

    2)通过script标签的src属性直接引入外部js文件

    注意:若以上两种方式同时存在,则标签内部定义的JS代码不会被执行。

    JS核心

    4、JS的数据类型(☆)

    在JS中使用var关键词声明变量,变量的类型会根据其所赋值来决定。JS中数据类型分为原始数据类型(5种)和引用数据类型(Object类型)。

    1)5种原始数据类型:Undefined、Null、Boolean、Number和String。需要注意的是JS中字符串属于原始数据类型。

    2)typeof运算符:查看变量类型,对变量或值调用typeof运算符将返回下列值之一:

      • undefined – 如果变量是 Undefined 类型的

      • boolean – 如果变量是 Boolean 类型的

      • number – 如果变量是 Number 类型的

      • string – 如果变量是 String 类型的

      • object – 如果变量是一种引用类型或 Null 类型的

    3)通过instanceof 运算符解决引用类型判断问题

    4)JS中对类型的定义:一组值的集合。如Boolean类型的值有两个:true、false。Undefined和Null 类型都只有一个值,分别是undefined和null。

    5)null 被认为是对象的占位符,typeof运算符对于null值返回“object”。

    6)原始数据类型和引用数据类型变量在内存中的存放如下:

    memory of datatype in js

    5、局部变量和全局变量

    在函数中声明的变量只能在函数中使用,当你退出函数时,变量就会被释放,这种变量被称为局部变量。因为每个局部变量只在各自的函数中有效,所以你可以在不同的函数中使用名称相同的变量。

    如果在函数之外声明变量,那么页面中所有的函数都可以使用它。在全局变量被声明后,它们就开始生效了。在网页被关闭后,变量才会失效。

    注意:JS语言中,在代码块中声明的变量属于全局变量。

    6、数组(两种创建方式)

    1)var arr = [123,”abc”,true,null]

    2)var arr = new Array(4); //创建数组长度为4的数组

    var arr = new Array(123,”abc”,true,null);//等同于1)

    注意:

    ①js中,数组元素类型可以不一致。

    ②js中,数组长度可以动态改变。

    ③接着上述代码,typeof arr 和 arr instanceof Array 分别输出object和true。

    7、函数

    特点:关键字function;无需指定返回值类型;参数列表声明不需var关键字;无函数重载;函数内部可以直接调用arguments数组(隐式定义),该数组存储了实参列表;函数名代表一种引用类型,可用(函数名 instanceof Function)测试;打印函数引用会输出整个函数定义。

    8、动态函数和匿名函数

    1)动态函数是通过js的内置对象Function定义。形式为:new Function(arg1 , arg2),由于arg1和arg2为变量,所以可以动态指定。如:

    var run = new Function(“x,y”,”return x+y;”);

    2)匿名函数:没有函数名,形如:var run = function(x,y){return x+y;};

    注:打印动态函数的引用可以发现动态函数也是匿名函数。

    9、JS对象(需要new一个对象)

    1)String对象,方法分为两类:①与Html有关的 ②同java中的String相似的。具体查文档。

    2)Array对象,一些常用方法:

      • concat() 同String的concat()方法。

      • join() 同String的split()方法相反。

      • pop()、push() 同栈中的弹栈、压栈。

      • sort() 对数组元素排序。

    3)Date对象

    getTime()、Date.parse(dateString)方法返回时间戳。

    钟表例子:在body中加入onload=”startTime();”则可以在#div_1块中动态显示当前时间

    1

    2

    3

    4

    5

    6

    7

    8

    function startTime(){

        var date = new Date();

        var h = date.getHours();

        var m = date.getMinutes();

        var s = date.getSeconds();

        document.getElementById("div_1").innerHTML=h+" : "+m+" : "+s;

        setTimeout("startTime()",500);

    }

    4)Math对象,主要是一些静态方法,常用的有random()、ceil(x)/floor(x)/round(x)方法。

    5)RegExp对象:该对象代表正则表达式,用于字符串匹配

     两种RegExp对象创建方式:

    方式一,new 一个RegExp对象:var regExp = new RegExp(“[a-zA-Z0-9]{3,8}”);

    方式二,通过直接量赋值:var regExp = /^[a-zA-Z0-9]{3,8}$/;

     正则表达式的具体写法使用时查询文档。

     常用方法:test(string),返回true或false。

    10、全局函数

    encodeURI / decodeURI:编码解码URI

    进行url跳转时可以整体使用encodeURI

    encodeURIComponent / decodeURIComponent:编码解码URI组件

    传递参数时需要使用encodeURIComponent

    escape / unescape:对字符串进行unicode编码

    isNaN:检查某个值是否为NaN(Not a Number,非数字)

    parseIntparseFloat:将字符串解析为整数和浮点数

    eval:计算JS字符串,并把它作为脚本代码来执行。

    BOM(浏览器对象模型)

    11、BOM(浏览器对象模型)

    1)window对象:浏览器中打开的窗口

    ① 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。

    ② window.frames 返回窗口中所有命名的框架

    ③parent是父窗口(如果窗口是顶级窗口,那么parent==self==top)

    top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe)

    self是当前窗口(等价window)

    opener是用open方法打开当前窗口的那个窗口

    ④与消息框有关的方法:alert(String)、confirm(String)、prompt(String)

    两种定时器setTimeout(code,latency) 和 setInterval(code,period)

    注:setTimeout只执行一次code,如果要多次调用,可以让code自身再次调用setTimeout();setInteval()会不停地调用code,直到clearInterval()被调用。

    2)location对象:包含当前URL信息。重点掌握location对象的href属性,用于设置或返回完整的URL。

    3)history对象:主要是back()/forward()和go()方法,几乎用不到。

    第 2 页(共 2 页)

    DOM(文档对象模型)

    DOM是W3C组织制定的一套用于访问和操作XML和HTML文档的标准。W3C DOM被分为3个不同的部分 / 级别(parts / levels):

      • 核心DOM:用于任何结构化文档的标准模型(不作研究)

      • XML DOM:用于XML……

      • HTML DOM:用于HTML……

    12、XML DOM和HTML DOM

    HTML和XML:
    HTML:超文本标记语言,标记是有限的,每个标记有自己固定的含义,主要用于信息的显示。
    XML:可扩展标记语言,可以自定义标记,扩展性很强,主要用于信息的存储和传送

    1) XML DOM和HTML DOM分别定义了访问和操作XML和HTML文档的标准方法(接口)。

    2)HTML文档符合XML语法标准,所以可以使用XML DOM API解析HTML(比较麻烦),后面的例子会分别使用HTML DOM和XML DOM进行解析。

    3)如果把HTML当做XML对待,不会忽略回车、空格和制表符。

    13、DOM节点树模型(以HTML DOM树为例)

    DOM node tree model

    1)DOM模型将整个文档(XML文档和HTML文档)看成一个树形结构,并用document对象表示该文档。

    2)DOM规定文档中的每个成分都是一个节点(Node):

    文档节点(Document):代表整个文档

    元素节点(Element):文档中的一个标记

    文本节点(Text):标记中的文本

    属性节点(Attr):代表一个属性,元素才有属性

    3)Node为所有节点的父接口,其定义了一组公共的属性和方法,如下:

    attrs and methods in Node

     14、DOM节点三大属性(XML DOM)

    1)nodeName:元素节点、属性节点、文本节点分别返回元素的名称、属性的名称和#text的字符串。

    2)nodeType:元素节点、属性节点、文本节点的nodeType值分别为1、2、3.、

    3)nodeValue:元素节点、属性节点、文本节点的返回值分别为null、属性值和文本节点内容。

     15、Document对象常用属性和方法

    属性:

    documentElement:返回文档根元素的引用。如HTML文档中返回<html>标签元素

    方法:

    getElementById():☆根据id获取元素

    getElementsByName():根据name属性获取元素,没有name时,根据id获取。

    getElementsByTagName():根据标签名获取

    createElement()、createTextNode():创建元素节点、文本节点。

     16、练习

    Eg1、获取代码<h1 id=”test”>明天休息</h1>中的文本内容。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    var eleNode = document.getElementById("test");

    alert(eleNode.firstChild.nodeValue);

    alert(eleNode.childNodes[0].nodeValue);

    var h1Obj = document.getElementById("test");

    alert(h1Obj.innerHTML);

    alert(h1Obj.innerText);

    Eg2、将下图中的文本内容打印出来

    questions code

    01

    02

    03

    04

    05

    06

    07

    08

    09

    10

    11

    12

    13

    14

    15

    16

    17

    function printNode(node){

        if(node.nodeType == 3){

            alert(node.nodeValue.trim());

        }else if(node.nodeType == 1){

            var nodes = node.childNodes;

            for(var i = 0;i <nodes.length;i ++){

                printText(nodes[i]);

            }

        }

    }

    var liNodes = document.getElementsByTagName("li");

    for(var i = 0;i < liNodes.length;i ++){

        printNode(liNodes[i]);

    }

    17、DOM常见操作(XML DOM)☆

    1)获取节点

    ① 获取元素节点:通过document对象的三个方法获取

    ② 获取属性节点:属性节点附属于元素节点,可通过元素节点的getAttributeNode(attrName)方法获取属性节点,也可通过getAttribute(attrName)直接获取属性值。(与之相对的是Element接口的setAttribute(attrName , attrValue)方法,如果属性不存在,则直接添加到元素节点上)

    ③ 获取文本节点:文本节点为元素节点的子节点,可通过元素节点(Element接口)提供的childnodes()[index] 方法获得。

    2)改变节点

    ① 改变属性节点的值:可以通过属性节点的nodeValue直接修改属性值,也可通过元素节点的setAttribute()方法改变(17.1.2节)。

    ② 改变文本节点的值:通过文本节点的nodeValue直接修改。

    3)删除节点

    ① 删除元素节点:要想删除元素节点A,需获得A的父节点B,父节点可通过17.1.1中的方法获得,也可以直接通过A的parentNode属性获得(推荐)。调用B的removeChild(A) 即可删除A节点。

    ② 删除属性节点:可通过属性节点所属的元素节点的removeAttribute(attrName)或removeAttributeNode(node)删除。

    ③ 清空文本节点:最简单也是最常用的方法就是直接设置文本节点的nameNode属性为空串:textNode.nodeValue = ””。

    4)创建和添加节点

    ① 创建节点:通过document对象的createElement(eleName)、createTextNode(nodeValue)方法可分别创建元素节点和文本节点。属性节点也有自己的create方法,但是用的少,直接用元素节点的setAttribute()方法即可添加属性。

    ② 添加节点:两个重要的方法:appendChild()和insertBefore(),具体见Node接口中的方法(13节)。

    扩展:上面的两个方法都是在已知父节点时用到的,也可以直接在兄弟节点后添加新节点:x.insertBefore(newNode) 和 x.appendChild(newNode) 都可以向 x 后追加一个新的子节点。

    5)替换节点:主要掌握replaceChild(newNode , oldNode) 替换元素节点。(属性节点和文本节点有更简单的方法)

    18、HTML DOM(☆)

    1)在HTML DOM中,获取和改变元素内容最简单方法是使用元素的innerHTML属性(innerText属性返回去掉标签的innerHTML)

    2)改变HTML样式(style属性):element.style.color = “red”;

    3)DOM事件:当 HTML 元素”有事情发生“时,浏览器就会生成事件,HTML DOM允许JS对HTML事件作出反应。使用方法有两种:

    ① 将JavaScript 代码添加到 HTML 事件属性中,如onclick = JavaScript

    ② HTML DOM允许在JS中为HTML元素分配事件,如下面的代码演示了为button元素分配onclick事件:document.getElementById(“myBtn”).onclick = function(){}

    常见的JS事件有:

    加载事件:onload

    鼠标移动事件:onmouseover、onmouseout

    鼠标点击事件:onclick

    聚焦与离焦事件:onfocus、onblur

    键盘事件:onkeypress(一般要配合event.keyCode使用)

    提交与重置事件:onsubmit、onreset

    域改变事件:onchange

    19、DOM操作练习

    DOM操作练习请看本博客另外一篇文章:http://www.flyne.org/article/420

    20、BOM和HTML DOM关系图(了解)

  • 相关阅读:
    类的无参方法笔记
    类的无参预习内容
    类和对象
    洛谷 题解 P2010 【回文日期】
    洛谷 题解 CF711A 【Bus to Udayland】
    洛谷 题解 P2676 【超级书架】
    洛谷 题解 CF903B 【The Modcrab】
    洛谷 题解 P1585【魔法阵】
    HDU 2553【N皇后问题】
    一些函数
  • 原文地址:https://www.cnblogs.com/feng9exe/p/6675130.html
Copyright © 2011-2022 走看看