【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作

这篇具有很好参考价值的文章主要介绍了【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、多线程

1.1 概述

前端JS默认按照单线程去执行,一段时间内只能执行一件事情。举个栗子:比方说古代攻城游戏,带来十万大军,先让1000人去当炮灰(攻城),其他人就在后面看着等着,然后炮灰燃尽(这1000人攻城失败),然后第二批敢死队继续攻城,其他人还是等着…依次类推,最后十万大军败阵下来。

原生JavaScipt案例合集
JavaScript +DOM基础
JavaScript 基础到高级
Canvas游戏开发

这样的话就会造成一个问题,如果将一个比较复杂的js放到html前面去加载,这个js需要大量的时间进行运算,那么就会造成页面的阻塞。这样用户体验会特别不好。

html代码:

<script src="factorial.js"></script>
<body>
    <button>click me</button>
</body>

factorial.js代码:

function feiBo(n){
    if(n === 1 || n === 2)
        return 1;
    return feiBo(n-1) + feiBo(n-2);
}

console.log(feiBo(50))

为了解决这个问题,HTML5中新增了 Worker 函数,来开启额外的线程。这样就相当于多线程操作,在同一个时间内可以执行多个任务。

<script>
    new Worker("factorial.js");
</script>
<body>
    <button>click me</button>
</body>

报错:

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

这时 Worker 函数需要开启服务才可以正常使用,开启服务的命令:node server

找到 server.js 所在目录,运行开启服务的命令即可

1.2 体会多线程

html中嵌入的js代码:

new Worker("out.js");

setTimeout(function(){
    alert("打扰一下...3秒到了...请付费体验....")
},3000)

out.js代码:

var count = 1;
setInterval(function(){
    console.log(count++);
},1000)

1.3 多线程中数据传递和接收

js 文件通过script[src]引入 js中this指向window

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

但是我们通过 Worker 函数开启的额外线程中的 js ,this不再指向 window。this指向开辟的额外线程的全局对象

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

上面额外线程的全局对象中,有一个方法 postMessage ,可以在当前线程内向主线程发送数据

额外线程代码:

function feiBo(n){
    if(n === 1 || n === 2)
        return 1;
    return feiBo(n-1) + feiBo(n-2);
}

console.log("开始计算...");
postMessage(feiBo(40));//向主线程发送数据
console.log("计算完成....")

主线程:

var wk = new Worker("out.js");
console.log(wk);//打印额外线程对象

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

发现有和额外线程全局对象两个相同的事件,onmessage onerror

//onmessage 事件 用于接收数据
wk.onmessage = function(e){
    console.log(e);
}

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

事件对象中有一个data属性,存储额外线程传递过来的数据:

二、事件推送

2.1 概述

一般情况下,前端向服务器发送请求,服务器接收到请求,响应数据给前端,在浏览器对这些数据进行渲染,然后链接断开(无状态链接)。这时,服务端想要主动给前端返回数据,这是不可能的。所以,在HTML5中,新增加一个 EventSource 构造函数,用于从后台数据,参数是访问路径,这个路径和接口一样,是前后端一起研究讨论出来的。

//创建EventSource对象  创建完对象后  NetWork面板中可以看到,每隔1-3秒,后台不停的向前端推送数据
new EventSource('/hehe');

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

var es = new EventSource('/hehe');
console.log(es);

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作,前端开发,HTML5,html5,前端,history,WebWorker,EventSource

2.2 onmessage 事件

onmessage 事件:用于接收数据。接收的数据存储在事件对象的data属性中。

获取指定路径推送过来的数据,渲染到页面

<ul id="list"></ul>
<script>
    var list = document.getElementById('list');
    //创建EventSource对象  创建完对象后  NetWork面板中可以看到,每隔1-3秒,后台不停的向前端推送数据
    var es = new EventSource('/hehe');
    console.log(es);

    //onmessage 用于在前端接收数据
    es.onmessage = function(e){
        // console.log(e)
        // console.log(e.data)

        var li = document.createElement("li");
        li.innerHTML = e.data;
        list.appendChild(li);
    }
</script>

