<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>冼国基的博客</title>
    <description>欢迎来到我的个人网站</description>
    <link>https://xianguoji.github.io//</link>
    <atom:link href="https://xianguoji.github.io//feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 16 Mar 2026 15:45:00 +0000</pubDate>
    <lastBuildDate>Mon, 16 Mar 2026 15:45:00 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>前端性能优化一</title>
        <description>&lt;h4 id=&quot;可以在firefox下有一个插件yslow集成在firebug中你可以用它很方便地来看看自己的网站的各种优化性能&quot;&gt;可以在firefox下有一个插件yslow，集成在firebug中，你可以用它很方便地来看看自己的网站的各种优化性能。&lt;/h4&gt;

&lt;h3 id=&quot;第一条尽可能的减少-http-的请求数-make-fewer-http-requests-&quot;&gt;第一条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests )&lt;/h3&gt;

&lt;p&gt;http请求是要开销的，想办法减少请求数自然可以提高网页速度。常用的方法，合并css，js(将一个页面中的css和js文件分别合并)以及 Image maps和css sprites等。当然或许将css，js文件拆分多个是因为css结构，共用等方面的考虑。阿里巴巴中文站当时的做法是开发时依然分开开发，然后在后台 对js，css进行合并，这样对于浏览器来说依然是一个请求，但是开发时仍然能还原成多个，方便管理和重复引用。yahoo甚至建议将首页的css和js 直接写在页面文件里面，而不是外部引用。因为首页的访问量太大了，这么做也可以减少两个请求数。而事实上国内的很多门户都是这么做的。&lt;/p&gt;

&lt;p&gt;而css sprites是指只用将页面上的背景图合并成一张，然后通过css的background-position属性定义不过的值来取他的背景。淘宝和阿里巴巴中文站目前都是这样做的。有兴趣的可以看下淘宝和阿里巴巴的背景图。&lt;/p&gt;

&lt;p&gt;http://www.csssprites.com/ 这是个工具网站，它可以自动将你上传的图片合并并给出对应的background-position坐标。并将结果以png和gif的格式输出。&lt;/p&gt;

&lt;h3 id=&quot;第二条使用cdn内容分发网络-use-a-content-delivery-network&quot;&gt;第二条、使用CDN(内容分发网络): Use a Content Delivery Network&lt;/h3&gt;

&lt;p&gt;说实话，对于CDN这一块自己并不是很了解，简单地讲，通过在现有的Internet中增加一层新的网络架构，将网站的内容发布到最接近用户的 cache服务器内，通过DNS负载均衡的技术，判断用户来源就近访问cache服务器取得所需的内容，杭州的用户访问近杭州服务器上的内容，北京的访问 近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间，提高速度。更详细地内容大家可以参考百度百科上对于CDN的解释。Yahoo!把静态内 容分布到CDN减少了用户影响时间20%或更多。&lt;/p&gt;

&lt;h3 id=&quot;第三条-添加expirecache-control-头add-an-expires-header&quot;&gt;第三条、 添加Expire/Cache-Control 头：Add an Expires Header&lt;/h3&gt;

&lt;p&gt;现在越来越多的图片，脚本，css，flash被嵌入到页面中，当我们访问他们的时候势必会做许多次的http请求。其实我们可以通过设置 Expires header 来缓存这些文件。Expire其实就是通过header报文来指定特定类型的文件在览器中的缓存时间。大多数的图片，flash在发布后都是不需要经常修 改的，做了缓存以后这样浏览器以后就不需要再从服务器下载这些文件而是而直接从缓存中读取，这样再次访问页面的速度会大大加快。一个典型的HTTP 1.1协议返回的头信息：&lt;/p&gt;

&lt;p&gt;HTTP/1.1 200 OK&lt;/p&gt;

&lt;p&gt;Date: Fri, 30 Oct 1998 13:19:41 GMT&lt;/p&gt;

&lt;p&gt;Server: Apache/1.3.3 (Unix)&lt;/p&gt;

&lt;p&gt;Cache-Control: max-age=3600, must-revalidate&lt;/p&gt;

&lt;p&gt;Expires: Fri, 30 Oct 1998 14:19:41 GMT&lt;/p&gt;

&lt;p&gt;Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT&lt;/p&gt;

&lt;p&gt;ETag: “3e86-410-3596fbbc”&lt;/p&gt;

&lt;p&gt;Content-Length: 1040&lt;/p&gt;

&lt;p&gt;Content-Type: text/html&lt;/p&gt;

&lt;p&gt;其中通过服务器端脚本设置Cache-Control和Expires可以完成。&lt;/p&gt;

&lt;p&gt;据我了解，目前阿里巴巴中文站的Expires过期时间是30天。不过期间也有过问题，特别是对于脚本过期时间的设置还是应该仔细考虑下，不然相应 的脚本功能更新后客户端可能要过很长一段时间才能“感知”到这样的变化。以前做[suggest项目] 的时候就遇到过这个问题。所以，哪些应该缓存，哪些不该缓存还是应该仔细斟酌一番。&lt;/p&gt;

&lt;h3 id=&quot;第四条启用gzip压缩gzip-components&quot;&gt;第四条、启用Gzip压缩：Gzip Components&lt;/h3&gt;

&lt;p&gt;Gzip的思想就是把文件先在服务器端进行压缩，然后再传输。这样可以显著减少文件传输的大小。传输完毕后浏览器会 重新对压缩过的内容进行解压缩，并执行。目前的浏览器都能“良好”地支持 gzip。不仅浏览器可以识别，而且各大“爬虫”也同样可以识别，各位seoer可以放下心了。而且gzip的压缩比例非常大，一般压缩率为85%，就是 说服务器端100K的页面可以压缩到25K左右再发送到客户端。具体的Gzip压缩原理大家可以参考csdn上的《gzip压缩算法》 这篇文章。雅虎特别强调， 所有的文本内容都应该被gzip压缩: html (php), js, css, xml, txt… 这一点我们网站做得不错，是一个A。以前我们的首页也并不是A，因为首页上还有很多广告代码投放的js，这些广告代码拥有者的网站的js没有经过gzip 压缩，也会拖累我们网站。&lt;/p&gt;

&lt;p&gt;以上三点大多属于服务器端的内容，本人也是粗浅地了解而已。说得不对的地方有待各位指正。&lt;/p&gt;

&lt;h3 id=&quot;第五条将css放在页面最上面--put-stylesheets-at-the-top&quot;&gt;第五条、将css放在页面最上面 ( Put Stylesheets at the Top)&lt;/h3&gt;

&lt;p&gt;将css放在页面最上面，这是为什么?因为 ie，firefox等浏览器在css全部传输完全之前不会去渲染任何的东西。理由诚如小马哥说得那样很简单。css，全称Cascading Style Sheets (层叠样式表单)。层叠即意味这后面的css可以覆盖前面的css，级别高的css可以覆盖级别低的css。在[css之!important] 这篇文章的最下面曾简单地提到过这层级关系，这里我们只需要知道css可以被覆盖的。既然前面的可以被覆盖，浏览器在他完全加载完毕之后再去渲染无疑也是 合情合理的很多浏览器下，如IE，把样式表放在页面的底部的问题在于它禁止了网页内容的顺序显示。浏览器阻止显示以免重画页面元素，那用户只能看到空白页 了。Firefox不会阻止显示，但这意味着当样式表下载后，有些页面元素可能需要重画，这导致闪烁问题。所以我们应该尽快让css加载完毕&lt;/p&gt;

&lt;p&gt;顺着这层意思，如果我们再细究的话，其实还有可以优化的地方。比如本站上面包含的两个css文件，&amp;lt;linkrel=“stylesheet” rev=“stylesheet”href=“http://www.space007.com/themes/google/style/google.css” type=“text/css” media=“screen”/&amp;gt; 和&amp;lt;link rel=“stylesheet” rev=“stylesheet” href=“http://www.space007.com/css/print.css”type=“text/css” media=“print” /&amp;gt;。  从media就可以看出第一个css是针对浏览器的，第二个css文件是针对打印样式的。从用户的行为习惯上来将，要打印页面的动作一定是发生在页面页面 显示出来之后的。所以比较好的方法应该是在页面加载完毕之后再动态地为这张页面加上针对打印设备的css，这样又可以提高一点速度。(哈哈)&lt;/p&gt;

&lt;h3 id=&quot;第六条将script放在页面最下面-put-scripts-at-the-bottom-&quot;&gt;第六条、将script放在页面最下面 (Put Scripts at the Bottom )&lt;/h3&gt;

