1)数据体积方面JSON
相对于XML
来说,数据的体积小,传递的速度更快些
2)数据描述方面JSON
和JavaScript
交互更加方便,更容易解析处理,更容易交互
3)数据描述方面JSON
对数据的描述性比XML
差
4)传输速度方面JSON
的速度要远远快于XML
javascript
合理的title
、description
、keywords
:搜索对着三项的权重逐个减小,title
值强调重点便可,重要关键词不要超过两次,并且要靠前,不一样页面的title
要有所不一样;description
把页面的内容高度归纳,长度合适,不可过度分堆砌关键词,不一样页面的description
有所不一样;keywords
列举重要关键词便可;前端
// title标题 <title>标题</title> // keywords 关键词 <meta name="description" content="关键词1,关键词2,关键词3"> // description 内容摘要 <meta name="description" content="网页的简述">
语义化的HTML
代码,符合W3C
规范:语义化代码让搜索引擎容易理解网页;
重要内容的HTML
代码放在最前:搜索引擎抓取HTML
顺序是从上到下,有的搜索引擎对抓取长度有限制,因此要保证重要内容必定会被抓取;
重要内容不要用JS
输出:爬虫不会执行JS
获取内容;
少用iframe
:搜索引擎不会抓取iframe
中的内容;
非装饰性图片必须加alt
;
提升网站速度:网站速度是搜素引擎排序的一个重要指标;java
1)GET
方法
发送一个请求来取得服务器上的某一资源
2)POST
方法
向URL
指定的资源提交数据或附加新的数据
3)PUT
方法
跟POST
方法很像,也是想服务器提交数据。可是,它们之间有不一样。PUT
指定了资源在服务器上的位置,而POST
没有
4)HEAD
方法
只请求页面的首部
5)DELETE
方法
删除服务器上的某资源
6)OPTIONS
方法
它用于获取当前URL
所支持的方法。若是请求成功,会有一个Allow
的头包含相似“GET,POST”
这样的信息
7)TRACE
方法TRACE
方法被用于激发一个远程的,应用层的请求消息回路
8)CONNECT
方法
把请求链接转换到透明的TCP/IP
通道数组
1)content
方面
减小HTTP
请求:合并文件、CSS精灵图
减小DNS
查询:DNS缓存、将资源分布到恰当数量的主机名
减小DOM
元素数量
2)Server
方面
使用CDN
配置ETag
对组件使用Gzip
压缩
3)Cookie
方面
减小cookie
大小
4)CSS
方面
将样式表放到页面顶部
不使用CSS
表达式
使用<link>
不使用@import
5)JavaScript
方面
将脚本放到页面底部
将JavaScript
和CSS
从外部引入
压缩JavaScript
和CSS
删除不须要的脚本
减小DOM
访问
6)图片方面
优化CSS
精灵
不要再HTML
中拉伸图片浏览器
HTML
语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;
在没有CSS
样式状况下也以一种文档格式显示,而且是容易阅读的;
搜索引擎的爬虫依赖于标记来肯定上下文的各个关键字的权重,利于SEO
;
使阅读源代码的人更容易将网站分块,便于阅读维护理解;缓存
标签闭合、标签小写、不乱嵌套、使用外链CSS
和JS
、结构行为表现的分离性能优化
做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到window
对象即被终止,做用域链向下访问变量是不被容许的;
即做用域就是变量与函数的可访问范围,即做用域控制这变量与函数的可见性和生命周期;服务器
1)瀑布流布局的要求要进行布置的元素等宽;
而后计算元素的宽度,
与浏览器宽度之比,获得须要布置的列数;
2)建立一个数组,长度为列数,
里面的值为以已布置元素的总高度(最开始为0
);
3)而后将未布置的元素的依次布置到高度最小的那一列,
就获得了瀑布流布局;
4)滚动加载,scroll
事件获得scrollTop
,
与最后盒子的offsetTop
对比,
符合条件就不断滚动加载。
瀑布流布局核心代码:cookie
/** * 实现瀑布流的布局 * @param {string}parentBox * @param {string}childBox */ function waterFull(parentBox, childBox) { // 1. 求出父盒子的宽度 // 1.1 获取全部的子盒子 var allBox = $(parentBox). getElementsByClassName(childBox); // console.log(allBox); // 1.2 求出子盒子的宽度 var boxWidth = allBox[0].offsetWidth; // console.log(boxWidth); // 1.3 获取窗口的宽度 var clientW = document. documentElement.clientWidth; // console.log(clientW); // 1.4 求出总列数 var cols = Math.floor(clientW / boxWidth); // console.log(cols); // 1.5 父盒子居中 $(parentBox).style.width = cols * boxWidth + 'px'; $(parentBox).style.margin = '0 auto'; // 2. 子盒子定位 // 2.1 定义变量 var heightArr = [], boxHeight = 0, minBoxHeight = 0, minBoxIndex = 0; // 2.2 遍历全部的子盒子 for (var i = 0; i < allBox.length; i++) { // 2.2.1 求出每个子盒子的高度 boxHeight = allBox[i].offsetHeight; // console.log(boxHeight); // 2.2.2 取出第一行盒子的高度放入高度数组中 if (i < cols) { // 第一行 heightArr.push(boxHeight); } else { // 剩余行的盒子 // 2.2.3 取出数组中最矮的高度 minBoxHeight = _.min(heightArr); // 2.2.4 求出最矮高度对应的索引 minBoxIndex = getMinBoxIndex(heightArr, minBoxHeight); // 2.2.5 盒子定位 allBox[i].style.position = 'absolute'; allBox[i].style.left = minBoxIndex * boxWidth + 'px'; allBox[i].style.top = minBoxHeight + 'px'; // 2.2.6 更新最矮的高度 heightArr[minBoxIndex] += boxHeight; } } } /** * 根据内容取出在数组中对应的索引 * @param {object}arr * @param {number}val * @returns {boolean} */ function getMinBoxIndex(arr, val) { for (var i = 0; i < arr.length; i++) { if (arr[i] === val) return i; } } /** * 判断是否具有加载子盒子的条件 * @returns {boolean} */ function checkWillLoadImage() { // 1. 获取最后一个盒子 var allBox = $('main').getElementsByClassName('box'); var lastBox = allBox[allBox.length - 1]; // 2. 求出高度 var lastBoxDis = lastBox.offsetHeight * 0.5 + lastBox.offsetTop; // 3. 求出窗口的高度 var clientH = document.documentElement.clientHeight; // 4. 求出页面滚动产生的高度 var scrollTopH = scroll().top; // 5. 对比 return lastBoxDis <= clientH + scrollTopH; }
1)经过url
地址栏传递参数;
例如:点击列表中的每一条数据,跳转到一个详情页面,在URL
中传递不一样的参数区分不一样的页面;
2)经过本地存储cookie
、localStorage
、sessionStorage
;
例如京东的登录,把登录后得到的页面信息存储到本地,其余页面须要用户信息的话就从本地的存储数据中获取;
3)使用iframe
例如在A
页面中嵌入B
页面,在A
中能够经过一些属性和实现方法和B
页面的通讯;
4)利用postMessage
实现页面间的通讯
例如父窗口往子窗口传递信息,子窗口往父窗口传递信息session