js 2017

JS面向对象

<script>
function num(val) {
return val * 8
}
function Index(name, age) {
this.name = name;
this.age = age;
}
Index.prototype = {
constructor: Index
}
Index.prototype.test = function () {
console.log(num(this.age));
}
Index.prototype.testB = function () {
console.log(num(this.name));
} var a = new Index('kang', 22)
a.test()
a.testB()
</script>

js面向对象推荐写法

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
var Index = function (name, age) {
this.name = name;
this.age = age;
}
Index.prototype = {
constructor: Index,
num: function (val) {
return val + 28
},
testA: function () {
console.log(this.num(this.age));
},
testB: function () {
console.log(this.num(this.name));
},
testC: (function () {
console.log(111);
})()
}
var a = new Index('kang', 252)
a.testA()
a.testB()
</script>
</body>
</html>

自调用函数

<script>
!function (a, b) {
console.log(a + b)
}(1, 2); (function (c, d) {
console.log(c + d)
})(3, 4)
// 你甚至可以在function前面加一元操作符号
!function () { /* code */ } ();
~function () { /* code */ } ();
-function () { /* code */ } ();
+function () { /* code */ } ();
</script>

jq $.get('a.json') 读取json  $.grep()过滤json

<script>
$.get('xx.json', function (res) {
// 过滤数据
var res = $.grep(res, function (n) {
return n.value.length == 2 // 过滤条件
})
}, 'json')
</script>

模板引擎 arttemplate

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
https://github.com/aui/art-template/blob/master/lib/template-web.js
<script id="test" type="text/html">
<h1>{{title}}</h1>
<ul>
{{each list as value i}}
<li>索 {{i + 1}} :{{value}}</li>
{{/each}}
</ul>
</script>
<div id="content"></div>
<script src="template-web.js"></script>
<script>
var data = {
title: '标签123',
list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
};
var html = template('test', data);
document.getElementById('content').innerHTML = html;
</script>
</body>
</html>

sha1

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
加密前的明文为:000714804762308511eb58071dde449179a3a2745fc9f1e77
加密后的结果为:
fae96b30c78e386f32df9d286905bf87b92e1a3d
-->
<script src="https://cdn.bootcss.com/crypto-js/3.1.9/crypto-js.min.js"></script>
<script>
var val = '000714804762308511eb58071dde449179a3a2745fc9f1e77'
var res = CryptoJS.SHA1(val)
alert(res) // 正确
console.log(res); // 控制台输入出错
document.write(res); // 正确
</script>
</body>
</html>

jq表单提交,reset不刷新数据

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
表单重置阻止刷新页面
<form id="form1">
<select name="" id="">
<option value="">---请选择---</option>
<option value="">s</option>
<option value="">s333</option>
</select>
<button>btn</button>
<input type="text" placeholder="abc">
</form>
<script src="jquery.min.js"></script>
<script>
$("button").click(function () {
return test() // 返回函数
})
function test() {
$("form")[0].reset();
return false // 返回 false
}
</script>
</body>
</html>

js变量作用域    在test()函数内先声明变量b,再执行 输出,为 undefined,再为b赋值3

 var b = 10;
function test() {
console.log(b); // undefined
var b = 3;
}
test()

事件委托,减少事件

<body>
页面的事件处理程序(点击事件等)太多会影响页面性能,每个函数是对象,占内存,性能差,必须事先指定所有事件处理程序而导致DOM访问次数,
延迟整个页面的交互就绪时间。
使用事件委托,
<div class="a">
<div class="b">bbb</div>
<div class="c">bbb</div>
<div class="d">bbb</div>
</div>
<script>
// 事件委托,减少事件
document.getElementsByClassName('a')[0].addEventListener('click', function (e) {
var name = e.target.className;
switch (name) {
case 'b':
console.log('bbb');
break;
case 'c':
console.log('ccc');
break;
case 'd':
console.log('ddd');
break;
default:
console.log('eee');
}
})
</script>

