使用D3.js构建实时图形的示例代码

前端之家收集整理的这篇文章主要介绍了使用D3.js构建实时图形的示例代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

首先你需要在计算机上安装Node和npm。

数据的可视化表示是传递复杂信息的最有效手段之一,D3.js提供了创建这些数据可视化的强大工具和灵活性。

D3.js是一个JavaScript库,用于使用SVG,HTML和CSS在Web浏览器中生成动态的交互式数据可视化。

D3 提供了各种简单易用的函数,大大简化了 JavaScript 操作数据的难度。由于它本质上是 JavaScript ,所以用 JavaScript 也是可以实现所有功能的,但它能大大减小你的工作量,尤其是在数据可视化方面,D3 已经将生成可视化的复杂步骤精简到了几个简单的函数,你只需要输入几个简单的数据,就能够转换为各种绚丽的图形。有过 JavaScript 基础的朋友一定很容易理解它。

在本教程中,我们将探讨如何使用D3.js和Pusher Channels构建实时图形。如果您在阅读本教程时想要使用代码,请查看此GitHub存储库,其中包含代码的最终版本。

准备

要完成本教程,您需要安装Node.jsnpm。我在创建本教程时使用的版本如下:

  • Node.js v10.4.1
  • npm v6.3.0

您还需要在计算机上安装http-server。它可以通过运行以下命令通过npm安装:npm install http-server。

虽然不需要Pusher知识,但如果熟悉它后,对学习JavaScript和D3.js会很有帮助。

开始

首先,为我们要构建的应用程序创建一个新目录。将其称为实时图形或任何您喜欢的图形。在新创建的目录中,创建一个新的index.html文件并粘贴以下代码

<!DOCTYPE html>
<hml lang="en">