&lt;p&gt;将脚本放在页面最下面的目的有那么两点： 1、 因为防止script脚本的执行阻塞页面的下载。在页面loading的过程中，当浏览器读到js执行语句的时候一定会把它全部解释完毕后在会接下来读下 面的内容。不信你可以写一个js死循环看看页面下面的东西还会不会出来。(setTimeout 和 setInterval的执行有点类似于多线程，在相应的响应时间之前也会继续下面的内容渲染。)浏览器这么做的逻辑是因为js随时可能执 行 location.href或是其他可能完全中断此页面过程的函数，即如此，当然得等他执行完毕之后再加载咯。所以放在页面最后，可以有效减少页面可 视元素的加载时间。 2、脚本引起的第二个问题是它阻塞并行下载数量。HTTP/1.1规范建议浏览器每个主机的并行下载数不超过2个(IE只能为2个，其他浏览器如ff等都 是默认设置为2个，不过新出的ie8可以达6个)。因此如果您把图像文件分布到多台机器的话，您可以达到超过2个的并行下载。但是当脚本文件下载时，浏览 器不会启动其他的并行下载。&lt;/p&gt;

&lt;p&gt;当然对各个网站来说，把脚本都放到页面底部加载的可行性还是值得商榷的。就比如阿里巴巴中文站的页面。很多地方有内联的js，页面的显示严重依赖于此，我承认这和无侵入脚本的理念相差甚远，但是很多“历史遗留问题”却不是那么容易解决的。&lt;/p&gt;

&lt;h3 id=&quot;第七条避免在css中使用expressions-avoid-css-expressions-&quot;&gt;第七条、避免在CSS中使用Expressions (Avoid CSS Expressions )&lt;/h3&gt;

&lt;p&gt;不过这样就多了两层无意义的嵌套，肯定不好。还需要一个更好的办法。&lt;/p&gt;

&lt;h3 id=&quot;第八条把javascript和css都放到外部文件中-make-javascript-and-css-external-&quot;&gt;第八条、把javascript和css都放到外部文件中 (Make JavaScript and CSS External )&lt;/h3&gt;

&lt;p&gt;这点我想还是很容易理解的。不仅从性能优化上会这么做，用代码易于维护的角度看也应该这么做。把css和js写在页面内容可以减少2次请求，但也增 大了页面的大小。如果已经对css和js做了缓存，那也就没有2次多余的http请求了。当然，我在前面中也说过，有些特殊的页面开发人员还是会选择内联 的css和js文件。&lt;/p&gt;

&lt;h3 id=&quot;第九条减少dns查询-reduce-dns-lookups&quot;&gt;第九条、减少DNS查询 (Reduce DNS Lookups)&lt;/h3&gt;

&lt;p&gt;在 Internet上域名与IP地址之间是一一对应的，域名(kuqin.com)很好记，但计算机不认识，计算机之间的“相认”还要转成ip地址。在网络 上每台计算机都对应有一个独立的ip地址。在域名和ip地址之间的转换工作称为域名解析，也称DNS查询。一次DNS的解析过程会消耗20-120毫秒的 时间,在dns查询结束之前，浏览器不会下载该域名下的任何东西。所以减少dns查询的时间可以加快页面的加载速度。yahoo的建议一个页面所包含的域 名数尽量控制在2-4个。这就需要对页面整体有一个很好的规划。目前我们这点做的不好，很多打点的广告投放系统拖累了我们。&lt;/p&gt;

&lt;h3 id=&quot;第十条压缩-javascript-和-css-minify-javascript-&quot;&gt;第十条、压缩 JavaScript 和 CSS (Minify JavaScript )&lt;/h3&gt;

&lt;p&gt;压缩js和css的左右很显然，减少页面字节数。容量小页面加载速度自然也就快。而且压缩除了减少体积以外还可以起到一定的保护左右。这点我们做得 不错。常用的压缩工具有JsMin、YUI compressor等。另外像http://dean.edwards.name/packer/还给我们提供了一个非常方便的在线压缩工具。你可以在 jQuery的网页看到压缩过的js文件和没有压缩过的js文件的容量差别：&lt;/p&gt;

&lt;p&gt;性能优化2&lt;/p&gt;

&lt;p&gt;当然，压缩带来的一个弊端就是代码的可读性没了。相信很多做前端的朋友都遇到过这个问题：看Google的效果很酷，可是去看他的源代码却是一大堆 挤在一起的字符，连函数名都是替换过的，汗死!自己的代码也这样岂不是对维护非常不方便。所有阿里巴巴中文站目前采用的做法是在js和css发布的时候在 服务器端进行压缩。这样在我们很方便地维护自己的代码。&lt;/p&gt;

&lt;h3 id=&quot;第十一条避免重定向-avoid-redirects-&quot;&gt;第十一条、避免重定向 (Avoid Redirects )&lt;/h3&gt;

&lt;p&gt;不久前在ieblog上看到过《Internet Explorer and Connection Limits》 这篇文章，比如 当你输入http://www.kuqin.com/ 的时候服务器会自动产生一个301服务器转向 http://www.kuqin.com/ ，你看浏览器的地址栏就能看出来。这种重定向自然也是需要消耗时间的。当然这只是一个例子，发生重定向的原因还有很多，但是不变的是每增加一次重定向就会 增加一次web请求，所以因该尽量减少。&lt;/p&gt;

&lt;h3 id=&quot;第十二条移除重复的脚本-remove-duplicate-scripts-&quot;&gt;第十二条、移除重复的脚本 (Remove Duplicate Scripts )&lt;/h3&gt;

&lt;p&gt;这点我想不说也知道，不仅是从性能上考虑，代码规范上看也是这样。但是不得不承认，很多时候我们会因为图一时之快而加上一些或许是重复的代码。或许一个统一的css框架和js框架可以比较好的解决我们的问题。小猪的观点很对，不仅是要做到不重复，更是要做到可重用。&lt;/p&gt;

&lt;h3 id=&quot;第十三条配置实体标签etags-configure-etags-&quot;&gt;第十三条、配置实体标签(ETags) (Configure ETags )&lt;/h3&gt;

&lt;p&gt;这点我也不懂，呵呵。在inforQ上找到一篇解释得比较详细的说明《使用ETags减少Web应用带宽和负载》，有兴趣的同学可以去看看。&lt;/p&gt;

&lt;h3 id=&quot;第十四条使-ajax-缓存-make-ajax-cacheable-&quot;&gt;第十四条、使 AJAX 缓存 (Make Ajax Cacheable )&lt;/h3&gt;

&lt;p&gt;ajax还要去缓存?做ajax请求的时候往往还要增加一个时间戳去避免他缓存。It’s important to remember that “asynchronous” does not imply “instantaneous”.(记住“异步”不是“瞬间”这一点很重要)。记住，即使AJAX是动态产生的而且只对一个用户起作用，他们依然可以被缓 存。&lt;/p&gt;

&lt;h3 id=&quot;1减少http请求次数&quot;&gt;1.减少HTTP请求次数&lt;/h3&gt;

&lt;p&gt;合并图片、CSS、JS，改进首次访问用户等待时间。&lt;/p&gt;

&lt;h3 id=&quot;2使用cdn&quot;&gt;2.使用CDN&lt;/h3&gt;

&lt;p&gt;就近缓存==&amp;gt;智能路由==&amp;gt;负载均衡==&amp;gt;WSA全站动态加速&lt;/p&gt;

&lt;h3 id=&quot;3避免空的src和href&quot;&gt;3.避免空的src和href&lt;/h3&gt;

&lt;p&gt;当link标签的href属性为空、script标签的src属性为空的时候，浏览器渲染的时候会把当前页面的URL作为它们的属性值，从而把页面的内容加载进来作为它们的值。测试&lt;/p&gt;

&lt;h3 id=&quot;4为文件头指定expires&quot;&gt;4.为文件头指定Expires&lt;/h3&gt;

&lt;p&gt;使内容具有缓存性。避免了接下来的页面访问中不必要的HTTP请求。&lt;/p&gt;

&lt;h3 id=&quot;5使用gzip压缩内容&quot;&gt;5.使用gzip压缩内容&lt;/h3&gt;

&lt;p&gt;压缩任何一个文本类型的响应，包括XML和JSON，都是值得的。&lt;/p&gt;

&lt;h3 id=&quot;6把css放到顶部&quot;&gt;6.把CSS放到顶部&lt;/h3&gt;

&lt;h3 id=&quot;7把js放到底部&quot;&gt;7.把JS放到底部&lt;/h3&gt;

&lt;p&gt;防止js加载对之后资源造成阻塞。&lt;/p&gt;

&lt;h3 id=&quot;8避免使用css表达式&quot;&gt;8.避免使用CSS表达式&lt;/h3&gt;

&lt;h3 id=&quot;9将css和js放到外部文件中&quot;&gt;9.将CSS和JS放到外部文件中&lt;/h3&gt;

&lt;p&gt;目的是缓存，但有时候为了减少请求，也会直接写到页面里，需根据PV和IP的比例权衡。&lt;/p&gt;

&lt;h3 id=&quot;10权衡dns查找次数&quot;&gt;10.权衡DNS查找次数&lt;/h3&gt;