表单elements属性     chrome safari支持的H5表单属性 autocomplete autofocus multiple  表单过滤  剪贴板事件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form id="form1">
<input type="text" name="username">
<select id="" multiple name="num">多选效果
<option value="111">中国</option>
<option value="2">2</option>
</select>
</form>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script>
// 表单有 elements属性,包含表单所有字段,如 Input textarea等
var form = document.getElementById('form1'); // document.forms[0] 表单获取方式二
// form.elements[0]; // 取得表单第一个字段
//form.elements['username']; // 通过name属性来取得input字段
// form.elements.length; // 所有字段的长度
// 避免表单多次提交
// 通过submit事件来禁用提交按钮
form.addEventListener('submit', function () {
btn.disabled = true;
})
// option 值
console.log(form.elements["num"].options[0].text) // 中国
console.log(form.elements["num"].options[0].value) // 111
</script>
<input type="text" autofocus > // 手机端chrome safari 支持的有 autocomplete autofocus multiple placeholder 少用吧
14.2.2 过滤输入
input屏蔽字符编码 P443
操作剪贴板 P444 opera 不支持前贴板事件
14.2.3自动切换焦点
</body>
</html>

原生拖放dragstart、历史状态管理 history.pushState()  函数错误处理

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
【1】原生拖放事件 ie4就支持了 H5把拖放事件规范化
dragstart drag dragend
当元素被手动到一个有效的放置目标上时,下列事件会依次发生:
dragenter dragover dragleave或drop
【2】历史状态管理 不刷新页面跳转
history.pushState() replaceState()
// ie11才支持 pushState()创造的每一个假的 url,在web服务器上必须有一个真的url存在,否则一刷新,会报错
<a href="1.html">1111111</a>
// history.pushState()
【3】错误处理
关注函数和引发函数执行失败的因素,抛出自定义的错误方便查看 // 感觉没人使用
<script>
function test(arr){
if(!(arr instanceof Array)){ // 判断参数是数组
throw new Error('val must be an arr');
}
// ...
}
function concat(str1,str2,str3) {
var res = str1 + str2;
if (typeof str3 == 'string') { // if(str3) 判断不严谨 str3要是string类型才处理
res += str3;
}
return res;
}
function getQueryString(url) {
if(typeof url == 'string'){ // 判断参数是 string
// ...
}
}
function addQueryStringArg(url, name, val) {
if(url.indexOf("?") == -1){
url+='?';
}else {
url+="&"
}
url+= encodeURIComponent(name)+'='+encodeURIComponent(val)
}
var url = 'http://www.baidu.com';
var newUrl = addQueryStringArg(url,'redir','http://www.xxx.com')
// http://www.baidu.com?redir=http%3A%2F%2Fwww.xxx.com </script>
【4】把错误记录到服务器 17.2.7 不需要吧?
</body>
</html>

百度地图2.0 自定义图标、调整位置

http://lbsyun.baidu.com/jsdemo.htm?a#c1_16

var myIcon = new BMap.Icon(iconUrl, new BMap.Size(20, 23),{   // 图标宽高
anchor:new BMap.Size(10,23) // 自定义图标调整位置 第一个值为图标宽度的一半
})
var marker = new BMap.Marker(new BMap.Point(Longitude, Latitude), {icon: myIcon}); // 创建标注
jq判断元素是否含有某样式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
li {
list-style: none;
}
ul {
height: 30px;
}
ul li {
line-height: 30px;
height: 30px;
display: none;
}
ul.on {
height: auto;
}
ul.on li {
display: block;
}
ul.on .btn {
transform: rotate(180deg);
-ms-transform: rotate(180deg); /* IE 9 */
-moz-transform: rotate(180deg); /* Firefox */
-webkit-transform: rotate(180deg); /* Safari 和 Chrome */
-o-transform: rotate(180deg); /* Opera */
}
.btn:hover {
cursor: pointer;
}
</style>
</head>
<body>
jq判断元素是否含有某样式 $("#xx").attr('class').indexOf('newClass')>0 ? 'yes': 'no'
<ul id="ulList" class="aaa"> // 必须有一个样式,才能判断是否有其他样式
<li>12341</li>
<li>12342</li>
<li>12343</li>
<li>12344</li>
<li>12345</li>
<li>12346</li>
<img src="arrow.png" alt="" class="btn">
</ul>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script>
$("ul li").eq(0).show();
$(".btn").click(function () {
$("#ulList").toggleClass('on')
if ($("ul").attr('class').indexOf('on') > 0) { // 如果ul没有aaa 等任何一个样式,则该判断无效
console.log(11);
} else {
console.log(22);
}
})
</script>
</body>
</html>

