张成威 - 的个人网站

知不足而奋进,望远山而前行

张成威

知不足而奋进,望远山而前行

RSS订阅
搜索文章
切换主题:白色、黑色

知不足而奋进

望远山而前行

原生js页面事件

DOMContentLoaded事件

DOMContentLoaded页面的DOM树解析好并且需要等待JS执行完才触发,事件不直接等待CSS文件、图片的加载完成

事件会在文档的HTML和所有子资源(如图像和样式表)已经加载完成后触发,但不包括像CSS、图片等外部资源的加载。您可以将您的JavaScript代码包装在DOMContentLoaded事件中,以确保它们在文档完全解析后执行。

document.addEventListener("DOMContentLoaded", function () {
  console.log("当前 HTML 被完全加载以及解析完成");
});

window.onload方法

window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。

通常用于
元素,在页面完全载入后(包括图片、css文件等等)执行脚本代码。

window.onload = function() {
  console.log("页面全部加载完成");
};

window.unload 表示卸载的意思,这个事件在从当前浏览器窗口内移动文档的位置时触发。
也就是说,通过超链接、前进或后退按钮等方式从一个页面跳转到其他页面,或者关闭浏览器窗口时触发。


beforeunload事件

beforeunload事件类型与unload事件类型功能相似,不过它更人性化,如果beforunload事件处理函数返回字符串信息,那么该字符串会显示一个确认对话框,询问用户是否离开当前页面。

window.onbeforeunload = function(e){
 return "您的数据还未保存!";
}
全文 ...》

原生js网页加载状态

当前文档的加载状态document.readyState

  • uninitialized(未初始化)还没有调用send()方法
  • loading(载入)已调用send()方法,正在发送请求
  • loaded(载入完成)send()方法执行完成,已经接收到全部响应内
  • interactive(交互)正在解析响应内容
  • completed(完成)响应内容解析完成,可以在客户端调用了
if (document.readyState == "loading") {
  console.log("(载入)已调用send()方法,正在发送请求");
}

停止加载

window.stop()
全文 ...》

获取URL参数

window.location.host; //返回url 的主机部分,例如:www.xxx.com 
window.location.hostname; //返回www.xxx.com 
window.location.href; //返回完整的url字符串
window.location.pathname; //返回请求路径 /xxx/xxx.html
window.location.protocol; //返回url 的协议部分,例如: http:,ftp:,maito:等等.
window.location.port //url 返回端口
全文 ...》

退出setTimeout循环闭包

本文章仅作为笔记记录

使用一个定时执行的回调函数,需要当条件num 等于5时退出当前循环。

但是,在当前的代码中,使用 returnbreak 语句是无法直接退出 for 循环的,因为 break 语句只能用于循环语句中,而不是定时器的回调函数中。

let numtime = 10;
let num = 0
for (let y = 0; y < numtime; y++) {
    (function (j) {
        setTimeout(function timer() {
            num++
            console.log("第", j, "秒");
            console.log(num, "num");
            if (num == 5) {
                console.log("现在num等于5了,我想要退出当前", num);
                // return;
                // break;
            }
        }, j * 1000);
    })(y);
}

结果将是这样,条件num等于5还是会继续往下执行:

Untitled

要解决这个问题,可以将循环和定时器分开处理。可以使用一个变量来表示是否继续执行定时器,并在达到特定条件时修改该变量的值,从而实现退出定时器的效果。

let numtime = 10;
let num = 0;
let continueTimer = true;

for (let y = 0; y < numtime; y++) {
    (function (j) {
        setTimeout(function timer() {
            if (!continueTimer) {
                return;
            }

            num++;
            console.log("第", j, "秒");
            console.log(num, "num");

            if (num === 5) {
                console.log("现在num等于5了,我想要退出当前", num);
                continueTimer = false;
            }
        }, j * 1000);
    })(y);
}

Untitled

全文 ...》