<Meta charset="UTF-8"> <Meta name="viewport" content="width=device-width,initial-scale=1.0"> <Meta http-equiv="X-UA-Compatible" content="ie=edge"> Realtime D3 Chart@H_<a href="/tag/502/" target="_blank" class="keywords">502</a>_36@ </head> <body> <p><script src="<a href="https://js.pusher.com/4.2/pusher.min.js"&gt">https://js.pusher.com/4.2/pusher.min.js"&gt</a>;</script><br /> <script src="<a href="https://d3js.org/d3.v5.min.js"&gt">https://d3js.org/d3.v5.min.js"&gt</a>;</script><br /> <script src="app.js"></script></p> </body> </html></pre> </div> <p>如您所见,HTML<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>只是<a href="/tag/tiqu/" target="_blank" class="keywords">提取</a>构建图形所需的样式和脚本。我们正在利用D3.js来构建图表,并使用Pusher来<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>实时<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>。app.js<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>是应用程序前端<a href="/tag/daima/" target="_blank" class="keywords">代码</a>的写入位置。</p> <p>在我们开始实现图表之前,让我们在style.css中<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>应用程序的样式:</p> <div class="jb51code"> <pre class="brush:css;"> // style.css <p>html {<br /> height: 100%;<br /> <a href="/tag/Box/" target="_blank" class="keywords">Box</a>-sizing: border-<a href="/tag/Box/" target="_blank" class="keywords">Box</a>;<br /> padding: 0;<br /> margin: 0;<br /> }</p> <p><em>,</em>::before,*::after {<br /> <a href="/tag/Box/" target="_blank" class="keywords">Box</a>-sizing: inherit;<br /> }</p> <p>body {<br /> height: 100%;<br /> font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;<br /> overflow: hidden;<br /> background: linear-gradient(135deg,#ffffff 0%,#e8f1f5 100%);<br /> }</p> <p>.container {<br /> position: absolute;<br /> padding: 20px;<br /> top: 50%;<br /> left: 50%;<br /> background-color: white;<br /> border-radius: 4px;<br /> transform: translate(-50%,-50%);<br /> <a href="/tag/Box/" target="_blank" class="keywords">Box</a>-shadow: 0px 50px 100px 0px rgba(0,102,0.1);<br /> text-align: center;<br /> }</p> <p>.container h1 {<br /> color: #333;<br /> }</p> <p>.bar {<br /> fill: #6875ff;<br /> border-radius: 2px;<br /> }</p> <p>.bar:hover {<br /> fill: #1edede;<br /> }</p> <p>.tooltip {<br /> opacity: 0;<br /> background-color: rgb(170,204,247);<br /> padding: 5px;<br /> border-radius: 4px;<br /> transition: opacity 0.2s ease;<br /> }</pre></p> </div> <p><h3>安装服务器依赖项</h3></p> <p>假设您安装了Node和npm,请运行以下命令来安装应用程序的服务器组件所需的所有依赖项:</p> <div class="jb51code"> <pre class="brush:bash;"> npm install express dotenv cors pusher</pre> </div> <p><h3>Pusher 设置</h3></p> <p>前往Pusher网站并<a href="/tag/zhuce/" target="_blank" class="keywords">注册</a>一个免费帐户。选择侧栏上的Channels apps,然后点击Create Channels app以创建新应用。</p> <p>创建应用程序后,从API Keys选项卡中检索凭据,然后在项目目录根目录中创建一个variables.env<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>,将以下<a href="/tag/neirong/" target="_blank" class="keywords">内容</a><a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>到这个<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>中。</p> <div class="jb51code"> <pre class="brush:plain;"> // variables.env <p>PUSHER_APP_ID=<your app id><br /> PUSHER_APP_KEY=<your app key><br /> PUSHER_APP_SECRET=<your app secret><br /> PUSHER_APP_CLUSTER=<your app cluster></pre></p> </div> <p><h3>设置服务器</h3></p> <p>现在我们已经安装了相关的依赖项并且已经设置了我们的Pusher帐户,我们可以开始构建服务器。</p> <p>在项目目录的根目录中创建一个名为server.js的新<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>,并粘贴以下<a href="/tag/daima/" target="_blank" class="keywords">代码</a>:</p> <div class="jb51code"> <pre class="brush:js;"> // server.js <p>require('dotenv').config({ path: 'variables.env' });<br /> const express = require('express');<br /> const cors = require('cors');</p> <p>const poll = [<br /> {<br /> name: 'Chelsea',votes: 100,},{<br /> name: 'Arsenal',votes: 70,{<br /> name: 'Liverpool',votes: 250,{<br /> name: 'Manchester City',votes: 689,{<br /> name: 'Manchester United',votes: 150,];</p> <p>const app = express();<br /> app.use(cors());</p> <p>app.get('/poll',(req,res) => {<br /> res.json(poll);<br /> });</p> <p>app.set('port',process.env.PORT || 4000);<br /> const server = app.listen(app.get('port'),() => {<br /> console.log(Express running → PORT ${server.address().port});<br /> });</pre></p> </div> <p>保存<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>并从项目目录的根目录运行节点server.js以启动服务器。</p> <p><h3>设置前端应用程序</h3></p> <p>应用程序的前端将写在我们之前引用的app.js<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>中。在项目目录的根目录中创建此<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>,并在其中粘贴以下<a href="/tag/daima/" target="_blank" class="keywords">代码</a>:</p> <div class="jb51code"> <pre class="brush:js;"> // app.js <p>// set the dimensions and margins of the graph<br /> const margin = { top: 20,right: 20,bottom: 30,left: 40 };<br /> const width = 960 - margin.left - margin.right;<br /> const height = 500 - margin.top - margin.bottom;</p> <p>// set the ranges for the graph<br /> const x = d3<br /> .scaleBand()<br /> .range([0,width])<br /> .padding(0.1);</p> <p>const y = d3.scaleLinear().range([height,0]);</p> <p>// append the container for the graph to the page<br /> const container = d3<br /> .select('body')<br /> .append('div')<br /> .attr('class','container');</p> <p>container.append('h1').text('Who will win the 2018/19 Premier League Season?');</p> <p>// append the svg object to the body of the page<br /> // append a 'group' element to 'svg'<br /> // moves the 'group' element to the top left margin<br /> const svg = container<br /> .append('svg')<br /> .attr('width',width + margin.left + margin.right)<br /> .attr('height',height + margin.top + margin.bottom)<br /> .append('g')<br /> .attr('transform','translate(' + margin.left + ',' + margin.top + ')');</p> <p>// Create a skeleton structure for a tooltip and append it to the page<br /> const tip = d3<br /> .select('body')<br /> .append('div')<br /> .attr('class','tooltip');</p> <p>// Get the poll data from the /poll endpoint<br /> fetch('<a href="http://localhost:4000/poll">http://localhost:4000/poll</a>')<br /> .then(response => response.json())<br /> .then(poll => {<br /> // add the x Axis<br /> svg<br /> .append('g')<br /> .attr('transform','translate(0,' + height + ')')<br /> .attr('class','x-axis')<br /> .call(d3.axisBottom(x));</p> <pre><code>// add the y Axis svg .append('g') .attr('class','y-axis') .call(d3.axisLeft(y)); update(poll);</code></pre> <p>});</p> <p>function update(poll) {<br /> // Scale the range of the data in the x axis<br /> x.domain(<br /> poll.map(d => {<br /> return d.name;<br /> })<br /> );</p> <p>// Scale the range of the data in the y axis<br /> y.domain([<br /> 0,d3.max(poll,d => {<br /> return d.votes + 200;<br /> }),]);</p> <p>// Select all bars on the graph,take them out,and exit the prev<a href="/tag/IoU/" target="_blank" class="keywords">IoU</a>s data set.<br /> // Enter the new data and append the rectangles for each object in the poll array<br /> svg<br /> .selectAll('.bar')<br /> .remove()<br /> .exit()<br /> .data(poll)<br /> .enter()<br /> .append('rect')<br /> .attr('class','bar')<br /> .attr('x',d => {<br /> return x(d.name);<br /> })<br /> .attr('width',x.bandwidth())<br /> .attr('y',d => {<br /> return y(d.votes);<br /> })<br /> .attr('height',d => {<br /> return height - y(d.votes);<br /> })<br /> .on('mousemove',d => {<br /> tip<br /> .style('position','absolute')<br /> .style('left',${d3.event.pageX + 10}px)<br /> .style('top',${d3.event.pageY + 20}px)<br /> .style('display','inline-block')<br /> .style('opacity','0.9')<br /> .html(</p> <div><h3>${d.name}</h3></div> <span>${d.votes} votes</span> ); }) .on('mou<a href="/tag/SEO/" title="SEO">SEO</a>ut',() => tip.style('display','none')); <p>// update the x-axis<br /> svg.select('.x-axis').call(d3.axisBottom(x));</p> <p>// update the y-axis<br /> svg.select('.y-axis').call(d3.axisLeft(y));<br /> }</pre></p> </div> <p>在上面的<a href="/tag/daima/" target="_blank" class="keywords">代码</a>块中,我们使用通过/ poll端点接收的初始数据创建了一个基本条形图。如果您熟悉D3的工作原理,那么您应该熟悉这些<a href="/tag/daima/" target="_blank" class="keywords">代码</a>。我在<a href="/tag/daima/" target="_blank" class="keywords">代码</a>的关键部分<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>了注释,以指导您构建图表的方式。</p> <p>在新终端中,启动开发服务器以提供index.html<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>:</p> <div class="jb51code"> <pre class="brush:xhtml;"> npx http-server</pre> </div> <p>我在这里使用http-server,但你可以使用你想要的任何服务器。您甚至可以直接在浏览器中打开index.html。</p> <p>此时,您的图表应如下所示:</p> <p style="text-align: center"><p class="pic_center"><img title="clipboard.png" alt="" src="https://files.jb51.cc/file_images/article/201808/201808280911258.png" /></p></p> <p><h3>使用Pusher实时更新图表</h3></p> <p>让我们确保轮询的更新可以通过Pusher Channels实时反映在应用程序的前端中。将以下<a href="/tag/daima/" target="_blank" class="keywords">代码</a>粘贴到app.js<a href="/tag/wenjian/" target="_blank" class="keywords">文件</a>的末尾。</p> <div class="jb51code"> <pre class="brush:js;"> // app.js <p>const pusher = new Pusher('<your app key>',{<br /> cluster: '<your app cluster>',encrypted: true,});</p> <p>const channel = pusher.subscribe('poll-channel');<br /> channel.bind('update-poll',data => {<br /> update(data.poll);<br /> });</pre></p> </div> <p>在这里,我们打开了与Channels的连接,并使用Pusher的subscribe()<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a><a href="/tag/dingyue/" target="_blank" class="keywords">订阅</a>了一个名为poll-channel的新频道。通过bind<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>监听轮询更新,并在收到更新后使用最新数据<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>update()<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>,以便重新呈现图形。</p> <p>不要忘记使用Pusher帐户信息中心中的相应详细信息替换占位符。</p> <p><h3>从服务器触发更新</h3></p> <p>我们将模拟每秒更新一次的轮询,并在数据发生变化时使用Pusher触发更新,以便轮询的<a href="/tag/dingyue/" target="_blank" class="keywords">订阅</a>者(客户端)可以实时接收更新的数据。</p> <p>在其他导入下面的server.js顶部<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>以下<a href="/tag/daima/" target="_blank" class="keywords">代码</a>:</p> <div class="jb51code"> <pre class="brush:js;"> const Pusher = require('pusher'); <p>const pusher = new Pusher({<br /> appId: process.env.PUSHER_APP_ID,key: process.env.PUSHER_APP_KEY,secret: process.env.PUSHER_APP_SECRET,cluster: process.env.PUSHER_APP_CLUSTER,});</p> <p>function getRandomNumber(min,max) {<br /> return Math.floor(Math.random() * (max - min) + min);<br /> }</p> <p>function increment() {<br /> const num = getRandomNumber(0,poll.length);<br /> poll[num].votes += 20;<br /> }</p> <p>function updatePoll() {<br /> setInterval(() => {<br /> increment();<br /> pusher.trigger('poll-channel','update-poll',{<br /> poll,});<br /> },1000);<br /> }</pre></p> </div> <p>然后将/ poll端点更改为如下所示:</p> <div class="jb51code"> <pre class="brush:js;"> app.get('/poll',res) => { res.json(poll); updatePoll(); });</pre> </div> <p>/ poll路由将初始轮询数据发送到客户端并<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>updatePoll()<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>,该<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>以三秒为间隔递增<a href="/tag/suiji/" target="_blank" class="keywords">随机</a>俱乐部的投票,并触发我们在最后一步中在客户端上创建的轮询频道的更新。</p> <p>通过从项目目录的根目录运行节点server.js,终止服务器并重新启动它。此时,您应该有一个实时更新的条形图。</p> <p style="text-align: center"><p class="pic_center"><img title="clipboard.png" alt="" src="https://files.jb51.cc/file_images/article/201808/201808280911269.png" /></p></p> <p><h3>结论</h3></p> <p>您已经看到了使用D3.js创建条形图的过程以及如何使用Pusher Channels实时创建条形图。</p> <p>我们已经为Pusher和D3提供了一个简单的用例,但其中一个仅仅是表面上的问题。我建议深入研究<a target="_blank" href="https://pusher.com/docs" rel="external nofollow" >docs</a>,了解更多有关Pusher及其他<a href="/tag/gongneng/" target="_blank" class="keywords">功能</a>的信息。</p> <p>谢谢阅读!您可以在<a target="_blank" href="https://github.com/ayoisaiah/realtime-d3-graph" rel="external nofollow" rel="external nofollow" >GitHub存储库</a>中找到本教程的完整源<a href="/tag/daima/" target="_blank" class="keywords">代码</a>。希望对大家的学习有所帮助,也希望大家多多<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a>编程之家。</p></div> <div class="topcard-tags"><a href="/tag/D3js/" class="tag_link" target="_blank">D3.js</a><a href="/tag/D3jsgoujianshishituxing/" class="tag_link" target="_blank">D3.js构建实时图形</a><a href="/tag/shishituxing/" class="tag_link" target="_blank">实时图形</a></div> <ul class="list-group"> <li class="list-group-item"><a href="/js/30691.html" title="AngularJS 事件发布机制">上一篇:AngularJS 事件发布机制</a><a href="/js/30688.html" title="对vux点击事件的优化详解" class="text-muted pull-right">下一篇:对vux点击事件的优化详解</a> </li> </ul> </div> </div> </div> <!-- row end --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-4605373693034661" data-ad-slot="9144498553"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div> </div> </div> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <div class="title"><h1>猜你在找的JavaScript相关文章</h1></div> <div class="list_con"> <a href="/js/997747.html" title="Javascript中的事件冒泡与捕获"><div class="title">Javascript中的事件冒泡与捕获</div> <div class="summary">事件冒泡和事件捕获 起因:今天在封装一个bind函数的时候,发现el.addEventListener函数支...</div> <time class="summary">作者:前端之家 时间:2021-02-22</time> </a> </div> <div class="list_con"> <a href="/js/997746.html" title="搞懂js中小数运算精度问题原因及解决办法"><img class="lazy" src="/images/np.jpg" data-original="/res/2021/02-22/19/e40e1eb184cb2a5d8c5f6c5e730d8e82.png" title="" width="160" height="90" style="float:right;margin-left:30px;display:none;" /><div class="title">搞懂js中小数运算精度问题原因及解决办法</div> <div class="summary">js小数运算会出现精度问题 js number类型 JS 数字类型只有number类型,number类型相当于其...</div> <time class="summary">作者:前端之家 时间:2021-02-22</time> </a> </div> <div class="list_con"> <a href="/js/997744.html" title="搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理"><div class="title">搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理</div> <div class="summary">什么是跨域 跨域 : 广义的跨域包含一下内容 : 1.资源跳转(链接跳转,重定向跳转,表单提...</div> <time class="summary">作者:前端之家 时间:2021-02-22</time> </a> </div> <div class="list_con"> <a href="/js/997743.html" title="前端对base64编码的理解,原生js实现字符base64编码"><div class="title">前端对base64编码的理解,原生js实现字符base64编码</div> <div class="summary">@ &quot;TOC&quot; 常见对base64的认知(不完全正确) 首先对base64常见的认知,也是...</div> <time class="summary">作者:前端之家 时间:2021-02-22</time> </a> </div> <div class="list_con"> <a href="/js/997742.html" title="搞懂:MVVM模型以及VUE中的数据绑定数据劫持发布订阅模式"><div class="title">搞懂:MVVM模型以及VUE中的数据绑定数据劫持发布订阅模式</div> <div class="summary">搞懂:MVVM模式和Vue中的MVVM模式 MVVM MVVM : 的缩写,说都能直接说出来 :模型, :视图...</div> <time class="summary">作者:前端之家 时间:2021-02-22</time> </a> </div> <div style="border-bottom: 1px solid #f4f4f4;margin-top:20px;"> <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-fr-2o+fp-dx-wx" data-ad-client="ca-pub-4605373693034661" data-ad-slot="4561116489"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div><div class="list_con"> <a href="/js/997318.html" title="js判断浏览器是否支持webGL"><div class="title">js判断浏览器是否支持webGL</div> <div class="summary">起因是我之前开发的网页,用到了three.js制作了一个3d的旋转球体效果。 在各种浏览器上运行...</div> <time class="summary">作者:前端之家 时间:2021-02-14</time> </a> </div> <div class="list_con"> <a href="/js/997317.html" title="js判断undefined和null"><div class="title">js判断undefined和null</div> <div class="summary">js判断undefined js判断null js判断null和undefined</div> <time class="summary">作者:前端之家 时间:2021-02-14</time> </a> </div> <div class="list_con"> <a href="/js/997316.html" title="将文字自动转为banner打印形式的工具"><div class="title">将文字自动转为banner打印形式的工具</div> <div class="summary">http://patorjk.com/software/taag/</div> <time class="summary">作者:前端之家 时间:2021-02-14</time> </a> </div> <div class="list_con"> <a href="/js/997315.html" title="聊一聊 bootstrap 的轮播图插件"><div class="title">聊一聊 bootstrap 的轮播图插件</div> <div class="summary">今天做工作的时候,轻车熟路的做完,又用到了bootstrap的轮播图,觉得有必要安利一下这个插...</div> <time class="summary">作者:前端之家 时间:2021-02-14</time> </a> </div> <div class="list_con"> <a href="/js/997314.html" title="js实现图片无缝循环跑马灯"><div class="title">js实现图片无缝循环跑马灯</div> <div class="summary">html 代码 css js代码 function mylsRunHorseLight() { if (mylsTimer != null) { clearIn...</div> <time class="summary">作者:前端之家 时间:2021-02-14</time> </a> </div> <div style="border-bottom: 1px solid #f4f4f4;margin-top:20px;"> <ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-fr-2o+fp-dx-wx" data-ad-client="ca-pub-4605373693034661" data-ad-slot="4561116489"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div></div> </div> </div> </div> <!-- left end--> <!-- right --> <div class="col-sm-12 col-md-12 col-lg-3"> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">编程分类</label> <div class="cate mt-20"><a href="/html/" title="HTML">HTML</a><a href="/html5/" title="HTML5">HTML5</a><a href="/js/" title="JavaScript">JavaScript</a><a href="/css/" title="CSS">CSS</a><a href="/jquery/" title="jQuery">jQuery</a><a href="/bootstrap/" title="Bootstrap">Bootstrap</a><a href="/angularjs/" title="Angularjs">Angularjs</a><a href="/typescript/" title="TypeScript">TypeScript</a><a href="/vue/" title="Vue">Vue</a><a href="/dojo/" title="Dojo">Dojo</a><a href="/json/" title="Json">Json</a><a href="/electron/" title="Electron">Electron</a><a href="/nodejs/" title="Node.js">Node.js</a><a href="/extjs/" title="extjs">extjs</a><a href="/express/" title="Express ">Express </a><a href="/xml/" title="XML">XML</a><a href="/es6/" title="ES6">ES6</a><a href="/ajax/" title="Ajax">Ajax</a><a href="/flash/" title="Flash">Flash</a><a href="/unity/" title="Unity">Unity</a><a href="/react/" title="React">React</a><a href="/flex/" title="Flex">Flex</a><a href="/antdesign/" title="Ant Design">Ant Design</a><a href="/webfrontend/" title="Web前端">Web前端</a><a href="/weapp/" title="微信小程序">微信小程序</a><a href="/wxmp/" title="微信公众号">微信公众号</a><div class="clearfix"></div> </div> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <!-- f2er-rightads --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4605373693034661" data-ad-slot="7756441254" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">最新文章</label> <ul class="n-list"><li><a href="/js/997747.html" title="Javascript中的事件冒泡与捕获" target="_blank">• Javascript中的事件冒泡与</a></li> <li><a href="/js/997746.html" title="搞懂js中小数运算精度问题原因及解决办法" target="_blank">• 搞懂js中小数运算精度问题</a></li> <li><a href="/js/997744.html" title="搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理" target="_blank">• 搞懂:前端跨域问题JS解决</a></li> <li><a href="/js/997743.html" title="前端对base64编码的理解,原生js实现字符base64编码" target="_blank">• 前端对base64编码的理解,</a></li> <li><a href="/js/997742.html" title="搞懂:MVVM模型以及VUE中的数据绑定数据劫持发布订阅模式" target="_blank">• 搞懂:MVVM模型以及VUE中的</a></li> <li><a href="/js/997493.html" title="js实现横向跑马灯效果" target="_blank">• js实现横向跑马灯效果</a></li> <li><a href="/js/997318.html" title="js判断浏览器是否支持webGL" target="_blank">• js判断浏览器是否支持webG</a></li> <li><a href="/js/997317.html" title="js判断undefined和null" target="_blank">• js判断undefined和null</a></li> <li><a href="/js/997316.html" title="将文字自动转为banner打印形式的工具" target="_blank">• 将文字自动转为banner打印</a></li> <li><a href="/js/997315.html" title="聊一聊 bootstrap 的轮播图插件" target="_blank">• 聊一聊 bootstrap 的轮播图</a></li> </ul> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <label class="main-content-label ">热门标签 <span class="pull-right tx-12"> <a href="/all" target="_blank">更多 ►</a></span> </label> <div class="topcard-tags"><a href="/tag/guanbiyangao/" title="关闭广告" target="_blank">关闭广告</a><a href="/tag/danduheaders/" title="单独headers" target="_blank">单独headers</a><a href="/tag/fengzhuangdaima/" title="封装代码" target="_blank">封装代码</a><a href="/tag/tishicuowu/" title="提示错误" target="_blank">提示错误</a><a href="/tag/zhengshuzhengze/" title="整数正则" target="_blank">整数正则</a><a href="/tag/fei0kaitou/" title="非0开头" target="_blank">非0开头</a><a href="/tag/tiaoye/" title="跳页" target="_blank">跳页</a><a href="/tag/chuyema/" title="出页码" target="_blank">出页码</a><a href="/tag/antdtable/" title="antd table" target="_blank">antd table</a><a href="/tag/tishiURLweizhuce/" title="提示URL未注册" target="_blank">提示URL未注册</a><a href="/tag/gongzhonghaozhifu/" title="公众号支付" target="_blank">公众号支付</a><a href="/tag/vuehashmoshi/" title="vue hash模式" target="_blank">vue hash模式</a><a href="/tag/iSlider/" title="iSlider" target="_blank">iSlider</a><a href="/tag/chepaijianpan/" title="车牌键盘" target="_blank">车牌键盘</a><a href="/tag/xunhuantupian/" title="循环图片" target="_blank">循环图片</a><a href="/tag/echartsshuangzhexian/" title="echarts 双折线" target="_blank">echarts 双折</a><a href="/tag/zuoyoubuju/" title="左右布局" target="_blank">左右布局</a><a href="/tag/DllPlugin/" title="DllPlugin" target="_blank">DllPlugin</a><a href="/tag/duixiangchuangjian/" title="对象创建" target="_blank">对象创建</a><a href="/tag/daziyouxi/" title="打字游戏" target="_blank">打字游戏</a><a href="/tag/quanxuan/" title="圈选" target="_blank">圈选</a><a href="/tag/lianglan/" title="两栏" target="_blank">两栏</a><a href="/tag/yunhanshu/" title="云函数" target="_blank">云函数</a><a href="/tag/mengban/" title="蒙版" target="_blank">蒙版</a><a href="/tag/ES2020/" title="ES2020" target="_blank">ES2020</a><a href="/tag/chuchuang/" title="橱窗" target="_blank">橱窗</a><a href="/tag/wufenggundonglunbo/" title="无缝滚动轮播" target="_blank">无缝滚动轮播</a><a href="/tag/sekuaipengzhuang/" title="色块碰撞" target="_blank">色块碰撞</a><a href="/tag/zujianxiaohui/" title="组件销毁" target="_blank">组件销毁</a><a href="/tag/wendangcaozuo/" title="文档操作" target="_blank">文档操作</a></div> </div> </div> </div> <!-- row end --> <!-- row --> <div class="row row-sm"> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <!-- f2er-rightads --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4605373693034661" data-ad-slot="7756441254" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> <!-- row end --> </div> <!-- right end --> </div> </div> <footer id="footer"> <div class="container"> <div class="row hidden-xs"> <dl class="col-sm-6 site-link"> <dt>最近更新</dt><dd><a href="/win11/1005328.html" title="小米手机重装系统价格多少?专业维修服务详解" target="_blank">· 小米手机重装系统价格多少?专业维修服务详解</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005327.html" title="手把手教你重装电脑系统,让你的电脑焕然一新!" target="_blank">· 手把手教你重装电脑系统,让你的电脑焕然一新!</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005326.html" title="教你一步步重装XP系统,让你的电脑重获新生" target="_blank">· 教你一步步重装XP系统,让你的电脑重获新生</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005325.html" title="从备份到上网:一步步教你重装电脑系统" target="_blank">· 从备份到上网:一步步教你重装电脑系统</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005324.html" title="Sony笔记本电脑一键重装系统详细图文教程" target="_blank">· Sony笔记本电脑一键重装系统详细图文教程</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005323.html" title="Lenovo笔记本重装系统超详细教程,小白也能轻松上手" target="_blank">· Lenovo笔记本重装系统超详细教程,小白也能轻松...</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005322.html" title="联想笔记本一键重装Win10系统详细教程" target="_blank">· 联想笔记本一键重装Win10系统详细教程</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005321.html" title="电脑系统故障无需愁,专业维修店帮你重装旧貌换新颜" target="_blank">· 电脑系统故障无需愁,专业维修店帮你重装旧貌换新...</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005320.html" title="联想笔记本一键重装Win10系统图文教程,小白也能轻松搞定!" target="_blank">· 联想笔记本一键重装Win10系统图文教程,小白也能...</a><span class="text-muted pull-right">02-05</span></dd> <dd><a href="/win11/1005319.html" title="笔记本重装系统图文教程:从光盘启动一步到位" target="_blank">· 笔记本重装系统图文教程:从光盘启动一步到位</a><span class="text-muted pull-right">02-05</span></dd> </dl> <dl class="col-sm-4 site-link"> <dt>好站推荐</dt><dd> <a href="https://www.runoob.com" title="菜鸟教程(www.runoob.com)提供了编程的基础技术教程, 介绍了HTML、CSS、Javascript、Python,Java,Ruby,C,PHP , MySQL等各种编程语言的基础知识。 同时本站中也提供了大量的在线实例,通过实例,您可以更好的学习编程。" target="_blank">菜鸟教程</a></dd><dd> <a href="https://www.jb51.cc" title="编程之家(www.jb51.cc)是成立于2017年面向全球中文开发者的技术内容分享平台。提供编程导航、编程问答、编程博文、编程百科、编程教程、编程工具、编程实例等开发者最需要的编程技术内容与开发工具支持,与你一起学习编程,相信编程改变未来!" target="_blank">编程之家</a></dd><dd> <a href="" title="前端之家 f2er.com 前端开发人员所需学习知识手册。" target="_blank">前端之家</a></dd></dl> <dl class="col-sm-2 site-link"> <dt>商务合作</dt> <dd><a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=76874919&site=qq&menu=yes">联系我们</a></dd> </dl> </div> <div class="copyright"> Copyright © 2019 前端之家. 当前版本 V7.0.16<br> <span class="ml5">前端之家 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">闽ICP备13020303号-10</a></span> </div> </div> </footer> <script type="text/javascript" src="/js/base.js"></script> </body> </html>