图片、背景图放大缩小

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
.box{
width:300px;height:300px;
/*url图片途径*/
background:url(swipe_error.jpg) no-repeat center; border:5px solid #0099CC;
-webkit-transition:0.5s;
background-size:500px 500px;
}
.box:hover{
background-size:600px 600px;
}
</style>
</head>
<body>
<!-- css 动画 -->
<div class="box"></div>
<script>
$(document).on('mouseover mouseout', '.xxx', function (e) {
if (e.type == 'mouseover') {
$(this).stop().animate({
backgroundSize: '130%' // 背景图片放大缩小
/* // 图片放大缩小
* width:'130%',
* height:'130%',
* marginLeft:'-15%',
* marginTop:'-15%'
* */
})
} else if (e.type == 'mouseout') {
$(this).stop().animate({
backgroundSize: '100%'
})
}
})
</script>
</body>
</html>

懒加载 jquery.lazyload.min.js

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.my-lazy{
/* 默认的占位图 */
background:url('swipe_error.jpg') no-repeat center;
}
</style>
</head>
<body>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script src="jquery.lazyload.min.js"></script>
<div style="height:1000px;width:1000px;border: 1px solid green;"></div>
<div class="lazy my-lazy" data-original="swipe_error.jpg" style="width:1920px;height:390px;"></div>
<script>
$("div.lazy").lazyload() // 背景图懒加载, 先加载占位图,当滚动到该页面时加载对应背景图
</script>
https://www.w3cways.com/1765.html 插件下载,教程
http://blog.csdn.net/love_gaohz/article/details/46463623 图片懒加载、背景图懒加载
</body>
</html>

上下移动表格行

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.danger{
color: red;
}
</style>
</head>
<body>
<table class="table" id="test_table">
<thead>
<tr>
<th>时间</th>
<th>详情</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr cid="7.0.0-2014-04-29_11-02-24_123" class="list_line">
<td>
2014-04-29 11:02:24
</td>
<td>
详情
</td>
<td>
<span class="move_btn glyphicon glyphicon-arrow-up" move_act="up">1</span>
<span class="move_btn glyphicon glyphicon-arrow-down" move_act="down">2</span>
</td>
</tr>
<tr cid="7.0.0-2014-04-29_11-02-24_915" class="list_line">
<td>
2014-04-28 10:00:00
</td>
<td>
详情
</td>
<td>
<span class="move_btn glyphicon glyphicon-arrow-up" move_act="up">1</span>
<span class="move_btn glyphicon glyphicon-arrow-down" move_act="down">2</span>
</td>
</tr>
</tbody>
</table>
</body>
</html>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('.move_btn').click(function(){
var move_act = $(this).attr('move_act');
$('#test_table tbody tr').removeClass('danger'); if(move_act == 'up'){
$(this).parent().parent('tr').addClass('danger')
.prev().before($(this).parent().parent('tr'));
}
else if(move_act == 'down'){
$(this).parent().parent('tr').addClass('danger')
.next().after($(this).parent().parent('tr'));
}
setTimeout("$('#test_table tbody tr').removeClass('danger');", 2000);
});
});
</script>

