首页 文章 精选 留言 我的

精选列表

搜索[javascript],共9002篇文章
优秀的个人博客,低调大师

JavaScript ~ 排序算法(选择排序)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link type="text/css" rel="stylesheet" href="style/flex.css"> <style> body{ } #sort{ width: 1200px; height: auto; background: #FFFFFF; color: #606060; position: relative; } #title{ width: 100%; height: 60px; background: #9dc4d4; color: #FFFFFF; font-size: 28px; } #nav{ width: 100%; height: 60px; background: #ff6600; } .nav_item{ width: 70px; height: 50px; line-height: 50px; cursor: pointer; } #show-sort{ background: #EEEEEE; width: 1200px; height: 300px; } .sort-item{ margin-left: 15px; width: 30px; } #reset{ position: fixed; top: 30px; right: 30px; height: 42px; line-height: 42px; width: 120px; background: #2492ff; border-radius: 5px; text-align: center; color: #FFFFFF; cursor: pointer; } </style> </head> <body class="r-n-c-fs"> <div id="sort" class="c-n-fs-fs"> <div id="reset" onclick="SortCount(20)">产生随机数据</div> <div id="title" class="r-n-c-c"> 排序算法 </div> <div id="nav" class="r-n-c-c"> <div class="nav_item" onclick="SortOne()">冒泡排序</div> <div class="nav_item" onclick="SortTwo()">选择排序</div> <div class="nav_item">快速排序</div> <div class="nav_item">希尔排序</div> <div class="nav_item">归并排序</div> <div class="nav_item">基数排序</div> <div class="nav_item">堆排序</div> </div> <div id="show-sort" class="r-n-fs-fe"></div> </div> </body> <script> let countList = []; let docFrag = document.createDocumentFragment(); let domEle = document.getElementById("show-sort"); domEle.style.width = "1200px"; let renderWidth = domEle.style.width; SortCount(25); /** * 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素, * 如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换, * 也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 * */ function SortOne(){ /** * 遍历目标元素的所有子元素,将所有子元素移动到createDocumentFragment对象中 * */ for (let e of Array.from(domEle.children)){ // console.log(e); docFrag.appendChild(e); } let fragContent = Array.from(docFrag.children); /** * 在createDocumentFragment对象的children属性中取出所有子元素 * 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 * */ /* * 循环元素个数减一次(第一轮比较的总次数) * */ for(let i = 0;i < countList.length-1;i++){ /* * 每一轮比较都会将最大的数提升到最后的位置,所以每进行一轮比较,这一轮比较的最大值都会冒泡到最后位置 * 下一轮比较的总次数就不用考虑上一轮比较的最后一个值,所以循环一轮比较次数减一更加优化。 * */ for (let j = 1;j < countList.length-i;j++) { if (countList[j-1]>countList[j]){ [countList[j],countList[j-1]] = [countList[j-1],countList[j]]; [fragContent[j],fragContent[j-1]] = [fragContent[j-1],fragContent[j]] } } } for (let e of fragContent){ domEle.appendChild(e); } console.log(countList); console.log(fragContent); } /** * 选择排序(Selection-sort)是一种简单直观的排序算法。 * 它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置, * 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 * 以此类推,直到所有元素均排序完毕。 * */ function SortTwo() { /** * 遍历目标元素的所有子元素,将所有子元素移动到createDocumentFragment对象中 * */ for (let e of Array.from(domEle.children)){ // console.log(e); docFrag.appendChild(e); } let fragContent = Array.from(docFrag.children); /** * 在createDocumentFragment对象的children属性中取出所有子元素 * 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 * */ /* * 循环元素个数减一次(第一轮比较的总次数) * */ let min = 0; console.log(countList); for(let i = 0;i < countList.length-1;i++){ /* * 每一轮比较都会将最小的数提升到最前的位置,所以每进行一轮比较,这一轮比较的最小值都会被选择到最后前位置 * 下一轮比较的总次数就不用考虑上一轮比较的最前一个值,所以循环一轮比较开始基数加一。 * */ for (let j = i+1;j < countList.length;j++) { if (countList[j] < countList[i]) { [countList[i],countList[j]] = [countList[j],countList[i]]; [fragContent[i],fragContent[j]] = [fragContent[j],fragContent[i]]; } } } for (let e of fragContent){ domEle.appendChild(e); } } function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 寻找最小的数 minIndex = j; // 将最小数的索引保存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; } function SortCount(numberCount) { let baseItem = document.getElementsByClassName("sort-item"); let baseCount = baseItem.length; let count = baseCount + numberCount; let rWidth = parseInt(renderWidth); let modelWidth = (rWidth-(rWidth/count)*0.3)/count; if (baseCount!==0){ for (let item of baseItem){ item.style.width = modelWidth*0.7+"px"; item.style.marginLeft = modelWidth*0.3+"px"; } } for (let i = 0;i<numberCount;i++){ let tempEle = document.createElement("div"); let size = numberCreate(300); tempEle.className = "sort-item"; tempEle.dataset.size = size+""; tempEle.style.width = modelWidth*0.7+"px"; tempEle.style.height = size+"px"; tempEle.style.marginLeft = modelWidth*0.3+"px"; tempEle.style.backgroundColor = colorCreate(); domEle.appendChild(tempEle); countList.push(size); } } function colorCreate() { let color = ""; let str_item = ["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]; for (let i = 0;i<6;i++){ color += str_item[Math.floor(Math.random()*16)]; } return "#"+color; } function numberCreate(limitTop) { return Math.floor(Math.random() * limitTop); } </script> </html>

