BOM:Browser Object Model ==> 兼容性极差 主要讲一些通用的

计时器

计时器是异步的,当时机成熟之后才会执行
计时器会返回一个数字,该数字表示计时器的编号

  • setTimeout方法:指定时间到达后运行某个函数
    • clearTimeout方法:清除计时器
  • setInterval方法:指定间隔时间到达后运行某个函数
    • clearInterval方法:清除计时器
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>setTimeout</title>
  8. </head>
  9. <body>
  10. <button id="btn1">点击开始</button>
  11. <button id="btn2">清除计时器</button>
  12. <script>
  13. var timer1, timer2, timer3;
  14. btn1.onclick = function() {
  15. //3000毫秒之后,运行指定的函数
  16. // [注意] 计时器是异步的, 当时机成熟之后才会执行
  17. // 所以 下面这三个计时器 几乎是同时开始计时的
  18. timer1 = setTimeout(function() {
  19. console.log("计时完成1");
  20. }, 3000);
  21. timer2 = setTimeout(function() {
  22. console.log("计时完成2");
  23. }, 3000);
  24. timer3 = setTimeout(function() {
  25. console.log("计时完成3");
  26. }, 3000);
  27. // 计时器会返回一个数字, 该数字表示计时器的编号
  28. console.log(timer1, timer2, timer3);
  29. console.log("点击事件");
  30. }
  31. btn2.onclick = function() {
  32. clearTimeout(timer1);
  33. clearTimeout(timer2);
  34. clearTimeout(timer3);
  35. }
  36. </script>
  37. </body>
  38. </html>
  39. <!DOCTYPE html>
  40. <html lang="en">
  41. <head>
  42. <meta charset="UTF-8">
  43. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  44. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  45. <title>利用递归的思想 ==> 强行将setTimeOut 模拟成 setInterval</title>
  46. <style>
  47. h1 {
  48. text-align: center;
  49. }
  50. </style>
  51. </head>
  52. <body>
  53. <h1>0</h1>
  54. <button id="btn1">点击开始</button>
  55. <button id="btn2">清除计时器</button>
  56. <script>
  57. // 在工作中 可能会见到下面种种写法 来代替 setInterval 这是因为 setInterval 存在一些小问题
  58. var timer1, num = 0;
  59. var h1 = document.querySelector("h1");
  60. btn1.onclick = function () {
  61. interval(function () {
  62. num++;
  63. h1.innerHTML = num;
  64. }, 300);
  65. }
  66. // 思考 ==> 无限递归 ==> 栈溢出问题
  67. // 在本案例中 setTimeout(function () {}, duration) 是异步执行的 该函数瞬间就执行完了 然后就会被销毁 所以不会导致栈溢出
  68. function interval(callback, duration) {
  69. timer1 = setTimeout(function () {
  70. callback();
  71. /* callback 函数
  72. function () {
  73. num++;
  74. h1.innerHTML = num;
  75. } */
  76. interval(callback, duration);
  77. }, duration);
  78. }
  79. btn2.onclick = function () {
  80. clearTimeout(timer1);
  81. }
  82. </script>
  83. </body>
  84. </html>
  85. <!DOCTYPE html>
  86. <html lang="en">
  87. <head>
  88. <meta charset="UTF-8">
  89. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  90. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  91. <title>setInterval</title>
  92. <style>
  93. h1 {
  94. text-align: center;
  95. }
  96. </style>
  97. </head>
  98. <body>
  99. <h1>0</h1>
  100. <button id="btn1">点击开始</button>
  101. <button id="btn2">清除计时器</button>
  102. <script>
  103. var timer1, num = 0;
  104. var h1 = document.querySelector("h1");
  105. btn1.onclick = function() {
  106. timer1 = setInterval(function() {
  107. num++;
  108. h1.innerHTML = num;
  109. }, 300);
  110. }
  111. btn2.onclick = function() {
  112. clearInterval(timer1);
  113. }
  114. </script>
  115. </body>
  116. </html>