三、history

  • go() 该方法用于跳转到历史记录列表中指定位置

  • forward()该方法用于加载历史记录列表中的下一个URL

    调用该方法等价于点击了前进按钮或者是调用了history.go(1)

  • back() 该方法用于加载历史记录列表中的上一个URL

    调用该方法等价于点击了后进按钮或者是调用了history.go(-1)

  • pushState() 该方法用于向历史记录中添加新的历史记录

    history.pushState(obj, title, url) 参数概述

    • obj: 添加的数据 是一个对象
    • title: 新的网页标题 一般省略
    • url: 新的网页的url
  • replaceState() 该方法用于替换当前的历史记录

    history.replaceState(obj, title, url) 参数概述文章来源地址https://www.toymoban.com/news/detail-697621.html

    • obj: 添加的数据 是一个对象
    • title: 新的网页标题 一般省略
    • url: 新的网页的url
    history.pushState(111,"",'index.html#aaa');
    history.pushState(222,"",'index.html#bbb');
    history.pushState(333,"",'index.html#ccc');
    history.pushState(444,"",'index.html#ddd');
    
    // history.replaceState(555,"","index.html#eee")
    
    // 监测历史记录的改变
    window.onpopstate = function(e){
        console.log(e)
        console.log("状态改变...")
        //只有通过 前进 后退箭头 或者history.back()  history.forword() history.go() 方法操作才能获取传递的值
        console.log("传递的数据在state中:",e.state);
    }
    

到了这里,关于【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • webWorker解决单线程中的一些小问题和性能优化

    js是单线程这是大家都知道,为了防止多个线程同时操作DOM,这个导致一个复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准。 web worker是 HTML5 标准的一部分,这一规范定义

    2024年02月21日
    浏览(38)
  • Spring篇---第二篇

    一、构造器注入 将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注 入。 优点: 对象初始化完成后便可获得可使用的对象。 缺点: 当需要注入的对象很多时,构造器参数列表将会很长; 不够灵活。若有多种注入方式,每种 方式只需注入指定几

    2024年02月07日
    浏览(39)
  • Vue基础第二篇

    总结: 1 写在data或method中的属性或方法,从vm中直接可以 . 出来 2 methods的函数中,如果想使用data或methods中的属性,直接this.名字  就可以了 示例: 总结: 1  v-on:事件名=\\\'函数\\\'-----》简写成  @事件名=\\\'函数\\\' 2 触发函数,可以传参数 示例: 标签上   name   id  class  src  href

    2024年02月08日
    浏览(41)
  • 初识Linux篇:第二篇

    😁👉本篇主要介绍Linux的一些指令的应用👈 在学习Linux的基本指令之前,让我们先详细的认识一下 操作系统和命令行的概念 ; 🤔什么是操作系统(OS)呢? 操作系统是一款进行 软件资源与硬件管理 的 软件 ; 🤔🤔那么操作系统在计算机软硬件体系结构中大概在什么位置呢

    2024年02月04日
    浏览(42)
  • 数据恢复软件分享(第二篇)

    在之前与大家分享了10款免费好用的数据恢复软件,得到了很多小伙伴的热烈反馈,其中也有很多宝贵建议,鉴于有好东西第一时间与大家分享的原则,这次在总结大家反馈的基础上又推荐了十款好用的数据恢复软件,在分析它们各自特点之后,在公众号工具窗口提供了这1

    2024年02月07日
    浏览(46)
  • 致远OA如何开发 第二篇

    第二篇 开发环境以及工具 此栏目技术支持 技术大佬对栏目文章的支持 特别感谢 开发环境 win系统,linux系统,因为在安装的时候会判断是否符合标准服务系统,所以我们可以在安装的bat文件,或者shell文件中删除系统检测的代码,或者稍微修改即可 开发工具 使用idea推荐,

    2024年01月24日
    浏览(48)
  • Vue第二篇:概念深度剖析

    参考链接:https://www.bilibili.com/video/BV1oj411D7jk/?spm_id_from=333.788.recommend_more_video.0vd_source=3969f30b089463e19db0cc5e8fe4583a 1、响应式数据与插值表达式理解 前端最基本的操作是:把数据呈现到页面上,把更新的数据再更新到页面上。 原生js的赋值操作如下: div id=\\\"box\\\"/div script let value = \\\'这

    2024年02月17日
    浏览(37)
  • 第二篇:新建node项目并运行

     🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 ! 安装 Node.js : 首先,确保你的计算机上已经安装了 Node.js 。你可以从 Node.js 官方网站( https://nodejs.org )下载

    2024年01月16日
    浏览(32)
  • 第二篇:gitHub上配置ssh密钥

    一、为什么需要配置ssh密钥? 通过 SSH 协议进行与 GitHub 的交互,可以提供更方便的身份验证和更快速的推送与拉取操作。它使用密钥进行身份验证,而不需要在每次操作时提供用户名和密码或访问令牌。 二、和HTTPS的区别? 选择使用 HTTPS 还是 SSH 取决于个人偏好和特定的使

    2024年02月05日
    浏览(44)
  • 第二篇~Mac电脑更新python版本~

    主题很简单,至少一开始我这么认为的,但至少参考了3篇文章才搞定。 背景:22年“两眼一码黑”建了多个虚拟环境,导致系统空间有80G不明原因。上周末在公司重装系统,然后发现默认pyhton版本3.9,which官方维护到23年为止,还是有必要升级下的。万一... (顺便说一下app

    2024年02月04日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包