优秀的个人博客,低调大师

web前端javaScript 之 【Ajax】

Ajax是干什么的,为什么要学这个技术: 我们在上网浏览网站的时候,经常会看到下拉加载的的功能。例如百度图片、淘宝列表等等……,这种我们每次下滑,就自动加载更多的信息。这种信息不用每次刷新页面,而就会自动加载出来;那么我们前端,像这种不必刷新页面也能获取新的数据的技术,我们就需要使用ajax来实现。而ajax也是目前Web开发人员必须要掌握一种技术。简单来讲,ajax就是提交并且接收了服务器的数据,从而可以获取新的数据,来渲染页面的更新 Ajax技术核心是XMLHttpRequest对象(简称XHR),帮助记忆,可以想象是“小黄人”的拼音简称。这是由微软首先引入的一个特性,其他浏览器提供商也都是后来慢慢相同的实现这个技术。也是在2005年低,2006年初,Ajax技术才慢慢的红遍了技术圈。IE5是第一款引入的XHR对象的浏览器,目前我们只讲解适合于IE7之后的版本,之前的不做讲解。 ---用法:--- 一、创建一个ajax对象 首先我们需要构造出一个新的XMLHttpRequest var xhr = new XMLHttpRequest() 二、配置这个对象open(发送方式, 地址, 是否异步); 构造完之后,我们需要创建一个请求发送我们的数据,因为向服务器发送了请求,我们才能得到想要的数据。创建我们需要一个固定的方法open()。 open()它有三个参数,第一个是请求的方式(五种方式 :get/post/put/delete/head),第二个是请求的地址URL,第三个是个布尔值(true/false)代表是否异步。 比如我们向一个后端接口/villin.php发一个get请求,大部分的请求都是异步加载,我们我们就可以这样写。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); 三、发送请求 这就创造出了一个简单的请求数据,那么接下来我们要把这个数据发送给数据库,方法send(null); var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.send(null) send()方法按照中文意思理解,就是发送,它接收一个参数,作为请求主体发送的数据。如果不需要通过请求主体发送数据,就传入一个null,也可以不传,但是对于某些浏览器来说,是必须要传的,所以我们规范一点,写上null。 四、监听响应 这时,后端服务器接收到了我们发送的数据,就会返回我们想要的数据。 XHR的技术价值就是可以实时监听数据的变化,实时返回新的数据,那么怎么监听?他自身携带了一个属性,叫onreadystatechange,从字面意思理解,就是实时监听改变。所以我们监听之后要做的事件,都需要写在onreadystatechange函数当中。 onreadystatechange会监听一个叫readyState的值,这个值很重要,它会反映出当前响应过程的活动阶段,用0~4来表示: 0表示XHR刚创建出来,还没有初始化,没调用open()。1表示已经调用open()方法,但还没有调用send()。2表示已经调用send()方法,但还没有接收到数据。3表示服务器已经接收到了部分响应数据。4表示服务器已经接收到了全部响应数据,可以在客户端使用了。 所以当readyState返回4的时候,说明数据返回成功,我们就可以拿到相应的数据了。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ //成功返回数据,在这里获取数据 } } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 此时说明服务器已经接收到了全部响应(但响应未必是返回成功的数据)。那么服务器会把响应数据返回给浏览器,浏览器也就返回相应的状态码status,表示数据异常或成功。常见的状态码如下: 2开头,代表响应成功,如200。3开头,代表重定向,如302页面暂时重定向,304表示请求的资源并没有被修改,可以使用浏览器中缓存的版本。4开头,请求有错误,如400。5开头,服务器报错,如500。 所以我们要使用返回来的数据,先判断是否返回正常,一般是>=200并且<300。返回成功后,数据会被放置在一个叫responseText当中,我们直接打印出responseText就可以提取出内部的文本。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ //成功返回数据,在这里获取数据 if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } } } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 ---超时设定:timeout--- 最初,IE8为XHR提供了超时属性timeout,表示请求在等待多少毫秒之后就终止。再给timeout设置超时设定后,在规定时间没有接收到请求,那么就会触发timeout,进而调用ontimeout程序,如下: var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ try{ //成功返回数据,在这里获取数据 if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } }catch(val){ // 可以写timeout处理程序 } } } xhr.timeout = 2000; // 设置超时时间为2000mm,超出会调用ontimeout事件 xhr.ontimeout = function(){ alert('请求超时2000mm') } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 ️注意:如果在超时之后再访问status就会出现错误,所以我们可以将判断封装到try...catch语句,这样就可以完美的解决超时问题 ️虽然timeout是由IE提供的,不过目前其他浏览器的兼容性,还需要大家去尝试。 ---load事件--- Firefox在实现Ajax的简化模型时,引入了load事件。它可以代替onreadystatechange事件,响应完毕后将触发onload事件,所以我们就可以省去了检查readyState属性了,不比判断readyState是否等于4的问题了。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onload = function () { if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } } xhr.send(null) 目前Firefox、Oprea、Chrome、Safari都支持load事件。 ---浏览器跨域--- 通过XHR实现ajax通信的主要一个主要限制,就是来自跨域的安全策略(同源策略)。默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源,这种安全策略是为了预防某些恶意行为。 怎么解决跨域问题,其实IE与其他浏览器还各有千秋,比如IE与其他浏览器的CORS的实现,在open()方法中传入对决URL地址,如www开头的地址,我们就可以拿到绝对地址上的信息。还有一起其他跨域技术: JSONP Jsonp虽然和json长得很像,不过这两个还是没什么关系的,json是以键和值的方式存在的一种格式,Jsonp是由回调函数和数据组成的一种技术。 Jsonp是通过动态<script>元素来使用的,使用的时候可以为src指定一个跨域的URL。<script>元素有能力不受限制的从其他域中加载资源,所以可以实现跨域请求。 <script src='www.avillin.com/?callback=handleaaa'></script> // URL就是此地址,后边callback返回的就是函数,名称为handleaaa <script> function handleaaa(response){ console.log(response) } </script> 扩展:目前前端使用的vue框架中,也有自己的跨域方式,可以通过proxy来实现跨域。 更多关于ajax的知识,也欢迎一起探讨。 本文作者:avillin 邮箱:avillin@163.comv-chat:villinWechat

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册