[作业讲解]计时器

重写后再丢上来 见DOM案例16

[作业讲解]无缝轮播图

重写后再丢上来 见DOM案例18

window对象

自身方法

  • open

打开一个新窗口

open(“页面路径”, “打开目标”, “配置”)

  • alert
  • confirm
  • prompt

对象属性

  • document
    document.write
    在当前文档流中写入内容,如果当前文档流不存在,则新开一个文档流
  • location:地址栏对象

href属性:得到目前地址
其他属性参考location.jpg

reload方法:刷新当前页面

  • navigator

image.png

image.png

  • history:历史记录

go方法
back方法
forword方法

  • console

log方法:打印对象的valueOf的返回值
dir方法:打印对象结构
tiem方法和timeEnd方法:用于计时

[作业讲解]提示插件

插件的特点

  1. 通用性
  2. 易用性
  3. 尽量不要与其他功能冲突
  4. 通用性
  5. 易用性
  6. 尽量不要与其他功能冲突
  • 补充 ==> 图片的base64格式

网上有在线转换工具

将图片上传后

得到base64码

并将它传入img的src属性中 即可

  • 注册事件一般位于处于化完成之后
if (!window.myPlugin) {
    window.myPlugin = {};
}

window.myPlugin.openConfirm = (function () {
    var divModal, //朦层
        divCenter, //中间的容器
        options,
        spanTitle, // 提示标题的span元素 ==> 第1行
        spanClose, // 关闭图标的span元素 ==> 第1行
        divContent, // 内容区域的div元素 ==> 第2行
        btnConfirm, // 确认按钮的div元素 ==> 第3行
        btnCancel, // 取消按钮的div元素 ==> 第3行
        isRegEvent = false; // 是否注册过事件

    /**
     * 打开一个确认对话框
     */
    function openConfirm(opts) {
        if (typeof opts === "string") { // 若调用 myPlugin.openConfirm() 时传入的参数是一个字符串 那么默认这个字符串为提示内容
            opts = {
                content: opts
            };
        }
        if (!opts) { // 若调用 myPlugin.openConfirm() 时没有传入参数 则默认传入的是一个空对象
            opts = {}; //默认为一个空对象
        }
        options = opts;
        initModal();
        initCenterDiv();
        regEvent();
    }

    // 初始化操作完成后 再注册相关事件
    function regEvent() {
        if (!isRegEvent) {
            isRegEvent = true;
            spanClose.onclick = function () { // 点击关闭图标的span元素时 隐藏蒙层
                divModal.style.display = "none";
            }
            divModal.onclick = function (e) { // 点击蒙层元素时 隐藏蒙层
                if (e.target === this) {
                    divModal.style.display = "none";
                }
            }
            btnCancel.onclick = function () { // 点击取消按钮的div元素时 隐藏蒙层
                if (options.oncancel) {
                    options.oncancel(); // 若绑定了回调函数 则执行回调函数
                }
                divModal.style.display = "none";
            }
            btnConfirm.onclick = function () { // 点击确认按钮的div元素时 隐藏蒙层
                if (options.onconfirm) {
                    options.onconfirm(); // 若绑定了回调函数 则执行回调函数
                }
                divModal.style.display = "none";
            }
        }
    }

    /**
     * 初始化朦层
     */
    function initModal() {
        if (!divModal) {
            divModal = document.createElement("div");
            divModal.style.position = "fixed";
            divModal.style.background = "rgba(0,0,0,.2)";
            divModal.style.width = divModal.style.height = "100%";
            divModal.style.left = divModal.style.top = 0;
            document.body.appendChild(divModal);
        }
        divModal.style.display = "block";
    }

    /**
     * 初始化中间的div
     */
    function initCenterDiv() {
        if (!divCenter) {
            divCenter = document.createElement("div");
            divCenter.style.position = "absolute";
            divCenter.style.width = "260px";
            divCenter.style.height = "160px";
            divCenter.style.background = "#fff";
            divCenter.style.left = divCenter.style.right = divCenter.style.top = divCenter.style.bottom = 0;
            divCenter.style.margin = "auto";
            divCenter.style.fontSize = "14px";
            initDivCenterContent();

            divModal.appendChild(divCenter);

            btnCancel = divCenter.querySelector("[data-myplugin-id=cancel]")
            btnConfirm = divCenter.querySelector("[data-myplugin-id=confirm]")
            spanTitle = divCenter.querySelector("[data-myplugin-id=title]");
            spanClose = divCenter.querySelector("[data-myplugin-id=close]")
            divContent = divCenter.querySelector("[data-myplugin-id=content]");
        }
        //设置配置的内容
        spanTitle.innerText = options.title || "提示";
        divContent.innerText = options.content || "";

        btnConfirm.className = options.confirmClass || "";
        btnConfirm.innerText = options.confirmText || "确定";
        btnCancel.className = options.cancelClass || "";
        btnCancel.innerText = options.cancelText || "取消";
    }

    /**
     * 初始化div内部的东西
     */
    function initDivCenterContent() {
        //创建内部的标题div 第一行
        var div = document.createElement("div");
        div.style.height = "40px";
        div.style.background = "#eee";
        div.style.boxSizing = "border-box";
        div.style.padding = "10px 20px 0";
        div.innerHTML = `
            <span style="float:left;" data-myplugin-id="title"></span>
            <span  data-myplugin-id="close" style="float:right; cursor:pointer">
                <img style="width:18px;height:18px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACDklEQVRoQ+2Z/TEEQRDF30WADGSACMgAGZABkZABGSACJQMykAEyUE/dqLmpmZ2Z7rd7dsv8eXXd/X7TPR87vcLMx2rm+rFogF0ABwBetpylYwBvAD5zOnIZoPA7AGdrAxpeA7ifGOQCwA0A6uF4BHCZguQAHiLxsWYaTwVB8ZzEdBDiPP4xBSDtx8BMTwFREh9k7cVZSAFOADxXSmVMiJp4SjsC8Bo05kqINb+zBYgW8V/RmviRmANocURbZSbMMUvngNmhYadyxRo6yFyOG0HcMWonsTvAAIjEdw2A8SWBEhCZzxYANYRMfGkXKmVdEVjhY0NfawaCkUeAx7a4lHoBrOU0ivjeEopnoUcQ7XIXs3RWTQejJQO95dRyJJjEezKghDCLVwD0rIlcJlziVQBWCLd4JUAvhET8P0BU1K3barwOJFnwbKOKncgN4QWwzLzkAAtOPAAK8UGHORNWgFbxFPbnrhI94sNDmMWm5QrS/bjrEeKxlVynFQIUPkwfNMrASl9NJSQNuJ4+mc/aLiQLlCliie/FPmxJZqdpH3S+Oy3ycZcNjtDWKU2i+egfyEpL1vn0zwbH71hcg2P2LSamho2000yqxyibUkWVyukpbUCW2qy8hAUItnWuJuxQxh9Kt1G7i+IJttEvHjoHWE77cUOtcVtU/+0QwHtPo1stYFR/tavEqMEVzmcP8A0Z6ZQxBkTeYQAAAABJRU5ErkJggg==" />
            </span>
        `;
        divCenter.appendChild(div);


        //创建提示文本div 第二行
        div = document.createElement("div");
        div.dataset.mypluginId = "content";
        div.style.height = "70px";
        div.style.boxSizing = "border-box";
        div.style.padding = "20px";
        divCenter.appendChild(div);

        //创建按钮div 第三行
        div = document.createElement("div");
        div.style.height = "50px";
        div.style.boxSizing = "border-box";
        div.style.padding = "10px 20px";
        div.style.textAlign = "right";
        div.innerHTML = `
            <button data-myplugin-id="confirm"></button>
            <button data-myplugin-id="cancel"></button>
        `;
        divCenter.appendChild(div);
    }
    return openConfirm;

}())