&lt;p&gt;减少主机名可以节省响应时间。但同时，需要注意，减少主机会减少页面中并行下载的数量。&lt;/p&gt;

&lt;p&gt;IE浏览器在同一时刻只能从同一域名下载两个文件。当在一个页面显示多张图片时，IE 用户的图片下载速度就会受到影响。所以新浪会搞N个二级域名来放图片。&lt;/p&gt;

&lt;h3 id=&quot;11精简css和js&quot;&gt;11.精简CSS和JS&lt;/h3&gt;

&lt;h3 id=&quot;12避免跳转&quot;&gt;12.避免跳转&lt;/h3&gt;

&lt;p&gt;同域：注意避免反斜杠 “/” 的跳转；&lt;/p&gt;

&lt;p&gt;跨域：使用Alias或者mod_rewirte建立CNAME（保存域名与域名之间关系的DNS记录）&lt;/p&gt;

&lt;h3 id=&quot;13删除重复的js和css&quot;&gt;13.删除重复的JS和CSS&lt;/h3&gt;

&lt;p&gt;重复调用脚本，除了增加额外的HTTP请求外，多次运算也会浪费时间。在IE和Firefox中不管脚本是否可缓存，它们都存在重复运算JavaScript的问题。&lt;/p&gt;

&lt;h3 id=&quot;14配置etags&quot;&gt;14.配置ETags&lt;/h3&gt;

&lt;p&gt;它用来判断浏览器缓存里的元素是否和原来服务器上的一致。比last-modified date更具有弹性，例如某个文件在1秒内修改了10次，Etag可以综合Inode(文件的索引节点(inode)数)，MTime(修改时间)和 Size来精准的进行判断，避开UNIX记录MTime只能精确到秒的问题。 服务器集群使用，可取后两个参数。使用ETags减少Web应用带宽和负载&lt;/p&gt;

&lt;h3 id=&quot;15可缓存的ajax&quot;&gt;15.可缓存的AJAX&lt;/h3&gt;

&lt;p&gt;“异步”并不意味着“即时”：Ajax并不能保证用户不会在等待异步的JavaScript和XML响应上花费时间。&lt;/p&gt;

&lt;h3 id=&quot;16使用get来完成ajax请求&quot;&gt;16.使用GET来完成AJAX请求&lt;/h3&gt;

&lt;p&gt;当使用XMLHttpRequest时，浏览器中的POST方法是一个“两步走”的过程：首先发送文件头，然后才发送数据。因此使用GET获取数据时更加有意义。&lt;/p&gt;

&lt;h3 id=&quot;17减少dom元素数量&quot;&gt;17.减少DOM元素数量&lt;/h3&gt;

&lt;p&gt;是否存在一个是更贴切的标签可以使用？标签语义化，避免滥用无意义标签&lt;/p&gt;

&lt;h3 id=&quot;18避免404&quot;&gt;18.避免404&lt;/h3&gt;

&lt;p&gt;有些站点把404错误响应页面改为“你是不是要找***”，这虽然改进了用户体验但是同样也会浪费服务器资源（如数据库等）。最糟糕的情况是指向外部 JavaScript的链接出现问题并返回404代码。首先，这种加载会破坏并行加载；其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当 作JavaScript代码来执行。&lt;/p&gt;

&lt;h3 id=&quot;19减少cookie的大小&quot;&gt;19.减少Cookie的大小&lt;/h3&gt;

&lt;h3 id=&quot;20使用无cookie的域&quot;&gt;20.使用无cookie的域&lt;/h3&gt;

&lt;p&gt;比如图片 CSS 等，Yahoo! 的静态文件都在 yimg.com 上，客户端请求静态文件的时候，减少了 Cookie 的反复传输对主域名 (yahoo.com) 的影响。&lt;/p&gt;

&lt;h3 id=&quot;21不要使用滤镜&quot;&gt;21.不要使用滤镜&lt;/h3&gt;

&lt;p&gt;png24的在IE6半透明那种东西，别乱使，淡定的切成PNG8+jpg&lt;/p&gt;

&lt;h3 id=&quot;22不要在html中缩放图片&quot;&gt;22.不要在HTML中缩放图片&lt;/h3&gt;

&lt;h3 id=&quot;23缩小faviconico并缓存&quot;&gt;23.缩小favicon.ico并缓存&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;link href=&quot;/favicon.ico&quot; rel=&quot;Shortcut Icon&quot; type=&quot;image/x-icon&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Sun, 18 Jun 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/06/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B8%80/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/06/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B8%80/</guid>
        
        <category>性能优化</category>
        
        
      </item>
    
      <item>
        <title>调用百度地图插件-更新</title>
        <description>&lt;h3 id=&quot;调用百度地图插件常用技术&quot;&gt;调用百度地图插件,常用技术&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1.创建地图： var map = new BMap.Map(&quot;divid&quot;);

2.创建坐标点：var point = new BMap.Point(&quot;经度&quot;,&quot;纬度&quot;);

3.设置视图中心点：map.centerAndZoom(point,size);

4.激活滚轮调整大小功能：map.enableScrollWheelZoom();

5.添加控件：map.addControl(new BMap.Xxx());

6.添加覆盖物：map.addOverlay();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;控件介绍&quot;&gt;控件介绍&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;1.NavigationControl：缩放地图的控件，默认在左上角；

2.OverviewMapControl：地图的缩略图的控件，默认在右下方；

3.ScaleControl：地图显示比例的控件，默认在左下方；