请求头option

假如我在http://localhost:8081/访问使用json-server在http://localhost:3000/模拟的API,这应该算是跨域吧,使用POST是时,在控制台就会出现“2次”请求,第一次为OPTIONS请求,第二次才是POST请求。我查了下这叫做Preflighted Requests(预检请求),当发生跨域请求时,fetch会先发送一个OPTIONS请求,来确认服务器是否允许接受请求。服务器同意后,才会发送真正的请求。
只要是带自定义header的跨域请求,在发送真实请求前都会先发送OPTIONS请求,浏览器根据OPTIONS请求返回的结果来决定是否继续发送真实的请求进行跨域资源访问。

手机自适应方案

!function (doc, win) {  // 自调用函数并传参
var docEl = doc.documentElement, // 得到当前页面所有的 html代码
resizeEvt = "orientationchange" in window ? "orientationchange" : "resize", // pc端结果永远为 resize?可能要在手机上才能看到效果 手机横竖屏事件 orientation方向
// 微信内置浏览器,手机横竖屏无效果, UC浏览器有横竖屏效果, 微信结果为 resize
recalc = function (num) {
document.write(num);
var width = docEl.clientWidth; // 得到客户区宽度,即内容+padding ,即手机/pc屏幕的宽度 375等
width = width > 750 ? 750 : width;
console.log(width);
width && (docEl.style.fontSize = 100 * (width / 375) + "px") // 设置 html的字体大小 如果width为假,则后面不会执行
};
if (doc.addEventListener) { // 怎么验证这些事件什么时候触发呢? PC/手机都会执行3个事件
document.write(resizeEvt);
win.addEventListener(resizeEvt, recalc(1), !1); // 监听手机横竖屏事件
doc.addEventListener("DOMContentLoaded", recalc(2), !1); // 在形成完整的DOM树之后就会触发,不理会图像、JS文件、css文件是否已经下载完毕,用户可以早点与页面进行交互 ie9+支持,window.load()则是全部加载完毕触发
recalc(3) // 进入页面调用一次
}
}(document, window);
var a = '';
a && document.write('abc') // 等同于 if(a){...}
if(a){
document.write('abc')
}

js滚动监听

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<style>
.a {
width: 200px;
height: 300px;
border: 1px solid green;
} .active {
background: red;
}
</style>
<nav>
<ul style="position: fixed;top:10px;left:20px;">
<li><a href="#About">About</a></li>
<li><a href="#Skill">Skill</a></li>
<li><a href="#Experience">Experience</a></li>
<li><a href="#More">More</a></li>
<li><a href="#Contact">Contact</a></li>
</ul>
</nav>
<div style="height:100px;"></div>
<div class="a" id="About" style="height: 200px;">
about
</div>
<div class="a" id="Skill" style="height: 300px;">
skill
</div>
<div class="a" id="Experience" style="height: 400px;">
expre
</div>
<div class="a" id="More" style="height:500px;">
more
</div>
<div class="a" id="Contact" style="height:600px;">
concact
</div>
<div style="height:1000px;">00</div>
<script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script>
var a = $('a[href]', 'nav');
a.click(function () { var href = $(this).attr('href');
var o = $(href).offset();
$(window).scrollTop(o.top, 1000); //增加个动画效果
});
var b = $(".a")
$(window).on('scroll', function () {
b.removeClass('active');
for (var i = 0; i < b.length; i++) {
var $b = b.eq(i), st = $(window).scrollTop();
var top = $b.offset().top;
if (st >= top && st <= $b.height() + top) // top >= st >= top + height
{
console.log(i);
$b.addClass('active'); //此处已经获得了哪个a
break;
}
} });
</script>
</body>
</html>
上一篇:python性能检测工具整理


下一篇:Nginx--Windows环境下Nginx+tomcat配置(包括动静分离)