• BOM与DOM/事件/jQuery(重要)


    BOM与DOM

    前提

    到目前为止,我们已经学过了JavaScript的一些简单的语法。但是这些简单的语法,并没有和浏览器有任何交互。

    也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DOM相关知识。

    JavaScript分为 ECMAScript,DOM,BOM。

    • BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。
    • DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。

    Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。例如:window.document.write()可以简写成:document.write()。


    window对象

    所有浏览器都支持 window 对象。它表示浏览器窗口

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

    没有应用于 window 对象的公开标准,不过所有浏览器都支持该对象.

    所有 JavaScript 全局对象、函数以及变量均自动成为 window 对象的成员。

    全局变量是 window 对象的属性。全局函数是 window 对象的方法。

    接下来要讲的HTML DOM 的 document 也是 window 对象的属性之一。

    一些常用的Window方法:

    • window.innerHeight - 浏览器窗口的内部高度

    • window.innerWidth - 浏览器窗口的内部宽度

    • window.open() - 打开新窗口

    • window.close() - 关闭当前窗口


    window的子对象

    navigator对象

    浏览器对象,通过这个对象可以判定用户所使用的浏览器,包含了浏览器相关信息。

    navigator.appName  // Web浏览器全称
    navigator.appVersion  // Web浏览器厂商和版本的详细字符串
    navigator.userAgent  // 客户端绝大部分信息
    navigator.platform   // 浏览器运行所在的操作系统

    screen对象

    屏幕对象,不常用。

    一些属性:

    • screen.availWidth - 可用的屏幕宽度

    • screen.availHeight - 可用的屏幕高度

    history对象

    window.history 对象包含浏览器的历史。

    浏览历史对象,包含了用户对当前页面的浏览历史,但我们无法查看具体的地址,可以简单的用来前进或后退一个页面。

    history.forward()  // 前进一页
    history.back()  // 后退一页

    location对象

    window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。

    常用属性和方法:

    location.href  获取URL
    location.href="URL" // 跳转到指定页面
    location.reload() 重新加载页面

    弹出框

    可以在 JavaScript 中创建三种消息框:警告框、确认框、提示框。

    警告框

    警告框经常用于确保用户可以得到某些信息。

    当警告框出现后,用户需要点击确定按钮才能继续进行操作。

    语法:

    alert("XXX?");

    确认框

    确认框用于使用户可以验证或者接受某些信息。

    当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。

    如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。

    语法:

    confirm("XXX?")

    提示框

    提示框经常用于提示用户在进入页面前输入某个值。

    当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。

    如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为 null。

    语法:

    prompt("请在下方输入","你的答案")

    计时相关

    通过使用 JavaScript,我们可以在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。

    setTimeout()

    语法:

    var t=setTimeout("JS语句",毫秒)
    • setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 t 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。
    • setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 "alert('5 seconds!')",或者对函数的调用,诸如 alertMsg()"。
    • 第二个参数指示从当前起多少毫秒后执行第一个参数(1000 毫秒等于一秒)。

    clearTimeout()

    语法:

    clearTimeout(setTimeout_variable)

    举个例子:

    // 在指定时间之后执行一次相应函数
    var timer = setTimeout(function(){alert(123);}, 3000)
    // 取消setTimeout设置
    clearTimeout(timer);

    setinterval():

    • setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
    • setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

    语法:

    setInterval("JS语句",时间间隔)

    返回值

    • 一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。

    clearinterval()

    • clearInterval() 方法可取消由 setInterval() 设置的 timeout。
    • clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。

    语法:

    clearInterval(setinterval返回的ID值)

    举个例子:

    // 每隔一段时间就执行一次相应函数
    var timer = setInterval(function(){console.log(123);}, 3000)
    // 取消setInterval设置
    clearInterval(timer);

    DOM

    • DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。
    • 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
    • HTML DOM 模型被构造为对象的树。

    HTML DOM 树

    DOM标准规定HTML文档中的每个成分都是一个节点(node):

    • 文档节点(document对象):代表整个文档

    • 元素节点(element 对象):代表一个元素(标签)

    • 文本节点(text对象):代表元素(标签)中的文本

    • 属性节点(attribute对象):代表一个属性,元素(标签)才有属性

    • 注释是注释节点(comment对象) 

    JavaScript 可以通过DOM创建动态的 HTML:

    • JavaScript 能够改变页面中的所有 HTML 元素

    • JavaScript 能够改变页面中的所有 HTML 属性

    • JavaScript 能够改变页面中的所有 CSS 样式

    • JavaScript 能够对页面中的所有事件做出反应


    查找标签

    直接查找

    document.getElementById           根据ID获取一个标签
    document.getElementsByClassName   根据class属性获取
    document.getElementsByTagName     根据标签名获取标签合集

    注意:

    涉及到DOM操作的JS代码应该放在文档的哪个位置。

    间接查找

    parentElement            父节点标签元素
    children                 所有子标签
    firstElementChild        第一个子标签元素
    lastElementChild         最后一个子标签元素
    nextElementSibling       下一个兄弟标签元素
    previousElementSibling   上一个兄弟标签元素

    节点操作

    创建节点

    语法:

    createElement(标签名)

    示例:

    var divEle = document.createElement("div");

    添加节点

    语法:

    追加一个子节点(作为最后的子节点)

    somenode.appendChild(newnode);

    把增加的节点放到某个节点的前边。

    somenode.insertBefore(newnode,某个节点);

    示例:

    var imgEle=document.createElement("img");
    imgEle.setAttribute("src", "XXX.jpg");
    var d1Ele = document.getElementById("d1");
    d1Ele.appendChild(imgEle);

    删除节点

    语法:

    获得要删除的元素,通过父元素调用该方法删除。

    somenode.removeChild(要删除的节点)

    替换节点

    语法:

    somenode.replaceChild(newnode, 某个节点);

    属性节点

    获取文本节点的值:

    var divEle = document.getElementById("d1")
    divEle.innerText
    divEle.innerHTML

    设置文本节点的值:

    var divEle = document.getElementById("d1")
    divEle.innerText="1"
    divEle.innerHTML="<p>2</p>"

    attribute操作

    var divEle = document.getElementById("d1");
    divEle.setAttribute("age","18")
    divEle.getAttribute("age")
    divEle.removeAttribute("age")
    ​
    // 自带的属性还可以直接.属性名来获取和设置
    imgEle.src
    imgEle.src="..."

    获取值操作

    语法:

    elementNode.value

    适用于以下标签:

    • .input

    • .select

    • .textarea

    var iEle = document.getElementById("i1");
    console.log(iEle.value);
    var sEle = document.getElementById("s1");
    console.log(sEle.value);
    var tEle = document.getElementById("t1");
    console.log(tEle.value);

    class操作

    className  获取所有样式类名(字符串)
    ​
    classList.remove(cls)  删除指定类
    classList.add(cls)  添加类
    classList.contains(cls)  存在返回true,否则返回false
    classList.toggle(cls)  存在就删除,否则添加

    指定CSS操作

    obj.style.backgroundColor="red"

    JS操作CSS属性的规律:

    1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:

    obj.style.margin
    obj.style.width
    obj.style.left
    obj.style.position

    2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:

    obj.style.marginTop
    obj.style.borderLeftWidth
    obj.style.zIndex
    obj.style.fontFamily

    事件

    HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

    常用事件:

    onclick        当用户点击某个对象时调用的事件句柄。
    ondblclick     当用户双击某个对象时调用的事件句柄。
    ​
    onfocus        元素获得焦点。               // 练习:输入框
    onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
    onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动)
    ​
    onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
    onkeypress     某个键盘按键被按下并松开。
    onkeyup        某个键盘按键被松开。
    onload         一张页面或一幅图像完成加载。
    onmousedown    鼠标按钮被按下。
    onmousemove    鼠标被移动。
    onmouseout     鼠标从某元素移开。
    onmouseover    鼠标移到某元素之上。
    ​
    onselect      在文本框中的文本被选中时发生。
    onsubmit      确认按钮被点击,使用的对象是form。

    绑定方式:

    方式一:

    <div id="d1" onclick="changeColor(this);">点我</div>
    <script>
      function changeColor(ths) {
        ths.style.backgroundColor="green";
      }
    </script>

    注意:

    • this是实参,表示触发事件的当前元素。
    • 函数定义过程中的ths为形参。

    方式二:

    <div id="d2">点我</div>
    <script>
      var divEle2 = document.getElementById("d2");
      divEle2.onclick=function () {
        this.innerText="呵呵";
      }
    </script>

    事件示例

    定时器示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <input type="text" id="i1">
    <button id="b1">开始</button>
    <button id="b2">结束</button>
    <script>
        var t;
        function showTime() {
            var i1Ele = document.getElementById('i1');
            var time = new Date();
            i1Ele.value = time.toLocaleString();
        }
        showTime();
        var b1Ele = document.getElementById('b1');
        b1Ele.onclick = function (ev) {
            if (!t){
                t = setInterval(showTime,1000)
            }
        };
        var b2Ele = document.getElementById('b2');
        b2Ele.onclick = function (ev) {
           clearInterval(t);
           t = undefined
        };
    ​
    </script>
    </body>
    </html>
    View Code

    搜索框示例:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>搜索框示例</title>
    </head>
    <body>
        <input id="d1" type="text" value="请输入关键字" onblur="blur()" onfocus="focus()">
        
    <script>
    function focus(){
        var inputEle=document.getElementById("d1");
        if (inputEle.value==="请输入关键字"){
            inputEle.value="";
        }
    }
    ​
    function blur(){
        var inputEle=document.getElementById("d1");
        var val=inputEle.value;
        if(!val.trim()){
            inputEle.value="请输入关键字";
        }
    }
    </script>
    </body>
    </html>
    View Code

    select联动示例:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>select联动</title>
    </head>
    <body>
    <select id="province">
      <option>请选择省:</option>
    </select>
    <select id="city">
      <option>请选择市:</option>
    </select>
    <script>
      data = {"河北省": ["廊坊", "邯郸"], "北京": ["朝阳区", "海淀区"], "山东": ["威海市", "烟台市"]};
    ​
      var p = document.getElementById("province");
      var c = document.getElementById("city");
    ​
      for (var i in data) {
        var optionP = document.createElement("option");
        optionP.innerHTML = i;
        p.appendChild(optionP);
      }
      p.onchange = function () {
        var pro = (this.options[this.selectedIndex]).innerHTML;
        var citys = data[pro];
        // 清空option
        c.innerHTML = "";
    ​
        for (var i=0;i<citys.length;i++) {
          var option_city = document.createElement("option");
          option_city.innerHTML = citys[i];
          c.appendChild(option_city);
        }
      }
    </script>
    </body>
    </html>
    View Code

    window.onload

    • 当我们给页面上的元素绑定事件的时候,必须等到文档加载完毕。因为我们无法给一个不存在的元素绑定事件。
    • window.onload事件在文件加载过程结束的时候触发。此时,文档中的所有对象都位于DOM中,并且所有图像,脚本,链接和子框架都已完成加载。

    注意:

    .onload()函数存在覆盖现象。


    jQuery

    jQuery介绍

    1. jQuery是一个轻量级的、兼容多浏览器的JavaScript库。

    2. jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互,能够极大地简化JavaScript编程。它的宗旨就是:“Write less, do more.“

    jQuery的优势

    1. 一款轻量级的JS框架。jQuery核心js文件才几十kb,不会影响页面加载速度。

    2. 丰富的DOM选择器,jQuery的选择器用起来很方便,比如要找到某个DOM对象的相邻元素,JS可能要写好几行代码,而jQuery一行代码就搞定了,再比如要将一个表格的隔行变色,jQuery也是一行代码搞定。

    3. 链式表达式。jQuery的链式操作可以把多个操作写在一行代码里,更加简洁。

    4. 事件、样式、动画支持。jQuery还简化了js操作css的代码,并且代码的可读性也比js要强。

    5. Ajax操作支持。jQuery简化了AJAX操作,后端只需返回一个JSON格式的字符串就能完成与前端的通信。

    6. 跨浏览器兼容。jQuery基本兼容了现在主流的浏览器,不用再为浏览器的兼容问题而伤透脑筋。

    7. 插件扩展开发。jQuery有着丰富的第三方的插件,例如:树形菜单、日期控件、图片切换插件、弹出窗口等等基本前端页面上的组件都有对应插件,并且用jQuery插件做出来的效果很炫,并且可以根据自己需要去改写和封装插件,简单实用。

    jQuery内容:

    1. 选择器

    2. 筛选器

    3. 样式操作

    4. 文本操作

    5. 属性操作

    6. 文档处理

    7. 事件

    8. 动画效果

    9. 插件

    10. each、data、Ajax

    下载链接:jQuery官网

    中文文档:jQuery AP中文文档

    jQuery版本

    • 1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增。因此一般项目来说,使用1.x版本就可以了,最终版本:1.12.4 (2016年5月20日)

    • 2.x:不兼容IE678,很少有人使用,官方只做BUG维护,功能不再新增。如果不考虑兼容低版本的浏览器可以使用2.x,最终版本:2.2.4 (2016年5月20日)

    • 3.x:不兼容IE678,只支持最新的浏览器。需要注意的是很多老的jQuery插件不支持3.x版。目前该版本是官方主要更新维护的版本。

    维护IE678是一件让人头疼的事情,一般我们都会额外加载一个CSS和JS单独处理。值得庆幸的是使用这些浏览器的人也逐步减少,PC端用户已经逐步被移动端用户所取代,如果没有特殊要求的话,一般都会选择放弃对678的支持。

    jQuery对象

    Query对象就是通过jQuery包装DOM对象后产生的对象。jQuery对象是 jQuery独有的。如果一个对象是 jQuery对象,那么它就可以使用jQuery里的方法:例如$(“#i1”).html()。

    • $("#i1").html()的意思是:获取id值为 i1的元素的html代码。其中 html()是jQuery里的方法。
    • 相当于: document.getElementById("i1").innerHTML;
    • 虽然 jQuery对象是包装 DOM对象后产生的,但是 jQuery对象无法使用 DOM对象的任何方法,同理 DOM对象也没不能使用 jQuery里的方法。

    一个约定,我们在声明一个jQuery对象变量的时候在变量名前面加上$:

    var $variable = jQuery对像
    var variable = DOM对象
    $variable[0]//jQuery对象转成DOM对象

    拿上面那个例子举例,jQuery对象和DOM对象的使用:

    $("#i1").html();//jQuery对象可以使用jQuery的方法
    $("#i1")[0].innerHTML;// DOM对象使用DOM的方法

    jQuery基础语法

    $(selector).action()

    查找标签

    基本选择器

    id选择器:

    $("#id")

    标签选择器:

    $("tagName")

    class选择器:

    $(".className")

    配合使用:

    $("div.c1")  // 找到有c1 class类的div标签

    所有元素选择器:

    $("*")

    组合选择器:

    $("#id, .className, tagName")

    层级选择器:

    x和y可以为任意选择器:

    $("x y");// x的所有后代y(子子孙孙)
    $("x > y");// x的所有儿子y(儿子)
    $("x + y")// 找到所有紧挨在x后面的y
    $("x ~ y")// x之后所有的兄弟y

    基本筛选器:

    :first // 第一个
    :last // 最后一个
    :eq(index)// 索引等于index的那个元素
    :even // 匹配所有索引值为偶数的元素,从 0 开始计数
    :odd // 匹配所有索引值为奇数的元素,从 0 开始计数
    :gt(index)// 匹配所有大于给定索引值的元素
    :lt(index)// 匹配所有小于给定索引值的元素
    :not(元素选择器)// 移除所有满足not条件的标签
    :has(元素选择器)// 选取所有包含一个或多个标签在其内的标签(指的是从后代元素找)

    例子:

    $("div:has(h1)")// 找到所有后代中有h1标签的div标签
    $("div:has(.c1)")// 找到所有后代中有c1样式类的div标签
    $("li:not(.c1)")// 找到所有不包含c1样式类的li标签
    $("li:not(:has(a))")// 找到所有后代中不含a标签的li标签

    练习:自定义模态框,使用jQuery实现弹出和隐藏功能。

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>自定义模态框</title>
      <style>
        .cover {
          position: fixed;
          left: 0;
          right: 0;
          top: 0;
          bottom: 0;
          background-color: darkgrey;
          z-index: 999;
        }
        .modal {
           600px;
          height: 400px;
          background-color: white;
          position: fixed;
          left: 50%;
          top: 50%;
          margin-left: -300px;
          margin-top: -200px;
          z-index: 1000;
        }
        .hide {
          display: none;
        }
      </style>
    </head>
    <body>
    <input type="button" value="弹" id="i0"><div class="cover hide"></div>
    <div class="modal hide">
      <label for="i1">姓名</label>
      <input id="i1" type="text">
       <label for="i2">爱好</label>
      <input id="i2" type="text">
      <input type="button" id="i3" value="关闭">
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script>
      var tButton = $("#i0")[0];
      tButton.onclick=function () {
        var coverEle = $(".cover")[0];
        var modalEle = $(".modal")[0];
    ​
        $(coverEle).removeClass("hide");
        $(modalEle).removeClass("hide");
      };
    ​
      var cButton = $("#i3")[0];
      cButton.onclick=function () {
        var coverEle = $(".cover")[0];
        var modalEle = $(".modal")[0];
    ​
        $(coverEle).addClass("hide");
        $(modalEle).addClass("hide");
      }
    </script>
    </body>
    </html>
    View Code

    属性选择器:

    [attribute]
    [attribute=value]// 属性等于
    [attribute!=value]// 属性不等于

    例子:

    // 示例
    <input type="text">
    <input type="password">
    <input type="checkbox">
    $("input[type='checkbox']");// 取到checkbox类型的input标签
    $("input[type!='text']");// 取到类型不是text的input标签
  • 相关阅读:
    MvcScaffolding: OnetoMany Relationships
    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载
    MVC中使用Scaffold生成代码
    项目开发的三个阶段 我的一点体会
    在Eclipse工作空间中创建新项目的方法
    Visual Studio 使用常见问题
    Matlab代码:为图像添加信噪比为SNR db的高斯噪声
    《Ogre 3D 游戏开发框架指南》配套光盘的一个小瑕疵
    如何阅读C++源代码
    在Eclipse工作空间中移除再添加项目的方法
  • 原文地址:https://www.cnblogs.com/zhukaijian/p/11494237.html
Copyright © 2020-2023  润新知