4.MapTypeControl：地图类型控件，默认在右上方；
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;代码示例&quot;&gt;代码示例：&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;```
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;!--引用百度地图--&amp;gt;
		&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://api.map.baidu.com/api?v=1.3&quot;&amp;gt;
		&amp;lt;/script&amp;gt;
		&amp;lt;title&amp;gt;
			控件使用
		&amp;lt;/title&amp;gt;
				&amp;lt;!--
		设计样式
			container容器：占50%大小
		--&amp;gt;
		&amp;lt;style type=&quot;text/css&quot;&amp;gt;
		#container{
			width:50%;
			height:50%;
		}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div id=&quot;container&quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
			var map = new BMap.Map(&quot;container&quot;);//在container容器中创建一个地图,参数container为div的id属性;
			var point = new BMap.Point(500,500);//定位
			map.centerAndZoom(point,15);				//将point移到浏览器中心，并且地图大小调整为15;
			map.addControl(new BMap.NavigationControl());
			map.addControl(new BMap.MapTypeControl());
			map.addControl(new BMap.ScaleControl());
			map.addControl(new BMap.OverviewMapControl());
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;标注marker&quot;&gt;标注：Marker&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; 百度地图API学习总结

(1)在point处添加标注：var marker = new BMap.Marker(point);

(2)添加覆盖物：map.addOverlay(marker);

(3)激活标注的拖拽功能：marker.enableDragging();

(4)为标注添加事件：marker.addEventListener(&quot;名称&quot;,function(){

    //点击标注后的事件

});

(5)删除覆盖物：map.removeOverlay(marker);

(6)销毁标注：marker.dispose();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;信息窗口infowindow&quot;&gt;信息窗口：InfoWindow&lt;/h3&gt;

&lt;p&gt;(1)在某个特定的位置创建一个信息窗口：var infowindow = new BMap.InfoWindow(“内容”,{width:250,height:100,title:”hello”});&lt;/p&gt;

&lt;p&gt;(2)在地图中央打开信息窗口：map.openInfoWindow(infoWindow,map.getCenter());&lt;/p&gt;

&lt;h3 id=&quot;完整代码&quot;&gt;完整代码&lt;/h3&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &amp;lt;!DOCTYPE html&amp;gt;
  &amp;lt;html&amp;gt;

  &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
      &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
      &amp;lt;!--地图 --&amp;gt;
          &amp;lt;script src=&quot;https://api.map.baidu.com/api?v=2.0&amp;amp;ak=GW0UPwBKw1aCl983mr4WFLCcBn8u18Az&amp;amp;s=1&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&amp;gt;&amp;lt;/script&amp;gt;
       &amp;lt;!--地图 --&amp;gt;
      &amp;lt;style type=&quot;text/css&quot;&amp;gt;
          * {
              margin: 0;
              padding: 0;
          }

          html,
          body {
              width: 100%;
              height: 100%;
              position: relative;
          }

          h3 {
              display: block;
              width: 100%;
              height: 60px;
              line-height: 60px;
              text-align: center;
              background: aquamarine;
              color: #fff;
              font-size: 40px;
          }

      &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
  &amp;lt;h3&amp;gt;我的地图&amp;lt;/h3&amp;gt;
  &amp;lt;div id=&quot;baiduMap&quot; style=&quot;width:100%;margin-top: 51px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;script&amp;gt;
      var map = new BMap.Map(&quot;baiduMap&quot;);
      map.addControl(new BMap.MapTypeControl()); //添加地图类型控件
      map.addControl(new BMap.NavigationControl());   //添加左上地图缩放控件
  //        map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放

      var point = new BMap.Point(113.305679,23.104074);//定位
      map.centerAndZoom(point,15);//将point移到浏览器中心，并且地图大小调整为15;
      var marker = new BMap.Marker(point);// 创建标注
      map.addOverlay(marker);// 将标注添加到地图中

      var opts = {
          width : 200,     // 信息窗口宽度
          height: 50,     // 信息窗口高度
          title : &quot;Hello&quot;  // 信息窗口标题
      }
      var infoWindow = new BMap.InfoWindow(&quot;World&quot;, opts);  // 创建信息窗口对象
      marker.openInfoWindow(infoWindow, map.getCenter());      // 打开信息窗口
      marker.addEventListener(&quot;click&quot;,function(){
          //点击标注后的事件
          marker.openInfoWindow(infoWindow, map.getCenter());      // 打开信息窗口
      });

  &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;

  &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Mon, 15 May 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/05/%E8%B0%83%E7%94%A8%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE%E6%8F%92%E4%BB%B6-%E6%9B%B4%E6%96%B0/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/05/%E8%B0%83%E7%94%A8%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE%E6%8F%92%E4%BB%B6-%E6%9B%B4%E6%96%B0/</guid>
        
        <category>javascript</category>
        
        
      </item>
    
      <item>
        <title>vue搭建项目</title>
        <description>&lt;h3 id=&quot;vue推荐开发环境&quot;&gt;Vue推荐开发环境&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Node.js 6.2.0、npm 3.8.9、webpack 1.13、vue-cli 2.5.1、webstrom2016
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在开始安装环境&lt;/p&gt;

&lt;h3 id=&quot;安装nodejs&quot;&gt;安装nodejs&lt;/h3&gt;

&lt;p&gt;可以在终端里下载，但是不推荐，npm的版本会报错&lt;/p&gt;

&lt;p&gt;去nodejs官网下载即可，地址：&lt;a href=&quot;http://nodejs.cn/&quot;&gt;http://nodejs.cn/&lt;/a&gt;中文网&lt;/p&gt;

&lt;h3 id=&quot;安装vue淘宝镜像&quot;&gt;安装vue淘宝镜像&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install -g vue –registry=https://registry.npm.taobao.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;安装webpack&quot;&gt;安装webpack&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install webpack -g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;安装vue脚手架&quot;&gt;安装vue脚手架&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install vue-cli -g
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;—————-如果第二次编写新的vue项目，就可以在这里开始了—————–&lt;/p&gt;

&lt;h3 id=&quot;根据模板创建项目&quot;&gt;根据模板创建项目&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vue init webpack 项目名字&amp;lt;项目名字不能用中文&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;会有一些初始化的设置如下输入&quot;&gt;会有一些初始化的设置，如下输入:&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Target directory exists. Continue? (Y/n) 直接回车默认(然后会下载 vue2.0模板，这里可能需要连代理)

Project name (vue-test) 直接回车默认

Project description (A Vue.js project) 直接回车默认

Author 直接回车默认

? Vue build (Use arrow keys)
&amp;gt; Runtime + Compiler: recommended for most users
  Runtime-only: about 6KB lighter min+gzip, but templates (or any Vue-specific
HTML) are ONLY allowed in .vue files - render functions are required elsewhere  直接回车默认

? Install vue-router? (Y/n)  是否安装vue-router y 安装 （可新建好项目后手动安装）

Use ESLint to lint your code? n  是否启动语法报错（建议不启动）

pick an eslint preset. 默认Standard

setup unit tests with karma + mocha?No(单元测试不需要)

setup e2e tests with Nightwatch?No(单元测试不需要)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;进入项目&quot;&gt;进入项目&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd 项目名字
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;安装项目依赖&quot;&gt;安装项目依赖&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;安装-vue-路由模块vue-router和网络请求模块vue-resource-save-dev-是你开发时候依赖的东西save-是你发布之后还依赖的东西如果在初始化设置已经安装了可省略&quot;&gt;安装 vue 路由模块vue-router和网络请求模块vue-resource –save-dev 是你开发时候依赖的东西，–save 是你发布之后还依赖的东西（如果在初始化设置已经安装了可省略）&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm install vue-router vue-resource –save
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;启动项目&quot;&gt;启动项目&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;发布项目打包项目会在目录多出一个build目录为项目打包好的项目直接放到服务器就可以&quot;&gt;发布项目（打包项目，会在目录多出一个build目录为项目打包好的项目，直接放到服务器就可以）&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Sun, 23 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/04/vue%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/04/vue%E6%90%AD%E5%BB%BA%E9%A1%B9%E7%9B%AE/</guid>
        
        <category>js</category>
        
        
      </item>
    
      <item>
        <title>调用百度地图插件</title>
        <description>&lt;p&gt;　　# 调用百度地图插件&lt;/p&gt;

&lt;p&gt;### 引入百度地图插件
    &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;
  &amp;lt;script src=&quot;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=W1a6ywZFkybedSCHadpRbkz4w5HYfG4R&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&amp;gt;&amp;lt;/script&amp;gt;
   &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;### 完整代码&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &amp;lt;!DOCTYPE html&amp;gt;
  &amp;lt;html&amp;gt;

  &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
      &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
      &amp;lt;script src=&quot;http://api.map.baidu.com/api?v=2.0&amp;amp;ak=W1a6ywZFkybedSCHadpRbkz4w5HYfG4R&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&amp;gt;&amp;lt;/script&amp;gt;
      &amp;lt;style type=&quot;text/css&quot;&amp;gt;
          * {
              margin: 0;
              padding: 0;
          }

          html,
          body {
              width: 100%;
              height: 100%;
              position: relative;
          }

          h3 {
              display: block;
              width: 100%;
              height: 60px;
              line-height: 60px;
              text-align: center;
              background: aquamarine;
              color: #fff;
              font-size: 40px;
          }

          #allmap {
              width: 100%;
              height: 700px;
          }
          #r-result{
              position: absolute;
              left: 0;
              top: 100px;
              background: #000;
              color: #fff;
          }
      &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;

  &amp;lt;body&amp;gt;
  &amp;lt;h3&amp;gt;我的地图&amp;lt;/h3&amp;gt;
  &amp;lt;div id=&quot;allmap&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;r-result&quot;&amp;gt;请输入:&amp;lt;input type=&quot;text&quot; id=&quot;suggestId&quot; size=&quot;20&quot; value=&quot;百度&quot; style=&quot;width:150px;&quot; /&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div id=&quot;searchResultPanel&quot; style=&quot;border:1px solid #C0C0C0;width:150px;height:auto; display:none;&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
      var map = new BMap.Map(&quot;allmap&quot;);
      map.centerAndZoom(&quot;广州&quot;, 15); // 初始化地图,设置中心点坐标和地图级别
      map.addControl(new BMap.MapTypeControl()); //添加地图类型控件
      map.setCurrentCity(&quot;广州&quot;); // 设置地图显示的城市 此项是必须设置的
      map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
      function G(id) {
          return document.getElementById(id);
      }
      var ac = new BMap.Autocomplete( //建立一个自动完成的对象
              {
                  &quot;input&quot;: &quot;suggestId&quot;,
                  &quot;location&quot;: map
              });

      ac.addEventListener(&quot;onhighlight&quot;, function(e) { //鼠标放在下拉列表上的事件
          var str = &quot;&quot;;
          var _value = e.fromitem.value;
          var value = &quot;&quot;;
          if(e.fromitem.index &amp;gt; -1) {
              value = _value.province + _value.city + _value.district + _value.street + _value.business;
          }
          str = &quot;FromItem&amp;lt;br /&amp;gt;index = &quot; + e.fromitem.index + &quot;&amp;lt;br /&amp;gt;value = &quot; + value;

          value = &quot;&quot;;
          if(e.toitem.index &amp;gt; -1) {
              _value = e.toitem.value;
              value = _value.province + _value.city + _value.district + _value.street + _value.business;
          }
          str += &quot;&amp;lt;br /&amp;gt;ToItem&amp;lt;br /&amp;gt;index = &quot; + e.toitem.index + &quot;&amp;lt;br /&amp;gt;value = &quot; + value;
          G(&quot;searchResultPanel&quot;).innerHTML = str;
      });

      var myValue;
      ac.addEventListener(&quot;onconfirm&quot;, function(e) { //鼠标点击下拉列表后的事件
          var _value = e.item.value;
          myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
          G(&quot;searchResultPanel&quot;).innerHTML = &quot;onconfirm&amp;lt;br /&amp;gt;index = &quot; + e.item.index + &quot;&amp;lt;br /&amp;gt;myValue = &quot; + myValue;

          setPlace();
      });

      function setPlace() {
          map.clearOverlays(); //清除地图上所有覆盖物
          function myFun() {
              var pp = local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
              map.centerAndZoom(pp, 18);
              map.addOverlay(new BMap.Marker(pp)); //添加标注
          }
          var local = new BMap.LocalSearch(map, { //智能搜索
              onSearchComplete: myFun
          });
          local.search(myValue);
      }
  &amp;lt;/script&amp;gt;

  &amp;lt;/body&amp;gt;

  &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;### 转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Fri, 21 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/04/%E8%B0%83%E7%94%A8%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE%E6%8F%92%E4%BB%B6/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/04/%E8%B0%83%E7%94%A8%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE%E6%8F%92%E4%BB%B6/</guid>
        
        <category>javascript</category>
        
        
      </item>
    
      <item>
        <title>vue环境配置及创建vue项目</title>
        <description>&lt;p&gt;　　# vue环境配置及创建vue项目&lt;/p&gt;

&lt;h3 id=&quot;安装-nodejs&quot;&gt;安装 node.js&lt;/h3&gt;

&lt;p&gt;首先需要安装node环境，可以直接到中文官网:http://nodejs.cn/ 下载安装包。&lt;/p&gt;

&lt;p&gt;只是这样安装的 node 是固定版本的，如果需要多版本的 node，可以使用 nvm 安装:http://blog.csdn.net/s8460049/article/details/52396399&lt;/p&gt;

&lt;p&gt;安装完成后，可以命令行工具中输入 node -v 和 npm -v，如果能显示出版本号，就说明安装成功。&lt;/p&gt;

&lt;h3 id=&quot;安装-vue-cli&quot;&gt;安装 vue-cli&lt;/h3&gt;

&lt;p&gt;安装好了 node，我们可以直接全局安装 vue-cli&lt;/p&gt;

&lt;p&gt;npm install -g vue-cli&lt;/p&gt;

&lt;p&gt;但是这种安装方式比较慢，推荐使用国内镜像来安装，所以我们先设置 cnpm&lt;/p&gt;

&lt;p&gt;npm install -g cnpm –registry=https://registry.npm.taobao.org&lt;/p&gt;

&lt;p&gt;如果安装失败，可以使用&lt;/p&gt;

&lt;p&gt;npm cache clean&lt;/p&gt;

&lt;p&gt;清理缓存，然后再重新安装。后面的安装过程中，如有安装失败的情况，也需要先清理缓存&lt;/p&gt;

&lt;p&gt;同样可以使用 cnpm -v 查看是否安装成功&lt;/p&gt;

&lt;p&gt;然后使用 cnpm 安装 vue-cli 和 webpack&lt;/p&gt;

&lt;p&gt;cnpm install -g vue-cli&lt;/p&gt;

&lt;p&gt;最新的 vue 项目模板中，都带有 webpack 插件，所以这里可以不安装 webpack&lt;/p&gt;

&lt;p&gt;安装完成后，可以使用 vue -V （注意 V 大写）查看是否安装成功。&lt;/p&gt;

&lt;p&gt;如果提示“无法识别 ‘vue’ ” ，有可能是 npm 版本过低，可以使用 npm install -g npm 来更新版本&lt;/p&gt;

&lt;h3 id=&quot;创建vue项目&quot;&gt;创建vue项目&lt;/h3&gt;

&lt;p&gt; vue init webpack 项目名称&lt;/p&gt;

&lt;p&gt;然后会出现一些简单的配置&lt;/p&gt;

&lt;p&gt;? Project name (zlejvue)&lt;/p&gt;

&lt;p&gt;? Project name zlejvue&lt;/p&gt;

&lt;p&gt;? Project description (A Vue.js project)&lt;/p&gt;

&lt;p&gt;? Project description A Vue.js project&lt;/p&gt;

&lt;p&gt;? Author&lt;/p&gt;

&lt;p&gt;? Author&lt;/p&gt;

&lt;p&gt;? Vue build (Use arrow keys)&lt;/p&gt;

&lt;p&gt;? Vue build standalone&lt;/p&gt;

&lt;p&gt;? Install vue-router? (Y/n)&lt;/p&gt;

&lt;p&gt;? Install vue-router? Yes&lt;/p&gt;

&lt;p&gt;? Use ESLint to lint your code? (Y/n) n&lt;/p&gt;

&lt;p&gt;? Use ESLint to lint your code? No&lt;/p&gt;

&lt;p&gt;? Setup unit tests with Karma + Mocha? (Y/n) n&lt;/p&gt;

&lt;p&gt;? Setup unit tests with Karma + Mocha? No&lt;/p&gt;

&lt;p&gt;? Setup e2e tests with Nightwatch? (Y/n) n&lt;/p&gt;

&lt;p&gt;? Setup e2e tests with Nightwatch? No
  
配置完之后就可以按照他的步骤打开项目&lt;/p&gt;

&lt;p&gt;cd zlejvue&lt;/p&gt;

&lt;p&gt;npm install&lt;/p&gt;

&lt;p&gt;npm run dev&lt;/p&gt;

&lt;p&gt;### 转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Fri, 21 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/04/vue%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%8F%8A%E5%88%9B%E5%BB%BAvue%E9%A1%B9%E7%9B%AE/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/04/vue%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E5%8F%8A%E5%88%9B%E5%BB%BAvue%E9%A1%B9%E7%9B%AE/</guid>
        
        <category>javascript</category>
        
        
      </item>
    
      <item>
        <title>锤子科技官网banner3D效果</title>
        <description>&lt;p&gt;　　# 锤子科技官网banner3D效果&lt;/p&gt;

&lt;p&gt;前段时间看到锤子官网的banner3D效果觉得好酷炫，然后就在网上搜了一下实现方法，发现还真有。
  我就借鉴了他的demo来自己写了一个简单背景变换的demo，因为没有做过渡效果，没官网好看，还算凑合，
  可以看效果&lt;/p&gt;

&lt;p&gt;这是锤子官网效果，可以自行去看看：http://www.smartisan.com/#/home&lt;/p&gt;

&lt;p&gt;附上代码：&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &amp;lt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;DOCTYPE html&amp;gt;
  &amp;lt;html&amp;gt;
  &amp;lt;&lt;span class=&quot;nb&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
      &amp;lt;meta &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;/&amp;gt;
      &amp;lt;style&amp;gt;


          section &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
              margin: auto&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              width: 1000px&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              height: 500px&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              margin-top: 100px&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

          .cover &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
              width: 100%&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              height: 100%&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              border-radius: 10px&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              background-color: &lt;span class=&quot;c&quot;&gt;#5e5e5e;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

          /&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;transform&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/
          section &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
              position: relative&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              perspective: 2000px&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

          .cover &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
              transform-origin: 50% 50% 0&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

      &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;section&amp;gt;
      &amp;lt;div &lt;span class=&quot;nv&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;cover&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
      &amp;lt;/div&amp;gt;
  &amp;lt;/section&amp;gt;
  &amp;lt;script&amp;gt;
      var origin &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
          X: document.body.clientWidth / 2,
          Y: document.body.clientHeight / 2
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      var o &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; document.querySelector&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;.cover&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      document.querySelector&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;section&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;.onmouseover&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
          document.querySelector&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;section&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;.addEventListener&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;mousemove&apos;&lt;/span&gt;, &lt;span class=&quot;k&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
              var rotate &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;x: 1 - e.pageY / origin.Y, y: e.pageX / origin.X - 1&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              var transform &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rotateX(&quot;&lt;/span&gt; + rotate.x &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;10 + &lt;span class=&quot;s2&quot;&gt;&quot;deg) rotateY(&quot;&lt;/span&gt; + rotate.y &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; 10 + &lt;span class=&quot;s2&quot;&gt;&quot;deg)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  //变换效果
              o.style.transform &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; transform&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
              o.style.boxShadow &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-parseInt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;rotate.y &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; 30&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; + &lt;span class=&quot;s1&quot;&gt;&apos;px &apos;&lt;/span&gt;+ parseInt&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;rotate.x &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; 20+20&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;+ &lt;span class=&quot;s1&quot;&gt;&apos;px &apos;&lt;/span&gt; + &lt;span class=&quot;s1&quot;&gt;&apos;50px #333&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;  //边框阴影效果
          &lt;span class=&quot;o&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      document.querySelector&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;section&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;.onmouseout&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(){&lt;/span&gt;
              o.style.transform &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;rotateX(0deg) rotateY(0deg)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          o.style.boxShadow &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;0px 0px&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

  &amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;### 转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/04/%E9%94%A4%E5%AD%90%E7%A7%91%E6%8A%80%E5%AE%98%E7%BD%91banner3D%E6%95%88%E6%9E%9C/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/04/%E9%94%A4%E5%AD%90%E7%A7%91%E6%8A%80%E5%AE%98%E7%BD%91banner3D%E6%95%88%E6%9E%9C/</guid>
        
        <category>javascript</category>
        
        
      </item>
    
      <item>
        <title>Linux平台安装图像化桌面CentOS 7</title>
        <description>&lt;h1 id=&quot;linux平台安装图像化桌面centos-7&quot;&gt;Linux平台安装图像化桌面CentOS 7&lt;/h1&gt;

&lt;p&gt; 
###安装操作系统
本项目需要部署在Linux平台下。建议使用CentOS 7。
如果事前已经安装了操作系统，请跳过此章节。
本文假定读者具备Linux图形界面的使用能力。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;启动服务器，插入系统安装光盘或U盘，并在BIOS中设置以光盘或U盘启动（视具体场合下的安装介质而定）。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;启动后，进入如同下图的画面，利用键盘的方向键选择第一项“Install CentOS 7”，等待片刻后进入安装画面。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/1.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;进入CentOS7安装程序。第一个画面是选择要安装的系统的语言。接下来的截图选择的是简体中文（中国）。选择后，按【继续】进入下一步的安装概况画面。
&lt;img src=&quot;/images/centos图形化/2.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;点击【日期与时间】，进入系统时间设置。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/3.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;确认系统时区、日期与时间是否正确。完成确认或修改后，点击【完成】按钮返回安装概况。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/4.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;回到安装概况画面后，点击【安装位置】，选择安装目的地。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/5.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;设置硬盘分区。一般而言，选择第一个本地磁盘，然后分区选项选择【自动配置分区】即可。如果有需要，也可以自定义分区大小等数据。完成配置后点击“完成”按钮即可。
&lt;img src=&quot;/images/centos图形化/6.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;完成分区选择与配置后，回到安装概况画面，点击【软件选择】。
&lt;img src=&quot;/images/centos图形化/6.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;在软件选择画面中，从左边栏找到【带GUI的服务器】，然后在右边栏找到【KDE】、【MariaDB数据库服务器】、【开发工具】，勾选这三个工具，然后点击“完成”。
&lt;img src=&quot;/images/centos图形化/7.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;
&lt;img src=&quot;/images/centos图形化/8.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;
&lt;img src=&quot;/images/centos图形化/9.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;回到安装概况画面，点击右下角的【开始安装】按钮进入下一个环节。
&lt;img src=&quot;/images/centos图形化/13.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;安装程序正在把文件复制到磁盘上。此时，用户可以配置root账号密码，以及添加更多用户账号。先点击【ROOT 密码】设置root密码。
&lt;img src=&quot;/images/centos图形化/10.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;在ROOT密码画面中，设置root账户密码，然后点击“完成”。
&lt;img src=&quot;/images/centos图形化/11.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;为了确保安全，一般建议系统管理员再设置另一个管理专用的账号，而不是直接使用root账号进行操作。点击【创建用户】可创建新的账户。记得勾选【将此用户做为管理员】选项。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/12.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;当系统文件复制、解压完毕后，安装程序会自动重启电脑，进入命令行界面。此时系统已安装完毕。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;启动系统后进入登录界面，系统默认登录界面是新创建的管理员账户，输入密码登录。&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/14.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;如需用root账户登录，点击“未列出？”，输入root账户用户名、密码进行登录。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/centos图形化/15.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;登录后，系统界面。
&lt;img src=&quot;/images/centos图形化/16.png&quot; height=&quot;500&quot; width=&quot;600&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt; 
###配置软件环境
在配置网络环境之前，请先通过ping命令，确认当前服务器是否可以访问互联网。
ping www.baidu.com&lt;/p&gt;

&lt;p&gt;如果互联网已经接通，就可以执行下一步操作了。否则，请向网络管理相关人员寻求协助。&lt;/p&gt;

&lt;p&gt;2.1安装JDK
在终端下运行以下命令安装或升级JDK 1.7.0：
sudo yum install java-1.7.0-openjdk&lt;/p&gt;

&lt;p&gt;此时输入“y”，系统将自动完成安装。以下其他软件的安装方式也是类似，不再重复。&lt;/p&gt;

&lt;p&gt;2.2安装Tomcat
在终端下按顺序运行以下命令，安装或升级Tomcat
sudo yum install tomcat
sudo yum install tomcat-webapps tomcat-admin-webapps&lt;/p&gt;

&lt;p&gt;完成软件安装后，到以下路径，设置tomcat管理页面的账号密码：
/etc/tomcat/tomcat-users.xml&lt;/p&gt;

</description>
        <pubDate>Thu, 20 Apr 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/04/Linux%E5%B9%B3%E5%8F%B0%E5%AE%89%E8%A3%85%E5%9B%BE%E5%83%8F%E5%8C%96%E6%A1%8C%E9%9D%A2CentOS-7/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/04/Linux%E5%B9%B3%E5%8F%B0%E5%AE%89%E8%A3%85%E5%9B%BE%E5%83%8F%E5%8C%96%E6%A1%8C%E9%9D%A2CentOS-7/</guid>
        
        <category>博客</category>
        
        
      </item>
    
      <item>
        <title>jsonp跨域请求</title>
        <description>&lt;p&gt;跨域一词从字面意思看，就是跨域名嘛，但实际上跨域的范围绝对不止那么狭隘。具体概念如下：只要协议、域名、端口有任何一个不同，都被当作是不同的域。之所以会产生跨域这个问题呢，其实也很容易想明白，要是随便引用外部文件，不同标签下的页面引用类似的彼此的文件，浏览器很容易懵逼的，安全也得不到保障了就。什么事，都是安全第一嘛。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。所以我们要通过一些方法使本域的js能够操作其他域的页面对象或者使其他域的js能操作本域的页面对象（iframe之间）。下面是具体的跨域情况详解：&lt;/p&gt;

&lt;p&gt;URL                           说明                    是否允许通信&lt;/p&gt;

&lt;p&gt;http://www.a.com/a.js&lt;/p&gt;

&lt;p&gt;http://www.a.com/b.js         同一域名下               允许&lt;/p&gt;

&lt;p&gt;http://www.a.com/lab/a.js&lt;/p&gt;

&lt;p&gt;http://www.a.com/script/b.js  同一域名下不同文件夹      允许&lt;/p&gt;

&lt;p&gt;http://www.a.com:8000/a.js&lt;/p&gt;

&lt;p&gt;http://www.a.com/b.js         同一域名，不同端口        不允许&lt;/p&gt;

&lt;p&gt;http://www.a.com/a.js&lt;/p&gt;

&lt;p&gt;https://www.a.com/b.js        同一域名，不同协议        不允许&lt;/p&gt;

&lt;p&gt;http://www.a.com/a.js&lt;/p&gt;

&lt;p&gt;http://70.32.92.74/b.js       域名和域名对应ip         不允许&lt;/p&gt;

&lt;p&gt;http://www.a.com/a.js&lt;/p&gt;

&lt;p&gt;http://script.a.com/b.js      主域相同，子域不同        不允许（cookie这种情况下也不允许访问）&lt;/p&gt;

&lt;p&gt;http://www.a.com/a.js&lt;/p&gt;

&lt;p&gt;http://a.com/b.js             同一域名，不同二级域名（同上） 不允许（cookie这种情况下也不允许访问）&lt;/p&gt;

&lt;p&gt;http://www.cnblogs.com/a.js&lt;/p&gt;

&lt;p&gt;http://www.a.com/b.js         不同域名                  不允许&lt;/p&gt;

&lt;h3 id=&quot;跨域请求有6种&quot;&gt;跨域请求有6种&lt;/h3&gt;

&lt;p&gt;1.通过document.domain跨域&lt;/p&gt;

&lt;p&gt;2.通过location.hash跨域&lt;/p&gt;

&lt;p&gt;3.通过HTML5的postMessage方法跨域&lt;/p&gt;

&lt;p&gt;4.通过jsonp跨域&lt;/p&gt;

&lt;p&gt;5.通过CORS跨域&lt;/p&gt;

&lt;p&gt;6.通过window.name跨域&lt;/p&gt;

&lt;h4 id=&quot;我们详细说第45种jsonp跨域和cors跨域&quot;&gt;我们详细说第4，5种，jsonp跨域和CORS跨域。&lt;/h4&gt;

&lt;h3 id=&quot;通过jsonp跨域&quot;&gt;通过jsonp跨域&lt;/h3&gt;

&lt;p&gt;这几种都是双向通信的，即两个iframe，页面与iframe或是页面与页面之间的，下面说几种单项跨域的（一般用来获取数据），因为通过script标签引入的js是不受同源策略的限制的。所以我们可以通过script标签引入一个js或者是一个其他后缀形式（如php，jsp等）的文件，此文件返回一个js函数的调用。&lt;/p&gt;

&lt;p&gt;比如，有个a.html页面，它里面的代码需要利用ajax获取一个不同域上的json数据，假设这个json数据地址是http://damonare.cn/data.php,那么a.html中的代码就可以这样：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    function dosomething(jsondata){
        //处理获得的json数据
    }
&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;http://example.com/data.php?callback=dosomething&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们看到获取数据的地址后面还有一个callback参数，按惯例是用这个参数名，但是你用其他的也一样。当然如果获取数据的jsonp地址页面不是你自己能控制的，就得按照提供数据的那一方的规定格式来操作了。&lt;/p&gt;

&lt;p&gt;因为是当做一个js文件来引入的，所以http://damonare.cn/data.php返回的必须是一个能执行的js文件，所以这个页面的php代码可能是这样的(一定要和后端约定好哦):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;?php
$callback = $_GET[&apos;callback&apos;];//得到回调函数名
$data = array(&apos;a&apos;,&apos;b&apos;,&apos;c&apos;);//要返回的数据
echo $callback.&apos;(&apos;.json_encode($data).&apos;)&apos;;//输出
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;最终，输出结果为：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dosomething([‘a’,’b’,’c’]);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果你的页面使用jquery，那么通过它封装的方法就能很方便的来进行jsonp操作了。&lt;/p&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
       $.getJSON(&apos;http://example.com/data.php?callback=?,function(jsondata)&apos;){
           //处理获得的json数据
       });
   &lt;/script&gt;

&lt;p&gt;jquery会自动生成一个全局函数来替换callback=?中的问号，之后获取到数据后又会自动销毁，实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域，不跨域的话，就调用普通的ajax方法；跨域的话，则会以异步加载js文件的形式来调用jsonp的回调函数。&lt;/p&gt;

&lt;h3 id=&quot;jsonp的优缺点&quot;&gt;JSONP的优缺点&lt;/h3&gt;
&lt;p&gt;JSONP的优点是：它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制；它的兼容性更好，在更加古老的浏览器中都可以运行，不需要XMLHttpRequest或ActiveX的支持；并且在请求完毕后可以通过调用callback的方式回传结果。&lt;/p&gt;

&lt;p&gt;JSONP的缺点则是：它只支持GET请求而不支持POST等其它类型的HTTP请求；它只支持跨域HTTP请求这种情况，不能解决不同域的两个页面之间如何进行JavaScript调用的问题。&lt;/p&gt;

&lt;h3 id=&quot;cors跨域&quot;&gt;CORS跨域&lt;/h3&gt;

&lt;p&gt;CORS（Cross-Origin Resource Sharing）跨域资源共享，定义了必须在访问跨域资源时，浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通，从而决定请求或响应是应该成功还是失败。目前，所有浏览器都支持该功能，IE浏览器不能低于IE10。整个CORS通信过程，都是浏览器自动完成，不需要用户参与。对于开发者来说，CORS通信与同源的AJAX通信没有差别，代码完全一样。浏览器一旦发现AJAX请求跨源，就会自动添加一些附加的头信息，有时还会多出一次附加的请求，但用户不会有感觉。&lt;/p&gt;

&lt;p&gt;因此，实现CORS通信的关键是服务器。只要服务器实现了CORS接口，就可以跨源通信。&lt;/p&gt;

&lt;p&gt;平时的ajax请求可能是这样的:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    var xhr = new XMLHttpRequest();
    xhr.open(&quot;POST&quot;, &quot;/damonare&quot;,true);
    xhr.send();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以上damonare部分是相对路径，如果我们要使用CORS，相关Ajax代码可能如下所示：&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
    var xhr = new XMLHttpRequest();
    xhr.open(&quot;￼GET&quot;, &quot;http://segmentfault.com/u/trigkit4/&quot;,true);
    xhr.send();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;代码与之前的区别就在于相对路径换成了其他域的绝对路径，也就是你要跨域访问的接口地址。&lt;/p&gt;

&lt;p&gt;服务器端对于CORS的支持，主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置，就可以允许Ajax进行跨域的访问。关于CORS更多了解可以看下阮一峰老师的这一篇文章：&lt;a href=&quot;http://www.ruanyifeng.com/blog/2016/04/cors.html&quot;&gt;跨域资源共享 CORS 详解&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;cors和jsonp对比&quot;&gt;CORS和JSONP对比&lt;/h4&gt;

&lt;p&gt;JSONP只能实现GET请求，而CORS支持所有类型的HTTP请求。&lt;/p&gt;

&lt;p&gt;使用CORS，开发者可以使用普通的XMLHttpRequest发起请求和获得数据，比起JSONP有更好的错误处理。&lt;/p&gt;

&lt;p&gt;JSONP主要被老的浏览器支持，它们往往不支持CORS，而绝大多数现代浏览器都已经支持了CORS）。&lt;/p&gt;

&lt;p&gt;CORS与JSONP相比，无疑更为先进、方便和可靠。&lt;/p&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/03/jsonp%E8%B7%A8%E5%9F%9F/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/03/jsonp%E8%B7%A8%E5%9F%9F/</guid>
        
        <category>跨域请求</category>
        
        
      </item>
    
      <item>
        <title>Rem自适应js 优化flexible.js</title>
        <description>
&lt;p&gt;基于阿里的一个库：lib-flexible.js，里面有一些东西方法和自定义不需要用到的，所以做了一个精简版的，另外还修复了UC浏览器竖屏与横屏转换的BUG。&lt;/p&gt;

&lt;h3 id=&quot;js代码&quot;&gt;js代码&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;//designWidth:设计稿的实际宽度值，需要根据实际设置
//maxWidth:制作稿的最大宽度值，需要根据实际设置
//这段js的最后面有两个参数记得要设置，一个为设计稿实际宽度，一个为制作稿最大宽度，例如设计稿为750，最大宽度为750，则为(750,750)
;(function(designWidth, maxWidth) {
	var doc = document,
	win = window,
	docEl = doc.documentElement,
	remStyle = document.createElement(&quot;style&quot;),
	tid;

	function refreshRem() {
		var width = docEl.getBoundingClientRect().width;
		maxWidth = maxWidth || 540;
		width&amp;gt;maxWidth &amp;amp;&amp;amp; (width=maxWidth);
		var rem = width * 100 / designWidth;
		remStyle.innerHTML = &apos;html{font-size:&apos; + rem + &apos;px;}&apos;;
	}

	if (docEl.firstElementChild) {
		docEl.firstElementChild.appendChild(remStyle);
	} else {
		var wrap = doc.createElement(&quot;div&quot;);
		wrap.appendChild(remStyle);
		doc.write(wrap.innerHTML);
		wrap = null;
	}
	//要等 wiewport 设置好后才能执行 refreshRem，不然 refreshRem 会执行2次；
	refreshRem();

	win.addEventListener(&quot;resize&quot;, function() {
		clearTimeout(tid); //防止执行两次
		tid = setTimeout(refreshRem, 300);
	}, false);

	win.addEventListener(&quot;pageshow&quot;, function(e) {
		if (e.persisted) { // 浏览器后退的时候重新计算
			clearTimeout(tid);
			tid = setTimeout(refreshRem, 300);
		}
	}, false);

	if (doc.readyState === &quot;complete&quot;) {
		doc.body.style.fontSize = &quot;16px&quot;;
	} else {
		doc.addEventListener(&quot;DOMContentLoaded&quot;, function(e) {
			doc.body.style.fontSize = &quot;16px&quot;;
		}, false);
	}
})(750, 750);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;使用方法&quot;&gt;使用方法：&lt;/h3&gt;

&lt;h4 id=&quot;1复制上面这段代码到你的页面的头部的script标签的最前面&quot;&gt;1.复制上面这段代码到你的页面的头部的script标签的最前面。&lt;/h4&gt;

&lt;h4 id=&quot;2根据设计稿大小调整里面的最后两个参数值&quot;&gt;2.根据设计稿大小，调整里面的最后两个参数值。&lt;/h4&gt;

&lt;h4 id=&quot;3使用1rem100px转换你的设计稿的像素例如设计稿上某个块是100px300px换算成rem则为1rem3rem&quot;&gt;3.使用1rem=100px转换你的设计稿的像素，例如设计稿上某个块是100px&lt;em&gt;300px,换算成rem则为1rem&lt;/em&gt;3rem。&lt;/h4&gt;

&lt;p&gt;该代码版本区别于手淘的rem换算方法。使用的是1rem=100px的换算。&lt;/p&gt;

&lt;p&gt;假如你有一个块是.box{width:120px;height:80px;} 转为rem则为.box{width:1.2rem; height:.8rem;}&lt;/p&gt;

&lt;h3 id=&quot;基本的html模板&quot;&gt;基本的HTML模板&lt;/h3&gt;

&lt;p&gt;你也可以直接复制下面这个基础的HTML模板。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
&amp;lt;meta content=&quot;width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no&quot; name=&quot;viewport&quot;&amp;gt;
&amp;lt;meta content=&quot;yes&quot; name=&quot;apple-mobile-web-app-capable&quot;&amp;gt;
&amp;lt;meta content=&quot;black&quot; name=&quot;apple-mobile-web-app-status-bar-style&quot;&amp;gt;
&amp;lt;meta content=&quot;telephone=no&quot; name=&quot;format-detection&quot;&amp;gt;
&amp;lt;meta content=&quot;email=no&quot; name=&quot;format-detection&quot;&amp;gt;
&amp;lt;meta name=&quot;description&quot; content=&quot;不超过150个字符&quot;/&amp;gt;
&amp;lt;meta name=&quot;keywords&quot; content=&quot;&quot;/&amp;gt;
&amp;lt;meta content=&quot;caibaojian&quot; name=&quot;author&quot;/&amp;gt;
&amp;lt;title&amp;gt;前端开发博客&amp;lt;/title&amp;gt;
&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;base.css&quot;&amp;gt;
&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
//引入该flexible.min.js
!function(e,t){function n(){var n=l.getBoundingClientRect().width;t=t||540,n&amp;gt;t&amp;amp;&amp;amp;(n=t);var i=100*n/e;r.innerHTML=&quot;html{font-size:&quot;+i+&quot;px;}&quot;}var i,d=document,o=window,l=d.documentElement,r=document.createElement(&quot;style&quot;);if(l.firstElementChild)l.firstElementChild.appendChild(r);else{var a=d.createElement(&quot;div&quot;);a.appendChild(r),d.write(a.innerHTML),a=null}n(),o.addEventListener(&quot;resize&quot;,function(){clearTimeout(i),i=setTimeout(n,300)},!1),o.addEventListener(&quot;pageshow&quot;,function(e){e.persisted&amp;amp;&amp;amp;(clearTimeout(i),i=setTimeout(n,300))},!1),&quot;complete&quot;===d.readyState?d.body.style.fontSize=&quot;16px&quot;:d.addEventListener(&quot;DOMContentLoaded&quot;,function(e){d.body.style.fontSize=&quot;16px&quot;},!1)}(750,750);
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
	&amp;lt;!-- 正文 --&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;basecss&quot;&gt;base.css&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;body,dl,dd,ul,ol,h1,h2,h3,h4,h5,h6,pre,form,input,textarea,p,hr,thead,tbody,tfoot,th,td{margin:0;padding:0;}
ul,ol{list-style:none;}
a{text-decoration:none;}
html{-ms-text-size-adjust:none;-webkit-text-size-adjust:none;text-size-adjust:none;}
body{line-height:1.5; font-size:14px;}
body,button,input,select,textarea{font-family:&apos;helvetica neue&apos;,tahoma,&apos;hiragino sans gb&apos;,stheiti,&apos;wenquanyi micro hei&apos;,\5FAE\8F6F\96C5\9ED1,\5B8B\4F53,sans-serif;}
b,strong{font-weight:bold;}
i,em{font-style:normal;}
table{border-collapse:collapse;border-spacing:0;}
table th,table td{border:1px solid #ddd;padding:5px;}
table th{font-weight:inherit;border-bottom-width:2px;border-bottom-color:#ccc;}
img{border:0 none;width:auto\9;max-width:100%;vertical-align:top; height:auto;}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;vertical-align:baseline;}
button,html input[type=&quot;button&quot;],input[type=&quot;reset&quot;],input[type=&quot;submit&quot;]{-webkit-appearance:button;cursor:pointer;}
button[disabled],input[disabled]{cursor:default;}
input[type=&quot;checkbox&quot;],input[type=&quot;radio&quot;]{box-sizing:border-box;padding:0;}
input[type=&quot;search&quot;]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}
input[type=&quot;search&quot;]::-webkit-search-decoration{-webkit-appearance:none;}
input:focus{outline:none;}
select[size],select[multiple],select[size][multiple]{border:1px solid #AAA;padding:0;}
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}
audio,canvas,video,progress{display:inline-block;}
body{background:#fff;}
input::-webkit-input-speech-button {display: none}
button,input,textarea{
-webkit-tap-highlight-color: rgba(0,0,0,0);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;再次强调一下&quot;&gt;再次强调一下：&lt;/h3&gt;

&lt;p&gt;需要根据你的设计稿的大小来调整脚本最后的两个参数。&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;})(750, 750);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;第一个参数是设计稿的宽度，一般设计稿有640，或者是750，你可以根据实际调整&lt;/p&gt;

&lt;p&gt;第二个参数则是设置制作稿的最大宽度，超过750，则以750为最大限制。&lt;/p&gt;

&lt;p&gt;文章转自-链接:http://caibaojian.com/simple-flexible.html&lt;/p&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/03/Rem%E8%87%AA%E9%80%82%E5%BA%94js-%E4%BC%98%E5%8C%96flexible.js/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/03/Rem%E8%87%AA%E9%80%82%E5%BA%94js-%E4%BC%98%E5%8C%96flexible.js/</guid>
        
        
      </item>
    
      <item>
        <title>网站上实现qq聊天，网站绑定微信登录</title>
        <description>&lt;h3 id=&quot;qq在线聊天的功能是怎么实现的&quot;&gt;QQ在线聊天的功能是怎么实现的？&lt;/h3&gt;

&lt;p&gt;网站的微信扫码登录和qq在线聊天是需要我们这边去申请和认证的，初来乍到经理就让我弄这些着实吓着我了，宝宝啥都不知道啊。但是要强的宝宝没有告诉经理我不会，只有硬着头皮去求度娘（度娘有时候也会任性一下让你找好久才能找到你想要的–其实是我太笨）&lt;/p&gt;

&lt;p&gt;其实很简单,打开下面这个链接，登录公司的QQ号，点击“推广工具”，把里面的代码复制给程序员，加到网站上就好了。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://shang.qq.com/v3/widget.html&quot;&gt;http://shang.qq.com/v3/widget.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;是不是很简单，是也不要笑话我，毕竟我当时完全不知道这是什么情况，一直纠结“为什么QQ在线聊天和QQ推广有关系，嗯纠结太久，后来发现就是这个”&lt;/p&gt;

&lt;h3 id=&quot;网站绑定微信登录是怎么实现的&quot;&gt;网站绑定微信登录是怎么实现的&lt;/h3&gt;

&lt;p&gt;这个功能其实也很简单，关键也是当时完全不知道入口是哪里，其实就是以公司名义注册一个“微信开放平台”，我是用公司QQ登录的，在“管理中心”把“AppID和&lt;/p&gt;

&lt;p&gt;AppSecret”给开发者就好，当然技术上的就没办法给大家分享了，我也不会啊emoticon（装逼失败）&lt;/p&gt;

&lt;p&gt;https://open.weixin.qq.com/cgi-bin/index?t=home/index&amp;amp;lang=zh_CN&amp;amp;token=55068190a341700ecf6725cdef50786b4b7b9737&amp;amp;appid=wxb3f9e53518e3011e&lt;/p&gt;

&lt;p&gt;这些工作在去年11月份做的，网站上线后我做的更多的工作是APP功能规划，和寻找更好的外包方合作（可以想到坏人都让我给做了，后面公司选择哪个剩下的我都觉得好抱歉，沟通那么久，哎……）其实工作中我学会更多是沟通技巧，和工作方式，以及工作总结，以前和外包方对接工作时，这边在大声的骂娘，那边还要好声好气的和她们沟通，我的暴脾气……后来休假时出去走走，想想这么做也不是个办法，自己生气问题还很难解决，所以回去后彻底改变态度，真的是心平气和的和他们对接工作，也发现自己后时候的表达方式有问题，别人可能不理解我的意思，果然现在的工作对接的都很顺畅。不过我的各种修改需求也让他们很崩溃吧，虽然能理解，但是我更多的还是要为公司利益着想，不能太个人感情化。&lt;/p&gt;

&lt;p&gt;tillbest.com这是我们公司的官网，不是很好看（我们选图有点问题可能），但是比刚刚上线那会要在功能上要好很多，大家有意愿的可以去看看。&lt;/p&gt;

&lt;p&gt;嗯还是很怀念以前前端网陪我学习的日子，小伙伴们加油。&lt;/p&gt;

&lt;p&gt;转载请注明原地址，冼国基的博客：https://xianguoji.github.io 谢谢！&lt;/p&gt;
</description>
        <pubDate>Thu, 23 Feb 2017 00:00:00 +0000</pubDate>
        <link>https://xianguoji.github.io//2017/02/%E7%BD%91%E7%AB%99%E4%B8%8A%E5%AE%9E%E7%8E%B0qq%E8%81%8A%E5%A4%A9-%E7%BD%91%E7%AB%99%E7%BB%91%E5%AE%9A%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95/</link>
        <guid isPermaLink="true">https://xianguoji.github.io//2017/02/%E7%BD%91%E7%AB%99%E4%B8%8A%E5%AE%9E%E7%8E%B0qq%E8%81%8A%E5%A4%A9-%E7%BD%91%E7%AB%99%E7%BB%91%E5%AE%9A%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95/</guid>
        
        <category>其他</category>
        
        
      </item>
    
  </channel>
</rss>
