第一章:入门

选择元素:

$()

css()

$("li").css():可以省略原生的循环操作

$ == jQuery

jQuery方法函数化:

click()

html()

JS与jQ关系:

可以共存,不能混写

函数中this是原生的,$(this)转换为jQ对象

点击变色例子:

<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
div{
width: 100px;
height: 100px;
float: left;
border: 1px solid #333;
}
</style>
</head>
<body>
<span>red</span>
<span>blue</span>
<span>green</span>
<span>yellow</span>
<br>
<div></div>
<div></div>
<div></div>
<div></div>
<script src="jquery-1.11.1.js"></script>
<script>
var color = '';
$('span').click(function(){
color = $(this).html();
});
$('div').click(function(){
$(this).css('backgroundColor',color);
});
</script>
</body>
</html>

取值与赋值:

取值或赋值通过参数个数来决定,html(),attr(),val()

多元素取值,取到的是选中元素的第一个

$("input[value^=123]").css():value值以123为起始的元素

强大的$():

加载--

$(function(){ ... });

属性选择--

[=]

[^=]开始

[$=]结束

[*=]包含

引号的问题:

[class = box1]

[class = "box1 box2"]

jQ的链式操作:

$().css().html().click()...

链式操作是针对设置的时候,获取操作的时候是不行的

jQ实战小技巧:

命名的规范--

$span/$div

容错处理--

$()找不到的元素不报错

集合的长度:

$('div').size()

$('div').length

$()获取到的都是一个集合,例如$('#div1').length的长度为1

jQ实战小技巧:

利用length判断元素是否存在,length == 0 则不存在

去掉指定颜色的方块颜色:属性选择器练习

<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
div{
width: 100px;
height: 100px;
float: left;
border: 1px solid #333;
}
</style>
</head>
<body>
<span>red</span>
<span>blue</span>
<span>green</span>
<span>yellow</span>
<br>
<input type="button" value="clear red">
<br>
<div></div>
<div></div>
<div></div>
<div></div>
<script src="jquery-1.11.1.js"></script>
<script>
var color = '';
$('span').click(function(){
color = $(this).html();
});
$('div').click(function(){
$(this).css('backgroundColor',color);
});
$('input').click(function(){
$('div[style *= red]').css('backgroundColor','');
});
</script>
</body>
</html>

class的操作:

addClass()

removeClass()

toggleClass()自动判断该add还是remove

以上也和运用attr实现

显示与隐藏:

show()/hide()

与css()显示隐藏的区别:显示行内元素后可能变成block或inline-block,改变原来的默认值

节点的选择:

prev()/next()

prevAll()/nextAll()

siblings() 参数的筛选功能

jQ实战小技巧:

nextAll('.box')//利用参数修复查找结点问题

下标:

eq()

抽奖效果:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
*{
margin: 0;
padding: 0;
}
ul{
width: 366px;
overflow: hidden;
}
li{
float: left;
width: 100px;
height: 100px;
margin: 10px;
border: 1px solid #333;
list-style-type: none;
}
.on{
background-color: red;
}
</style>
</head>
<body>
<input type="button" value="start">
<ul>
<li>一等奖</li>
<li>二等奖</li>
<li>三等奖</li>
<li>四等奖</li>
<li>五等奖</li>
<li>六等奖</li>
<li>七等奖</li>
<li>八等奖</li>
<li>九等奖</li>
</ul>
<script src="jquery-1.11.1.js"></script>
<script>
var iNow = 0;
var timer = null;
var $li = $('li').length;
$('input').click(function(){
var step = parseInt(Math.random() * 20 + 5);//5-24
timer = setInterval(function(){
$('li').eq(iNow).attr('class','on').siblings().attr('class','');
iNow ++;
//通过判断一个随机数为0时停止定时器
step --;
if(step == 0){
clearInterval(timer);
alert('恭喜你抽中了'+$('li[class = on]').html());
}
if(iNow == $li){
iNow = 0;
}
},200);
});
</script>
</body>
</html>

第二章:上手

节点的选择:

first()

last()

slice(start,end)截取选中集合对象的一部分,包括起始位置不包括结束位置,不写end默认到最后

children()一级子节点

$('div').find('a')找div中为a的后代节点

parent()父节点

parents('body')祖先节点

closest()重要!必须要接受一个参数,找离当前节点最近的唯一一个祖先元素也包括自身

实战小技巧:

$('ul').find('p')性能高,推荐

$('ul p')

创建节点:

$('<div id="div1"></div>')

添加节点:

insertBefore() before()把元素添加到指定节点的前面

insertAfter() after()把元素添加到指定节点的后面

appendTo() append()把元素添加到指定节点里面的最后

prependTo() prepend()把元素添加到指定节点里面的最前

两种添加方式的区别是对后续操作的对象不同,例如:

$("ul").append($li).css('background','red')ul变红

$li.appendTo($("ul")).css('background','red')li变红

实战小技巧:

var $li = $('<li class="box">hello</li>');

$('ul').append($li)

$li.click(...);

节点的操作:

节点操作不仅可以针对新创建的元素,也可以是页面中已存在的元素

append()等也可对页面已存在的元素进行操作(剪切)

remove()

clone()默认只克隆元素结构,不克隆事件

clone(true)克隆之前的操作行为,像事件

节点的上移下移

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
input{
width: 50px;
}
</style>
</head>
<body>
<div id="wrap">
<div>00000000001<input type="button" value="up"></input><input type="button" value="down"></input></div>
<div>00000000002<input type="button" value="up"></input><input type="button" value="down"></input></div>
<div>00000000003<input type="button" value="up"></input><input type="button" value="down"></input></div>
<div>00000000004<input type="button" value="up"></input><input type="button" value="down"></input></div>
<div>00000000005<input type="button" value="up"></input><input type="button" value="down"></input></div>
<div>00000000006<input type="button" value="up"></input><input type="button" value="down"></input></div>
</div>
<script src="jquery-1.11.1.js"></script>
<script>
$(function(){
$("input[value=up]").click(function(){
var iNow = $(this).parent();
var iUp = $(this).parent().prev();
//iUp.length == 0
if(iNow.get(0) == iNow.parent().children().eq(0).get(0)){
alert('到头了');
}
else{
iNow.insertBefore(iUp);
}
});
$("input[value=down]").click(function(){
var iNow = $(this).parent();
var iDown = $(this).parent().next();
if(iDown.length == 0){
alert('到尾了');
}
else{
iNow.insertAfter(iDown);
}
});
});
</script>
</body>
</html>

jQ中的索引:

index()当前元素在兄弟节点(与标签类型无关)中的排行,也可筛选index('p')

$('#span1').index('div span')筛选后的排行,这些span不一定是兄弟关系,所有div中的span

$('div span').index($('#span1'))和上面写法一样

选项卡

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
input{
width: 60px;
}
#wrap div{
width: 200px;
height: 200px;
border: 1px solid #333;
display: none;
}
#wrap .active{
display: block;
}
.on{
background-color: yellow;
}
</style>
</head>
<body>
<div id="wrap">
<input class="on" type="button" value="一">
<input type="button" value="二">
<input type="button" value="三">
<div class="active">1</div>
<div>2</div>
<div>3</div>
</div> <script src="jquery-1.11.1.js"></script>
<script>
$(function(){
$("#wrap").find("input").click(function(){
$(this).addClass('on').siblings().removeClass('on');
$('#wrap div').eq($(this).index()).addClass('active').siblings().removeClass('active');
});
});
</script>
</body>
</html>

jQ中的遍历each():

$('li').each(function(i,elem){//索引,原生的元素
$(elem).html(i);
$(this).html(i);
this == elem
if(i == 2){
return false;//跳出循环
}
});

jQ包装对象:

wrap()----$('span').wrap('<div></div>')span外包个div

wrapAll()

wrapInner()

unwrap()删除包装相当于删除父节点,body是不能被删的

管理员与普通用户状态控制

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div>
<input type="button" value="管理员">
<input type="button" value="普通用户">
</div>
<div>
<span>登陆</span>
</div>
<script src="jquery-1.11.1.js"></script>
<script>
$(function(){
$("input[value=管理员]").click(function(){
$("span").wrap('<a href="javascript:;"></a>');
});
$("input[value=普通用户]").click(function(){
$("span").unwrap('<a href="javascript:;"></a>');
});
});
</script>
</body>
</html>

jQ对象转原生对象:

$('div').get()

$('div')是一个集合,$('div').get()是一个原生集合

$('div').get(0) == $('div')[0]

为什么转?

>>获取内容的高度scrollHeight

>>元素之间的比较$nowLi.get(0) == $li.eq(0).get(0) 上移下移的例子

[] == [] false

{} == {} false   引用不同

左右切换数据

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
li{
list-style-type: none;
line-height: 1.5;
cursor: pointer;
margin-top: 10px;
}
.wrap{
margin: 50px auto 0;
width: 600px;
overflow: hidden;
border: 1px solid #333;
}
.left{
float: left;
width: 255px;
padding-left: 20px;
}
.center{
float: left;
width: 50px;
}
.center span{
margin-top: 50px;
display: block;
height: 48px;
line-height: 48px;
border: 1px solid #333;
cursor: pointer;
text-align: center;
}
.right{
float: left;
width: 255px;
padding-left: 20px;
}
.active{
background-color: green;
color: #fff;
}
</style>
</head>
<body>
<div class="wrap">
<div class="left">
<ul id="left-list">
<li>这是列表1</li>
<li>这是列表2</li>
<li>这是列表3</li>
<li>这是列表4</li>
<li>这是列表5</li>
<li>这是列表6</li>
<li>这是列表7</li>
<li>这是列表8</li>
</ul>
</div>
<div class="center">
<p><span id="right" from="#left-list" to="#right-list">&gt;</span></p>
<p><span id="left" from="#right-list" to="#left-list">&lt;</span></p>
</div>
<div class="right">
<ul id="right-list">
<li>这是列表1</li>
<li>这是列表2</li>
<li>这是列表3</li>
<li>这是列表4</li>
<li>这是列表5</li>
<li>这是列表6</li>
<li>这是列表7</li>
<li>这是列表8</li>
</ul>
</div>
</div>
<script src="jquery-1.11.1.js"></script>
<script>
$(function(){
$("li").click(function(){
$(this).toggleClass("active");
}); // $("#right").click(function(){
// var $li = $("#left-list li[class=active]");
// $li.appendTo($("#right-list")).attr("class","");
// }); // $("#left").click(function(){
// var $li = $("#right-list li[class=active]");
// $li.appendTo($("#left-list")).attr("class","");
// });
$('span').click(function(){
$($(this).attr('from')).find('.active').appendTo( $($(this).attr('to')) ).removeClass('active');
});
});
</script>
</body>
</html>

评分效果:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
.list{
margin: 50px auto 0;
width: 300px;
overflow: hidden;
}
.list li{
width: 38px;
height: 38px;
float: left;
border: 1px solid #333;
margin: 10px;
list-style-type: none;
cursor: pointer;
}
.list li.active{
background-color: red;
}
</style>
</head>
<body>
<ul class="list">
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<script src="jquery-1.11.1.js"></script>
<script>
$(function(){
// var bBtn = true;
// var timer = null;
// $("li").mouseover(function(){
// if(bBtn){
// clearTimeout(timer);
// var index = $(this).index();
// $("li").each(function(i,ele){
// if(i <= index){
// $(this).addClass('active');
// }
// else{
// $(this).removeClass('active');
// }
// });
// }
// }).mouseout(function(){
// if(bBtn){
// timer = setTimeout(function(){
// $('li').removeClass('active');
// },100);
// }
// }).click(function(){
// bBtn = false;
// });
var bBtn = true;
var timer = null;
$("li").mouseover(function(){
if(bBtn){
clearTimeout(timer);
$("li").slice(0,$(this).index()+1).addClass("active");
$("li").slice($(this).index()+1).removeClass("active");
}
}).mouseout(function(){
if(bBtn){
timer = setTimeout(function(){
$('li').removeClass('active');
},100);
}
}).click(function(){
bBtn = false;
});
});
</script>
</body>
</html>

第三章:突破

元素的尺寸:

width()/height()  width

innerWidth()/innerHeight()  width+padding

outerWidth()/outerHeight()  widht+padding+border

outerWidth(true)  width+padding+border+margin

原生JS是获取不到隐藏元素尺寸的,jQ则可以

实战小技巧:

可视区的尺寸$(window).height()

页面的尺寸$(document).height()

滚动距离:

$(document).scrollTop()

$(document).scrollLeft()

当页面滚动到最底部时:$(document).scrollTop() == $(document).height() - $(window).height()

设置滚动距离:$(document).scrollTop(0);

元素滚动(条)距离:$("#div1").scrollTop()

元素距离:

offset().left:相对于document而非可视区,与其父元素有无定位无关

原生:offsetLeft到达有定位的父级

position().left到有定位的父级,不包含自身的margin值

实战小技巧:

offsetParent()获取有定位的父级

目的:不管有无margin获取到有定位父级的值

$('#div2').offset().left - $('#div2').offsetParent().offset().left

懒加载页面中的图片:img.offset().top < $(window).height() + $(document).scrollTop()

toChange();
$(window).scroll(toChange);
function toChange(){
$('img').each(function(i,elem){
if( $(elem).offset().top < $(window).height() + $(document).scrollTop() ){
$(elem).attr('src' , $(elem).attr('_src') );
}
});
}

事件:

on()

off()

jQ中事件操作都是绑定的形式

支持多事件写法

click()写法,也是采用off()取消

even对象:

ev.pageX鼠标x轴坐标,相对于整个页面document

ev.clientX鼠标x轴坐标,相对于可视区

$(document).keydown(function(ev){
ev.which 键盘键值
ev.stopPropagation() 阻止冒泡
ev.preventDefault() 阻止默认事件,例如contextmenu()右键菜单
return false 阻止默认事件和冒泡
});
$(document).click(function(ev){
//当前目标元素事件源
alert(ev.target);
});

实战小技巧:

//点多次#div1的时候会多次调用$('#span1').click(),此时再点#span1会执行多次弹窗,解决:
$('#div1').click(function(){
$('#span1').off('click').click(function(){//第一次点span为什么没反应呢?
alert(1);
});
});

拖拽小例子:

$div = $("#div1");
$div.mousedown(function(ev){
var $x = ev.pageX - $(this).offset().left;
var $y = ev.pageY - $(this).offset().top;
$(document).mousemove(function(ev){
$div.css({
"left" : ev.pageX - $x,
"top" : ev.pageY - $y
});
}).mouseup(function(){
$(document).off();
});
return false;
});

事件委托:

//事件委托,对新添加的元素依然有效
$('ul').delegate('li','click',function(){
$(this) 指li
$(ev.delegateTarget) 指ul $(ev.delegateTarget).undelegate() 取消委托
});

主动触发:

$('input').kedown(function(){
if(ev.which == 13){
//两种写法
$('#btn').trigger('click');
$('#btn').click();
}
});
$('#btn').trigger('click.abc') 命名空间
$('#btn').off('.abc') off可以只写命名空间

例如拖拽中:$(this).off('mousemove.drag').off('mouseup.drag')或$(this).off('.drag')

回车模仿按钮主动触发实例

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<style> #div1{ width:100px; height:100px; background:red; position:absolute; left:100px; top:100px;}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
//trigger() : 主动触发
$(function(){
$('ul').delegate('li','click',function(ev){
$(this).css('background','red');
});
$('#input1').click(function(){
var $li = $('<li>'+ $('#input2').val() +'</li>');
$('ul').append( $li );
});
$('#input2').keydown(function(ev){
if( ev.which == 13 ){
$('#input1').trigger('click');
//$('#input1').click();
}
});
});
</script>
</head> <body style="height:2000px;">
<input id="input1" type="button" value="添加"><input id="input2" type="text">
<ul>
<li>1111</li>
<li>1111</li>
<li>1111</li>
<li>1111</li>
</ul>
</body>
</html>

工具方法:

既可以给jQ对象用也可以给原声JS用

$.type()比原生强大,能判断对象类型

$.isFunction()

$.inNumeric()判断是否是数字例如'123'是true,不判断类型

$.isArray()

$.inWindow()

$.isEmptyObject()

$.isPlainObject()

$.extend():

默认浅拷贝,支持多对象拷贝
$.extend(b,a) a拷贝一份给b
$.extend(c,b,a) a和b复制一份给c,互不影响
$.extend(true,b,a) 深拷贝

$.proxy():

function show(num){
alert(num);
lert(this);
}
$.proxy(show,document)() //show函数中的this指document,后面加括号才能调用
$.proxy(show,document)(3,4) //调用并传参
$.proxy(show,document,3,4) //传参

$.proxy()灵活设计传参的意义:

$(document).on('click',show); //this指向document
$(document).on('click',$.proxy(show,window)(3));//this指向window,不点就触发了
$(document).on('click',$.proxy(show,window,3));//this指向window,点击后触发

实战小技巧:

利用This改指向,jQuery中使用$(This),更加方便!

登陆弹窗效果练习

第四章:进阶

运动:

show()/hide()/toggle()
fadeIn()/fadeOut()/fadeToggle()
slideDown()/slideUp()/slideToggle()

animation():

默认400毫秒,swing(慢快慢)
animate({ ... },400,swing,function(){ ... }) 另一种书写形式的意义:step的使用
$("div").animate({
width:300,
height:300
},{
duration:1000,
easing:'linear',
complete:function(){ ... },
step:function(a,b){ ... }a可以检测定时器的每一次变化 b.pos运动过程的比例值(0,1),起点0,终点1
}); 每次点击+=100
width:"+=100"

利用step实现0在2s内运动到843264328

$("#div1").animate({
num: "move"//这里必须要有值,随便写
},{
duration: 2000,
easing: 'linear',
complete: function(){},
step:function(a,b){
$('#div1').html(parseInt(b.pos * 843264328));//b.pos开始的时候是0,结束的时候是1
}
});

运动队列:

运动是异步的不会影响后续非同一对象animation代码,链式运动,同一对象中的运动代码则会存到运动队列中依次执行
$('#div1').animate({width:300},1000);//先运行
$('#div1').animate({height:300},1000);//再运行
$('#div1').animate({left:300},1000);//最后运行
以上代码等同于:
$('#div1').animate({width:300},1000).animate({height:300},1000).animate({left:300},1000); delay(1000) 停一秒 stop() 默认停止当前一次的运动,直接停那,不是目标点
stop(true) 停止所有运动
stop(true,true) 第二个参数停止当前运动到目标点
finish() 所有运动停到目标点

实战小技巧:

stop()还有一个清空队列的作用

$(this).stop().animation( ... );

解决快速移入移出的问题
$('#div1').mouseover(function(){
$(this).stop().animate({
width:200,
height:200
});
}).mouseout(function(){
$(this).stop().animate({
width:100,
height:100
});
});

淘宝轮播图实例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>淘宝幻灯滑入滑出效果</title>
<style> * { padding: 0; margin: 0; }
li { list-style: none; }
img { border: none; } body { background: #ecfaff; } #play { width: 470px; height: 150px; overflow: hidden; border: 1px solid #d8d8d8; margin: 100px auto 0; }
.packet { width:470px; height: 150px; position: relative; overflow:hidden;}
ol { position: absolute; right: 5px; bottom: 5px; z-index: 2; }
ol li { float: left; margin-right: 3px; display: inline; cursor: pointer; background: #fcf2cf; border: 1px solid #f47500; padding: 2px 6px; color: #d94b01; font-family: arial; font-size: 12px; }
.active { padding: 3px 8px; font-weight: bold; color: #ffffff; background: #ffb442; position: relative; bottom: 2px; } ul { position: absolute; top: 0px; left: 0px; z-index: 1; background:white; width: 470px; height: 150px; }
ul li { position:relative; width: 470px; height: 150px; top:0px; left:0px; }
ul img { float: left; width: 470px; height: 150px; }
</style>
<script src="jquery-1.11.1.js"></script>
<script> $(function(){
var $olLi = $(".packet ol").find("li");
var $ul = $(".packet ul");
var $liHeight = $ul.find("li").eq(0).height();
var index = 0;
var iNow = 0;
var timer = null;
var $wrap = $('.packet'); $olLi.mouseover(function(){
iNow = index = $(this).index();
$(this).addClass("active").siblings().removeClass("active");
$ul.stop().animate({//停止上次运动再开始新的运动
top: -$liHeight*index
},1000);
}); var timer= setInterval(move,2000); $wrap.mouseover(function(){
clearInterval(timer);
}).mouseout(function(){
timer= setInterval(move,2000);
}); function move(){
$olLi.eq(iNow).addClass("active").siblings().removeClass("active"); $ul.stop().animate({//停止上次运动再开始新的运动
top: -$liHeight*iNow
},1000);
iNow ++;
if(iNow == $olLi.length){
iNow = 0;
}
} }); </script>
</head> <body> <div id="play">
<div class="packet"><!-- 为了消除offsetXXX的兼容性问题 -->
<ol>
<li class="active">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ol>
<ul>
<li><a href="http://www.miaov.com/"><img src="img/1.jpg" alt="广告一" /></a></li>
<li><a href="http://www.miaov.com/"><img src="img/2.jpg" alt="广告二" /></a></li>
<li><a href="http://www.miaov.com/"><img src="img/3.jpg" alt="广告三" /></a></li>
<li><a href="http://www.miaov.com/"><img src="img/4.jpg" alt="广告四" /></a></li>
<li><a href="http://www.miaov.com/"><img src="img/5.jpg" alt="广告五" /></a></li>
</ul>
</div>
</div> </body>
</html>

工具方法:

$.parseJSON() 把严格json类型的字符串转换为真正的json数据

$.parseHTML() 转换HTML形式的字符串,转成DOM节点,放到一个数组中

$.parseXML()

$.isXMLDoc()

$.ajax()

//js
$('#input1').on('input',function(){
$.ajax({
url:'user.php',
type:'get',//get形式的传值也可以拼接到url的后面
data:{//往后端传值,也可通过拼接字符串形式传值
user:$(this).val()
},
     dataType:'json',//规定返回类型必须是json或数组格式的字符串,成功返回时相当于会自动$.parseJSON(data)
success:function(data){//返回1的时候可注册返回0不可注册,data为后端返回的值
if(data == 1){
$("#div1").html('可以注册');
}
else if(data == 0){ }
},
     error:function(err){
        console.log(err);
     }
});
});
//php
if($_GET['user'] == 'miaov'){
echo '0';
}
else{
echo '1';
}
//html
<form action="reg.php">
<input type="text" id="input1">
<input type="submit" value="提交">
</form>

async:

$.ajax({
url:'test.php',
async:false,//同步,先走ajax再走下面代码
success:function(data){
console.log(data);
}
});
console.log(123);
<?php
echo 'hello';
?>

同步应用场景:

var arr = $.ajax({
url:'test.php',
async:false
}).responseText; arr = eval(arr);
arr.push("hello");
console.log(arr);
<?php
echo '["a","b","c"]';
?>

$.get()/$.post() 不能设置同步/异步,$.ajax()的一种简写形式

$.get(
'test.php',
{name:"hello"},//后台通过name接受hello
function(){ ... },//成功回调
'json'//指定返回数据格式,dataType
).error(function(err){ ... });

ajax版本的选项卡实例

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
#wrap{
width: 300px;
margin: 40px auto 0;
}
#wrap div{
width: 300px;
height: 300px;
line-height: 300px;
text-align: center;
font-size: 30px;
color: green;
border: 1px solid #333;
display: none;
}
#wrap div.on{
display: block;
}
input{
width: 60px;
height: 30px;
}
.active{
background-color: yellow;
} </style>
</head>
<body>
<div id="wrap">
<input type="button" value="按钮1" class="active">
<input type="button" value="按钮2">
<input type="button" value="按钮3">
<div class="on">1正在加载中...</div>
<div>2正在加载中</div>
<div>3正在加载中</div>
</div>
<script src="jquery-1.11.1.js"></script>
<script>
var index = 0;
var $div = $('#wrap').find('div');
$("input").click(function(){
index = $(this).index();
$(this).addClass('active').siblings().removeClass('active');
$div.eq(index).addClass('on').siblings('div').removeClass('on');
getData(index);
});
getData(index);
function getData(index){
$.ajax({
url:'data.php?num=' + index,
success:function(data){
$div.eq(index).html(data);
}
});
}
</script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
#wrap{
width: 300px;
margin: 40px auto 0;
}
#wrap div{
width: 300px;
height: 300px;
line-height: 300px;
text-align: center;
font-size: 30px;
color: green;
border: 1px solid #333;
display: none;
}
#wrap div.on{
display: block;
}
input{
width: 60px;
height: 30px;
}
.active{
background-color: yellow;
} </style>
</head>
<body>
<div id="wrap">
<input type="button" value="按钮1" class="active">
<input type="button" value="按钮2">
<input type="button" value="按钮3">
<div class="on">1正在加载中...</div>
<div>2正在加载中</div>
<div>3正在加载中</div>
</div>
<script src="jquery-1.11.1.js"></script>
<script>
var index = 0;
var $div = $('#wrap').find('div');
$("input").click(function(){
index = $(this).index();
$(this).addClass('active').siblings().removeClass('active');
$div.eq(index).addClass('on').siblings('div').removeClass('on');
loadData(index,function(a){
$div.eq(index).html(a);
});
});
loadData(0,function(a){
$div.eq(0).html(a);
})
function loadData(index,fn){
$.ajax({
url:'data.php?num=' + index,
success:function(data){
fn(data);
}
});
}
</script>
</body>
</html>
//data.php
<?php if($_GET['num']==0){
echo '第一项的内容';
}
else if($_GET['num']==1){
echo '第二项的内容';
}
else if($_GET['num']==2){
echo '第三项的内容';
} ?>

优酷电影频道轮播图

ajax添加/删除/查看更多

//html
<textarea id="t1"></textarea>
<input id="input1" type="button" value="发布">
<ul>
<li mainId='124346346'><span>1111111111111内容</span> <span class="close">X</span></li>
<li mainId='124342222'><span>222222222222内容</span> <span class="close">X</span></li>
<li mainId='1243465555'><span>333333333333内容</span> <span class="close">X</span></li>
</ul>
<input id="input2" type="button" value="载入更多">
/*添加*/
$('#input1').click(function(){
$.ajax({
url : 'add.php',
type : 'POST',
data : {val:$('#t1').val()},
dataType : 'json',
success : function(data){
var $li = $('<li>');
var mainId = data.mainId;
$li.html('<span mainId="'+ mainId +'">'+ data.text +'</span> <span class="close">X</span>');
$('ul').prepend( $li );
}
});
});
/*删除*/
$('ul').delegate('span.close','click',function(){
var $elem = $(this);
$.ajax({
url : 'remove.php',
data : {'mainId' : $elem.attr('mainId') },
success : function(data){
$elem.parent().remove();
}
});
});
/*查看更多*/
var iNow = 0;
$('#input2').click(function(){
iNow++;
$.ajax({
url : 'loadPage.php?num='+iNow,
dataType : 'json',
success : function(data){
for(var i=0;i<data.length;i++){//data是一个数组
var $li = $('<li>');
var mainId = data[i].mainId;
var text = data[i].text;
$li.html('<span mainId="'+ mainId +'">'+text +'</span> <span class="close">X</span>');
$('ul').append( $li );
}
}
});
});

扩展练习:寻路

jQ插件:

分为功能型和效果型

$.browser()//判断浏览器类型

$.cookie()//存在跨域不能使用线上地址,下载下来使用

e-calendar()//日历

UI组件:

jQuery UI

jQuery EasyUI

第五章:高级

清空内容:

html("")

empty()

删除节点:

remove() $div = $("#div1").detach();重新添加时不保留行为(事件操作)

detach() $div = $("#div1").detach(); 重新添加到页面时$div将仍会保留行为

text():

$("div").text():获取的是集合的所有文本而非仅第一个

text('<h1>标题</h1>')不解析

替换节点:

$("#span1").replaceWith( $("#div1") )用div替换span,#span1中存在的内容也会消失

replaceAll()上面的不同写法

hover():

mouseenter()和mouseleave()的结合

子元素不会影响父元素:

<div id="div1">
<div id="div2"></div>
</div>
$("#div1").mouseover(function(){
$("#div2").animate({//移动到里面div会触发$("#div1").mouseout同时冒泡会触发$("#div1").mouseover
"top":0
});
}).mouseout(function(){
$("#div2").animate({
"top":-100
});
});
$("#div1").mouseenter(function(){
$("#div2").animate({
"top":0
});
}).mouseleave(function(){
$("#div2").animate({
"top":-100
});
});

focusin()/focusout():

focusin()/focusout()会冒泡,子元素中有input时也可给父级加此类事件

focus()/blur()不会冒泡,只能加给有获取焦点的元素

one():

只会触发一次,也可用on后然后再off()模拟

on():

//事件只会作用于span上,相当于下面的delegate写法
$("#div1").on('click','span',{"name":"xiaoyang"},function(ev){
console.log(ev.data);//{"name":"xiaoyang"}
//this指向span
});
$("#div1").delegate('span','click',function(){ });

jQ event转原生event:

ev.changedTouches

ev.originalEvent.changedTouches

自定义事件:

$("#div1").on('zoomIn',function(){
$(this).css('fontSize',12);
});
$("#div1").on('zoomOut',function(){
$(this).css('fontSize',120);
}); $("#div1").on('DOMMouseScroll',function(ev){
if(ev.originalEvent.detail > 0){
$(this).trigger('zoomIn');//当然也可以直接把代码写在这里;自定义事件适合代码合并优化,多人协作时使用
}
else{
$(this).trigger('zoomOut');
}
});

triggerHandler():

trigger()会触发默认行为,例如focus时的光标效果

triggerHandler()不会触发默认行为,例如触发focus时的光标则不会激活;不会冒泡到父元素的trigger事件,相当于阻止了冒泡

ev.stopImmediatePropagation():

ev.stopPropagation()阻止父级行为

ev.stopImmediatePropagation()阻止自身和父级行为,本身的事件操作要放到父级的后面

ev.which:

鼠标键值,mousedown或mouseup时

加载:

$(document).ready(function(){ ... });dom结构加载完,图片可能还没加载

$(window).load(function(){ ... });页面加载完

获取图片宽度时,两个会有差异,解决:使用$(window).load()或者$('img').load(function(){ ... })

选择元素截止到:

parentsUntil()截至到祖先节点的某一个,不包括某一个

nextUntil()下面兄弟节点截至位置

prevUntil()上面兄弟节点截至位置

data()/attr()/prop():

$("#div1").data('name','hello');//存到了一个大的集合中,jQ源码中。缓存大量数据用data()可以防止内存泄漏

$("#div1").data('name');

$("#div1").attr('name','hello');//通过setAttribute()设置在dom结构本身上,通常设置class、title

$("#div1").attr('name');

$("#div1").prop('name','hello');//通过./[]设置在dom结构本身上

$("#div1").prop('name');

removeData()

removeAttr()

removeProp()

全选例子

//aInput[i].checked = true;
//setAttibute('checked','checked');
$(function(){
var bBtn = true;
$('input[type=button]').click(function(){
if(bBtn){
$('input').slice(1).prop('checked',true);//$('input').slice(1)选中索引1往后的所有input
}
else{
$('input').slice(1).prop('checked',false);
}
bBtn = !bBtn;
});
});

json形式的设置:

on({
'click':function(){ ... },
'mouseover':function(){ ... }
})

css()

attr()

回调形式的设置:

addClass()

html()

val()

$("div").addClass(function(i,oldClass){//索引、oldClass
return oldClass + (i+1);
});

工具方法:

$.merge(a,b)合并两个数组

var arr = ['a','b','c','d'];
arr = $.map(arr,function(val,i){
return val+i;
//return 'hello';//数组中所有值变成hello
});
console.log(arr);//["a0", "b1", "c2", "d3"]

var arr = [1,5,4,8,3];
arr = $.grep(arr,function(val,i){
return val > 4;//需要返回一个布尔值
});
console.log(arr);//[5,8]

//$.unique()//只是针对dom节点的去重
var aDiv = $('div').get();
var arr = [];
for(var i = 0;i < aDiv.length;i ++){
arr.push(aDiv[i]);
}
for(var i = 0;i < aDiv.length;i ++){
arr.push(aDiv[i]);
}
console.log(arr);
arr = $.unique(arr);
console.log(arr);

//$.inArray(),类似于indexOf()找内容在数组中的位置,返回1或-1
var arr = ["a","b","c","d"];
console.log($.inArray('b',arr));

//转数组
var aDiv = $.makeArray(aDiv);
aDiv.push();

$.trim()//去掉字符串的前后空格

ajax扩展:

$.param()拼接成字符串形式的数据
//key = value & key =value
var obj = {
"name":"yangkang",
"age":"24"
};
console.log($.param(obj));//name=yangkang&age=24,data中写这种json格式的会自动帮转
var obj = [//一定是name和value的组合
{
name:"yangkang",
value:"20"
}
];
obj = $.param(obj);
console.log(obj);//yangkang=20

格式化表单数据
serialize()
serializeArray()

<form action="">
<input type="text" name="a" value="1">
<input type="text" name="b" value="2">
<input type="text" name="c" value="3">
</form>

var result1 = $('form').serialize();//只是针对form中的name和value的组合
console.log(result1);//a=1&b=2&c=3

var result2 = $('form').serializeArray();
console.log(result2);//[{name:"a",value:"1"},{name:"b",value:"2"}...]

// data.html
// <span>span1</span>
// <span class="box">span2</span>
// <span>span3</span>

//div中会有1个带.box的数据
$('#div1').load("data.html .box",function(){

});

//动态加载JS,实现按需加载,例如点击一个按钮的时候加载js实现一些功能,适合性能优化,服务器环境下使用
$.getScript('data.js',function(){ ... });

$.getJSON('data.php',function(data){
console.log(data);
});

<?php
echo '{"name":"yangkang"}';
?>

//JSONP解决跨域:动态创建script标签通过src...
$.getJSON('data.php?callback=?',function(data){
console.log(data);
}).error(function(){});//返回非json格式的会走error
<?php
echo $_GET['callback'].'({"name":"yangkang"})';
?>

//全局设置
$.ajaxSetup({
type: 'post'
});

全局事件,加到document上
$.ajaxStart()
$.ajaxStop()
$.ajaxSuccess()
$.ajaxError()
$.ajaxComplete()
$.ajaxSend()

$冲突:

var J = $.noConflict();

接下来J 就可以代替 $ 啦

$.each():

可以针对原生JS数组和JSON

var arr = ['a','b','c'];
var obj = {"name":"yangkang","age":"22"};
$.each(arr,function(i,val){
console.log(i);
console.log(val);
});
$.each(obj,function(i,val){
console.log(i);
console.log(val);
});

end():

$("div").next().css('background','red').end().css('color','blue');

addBack(),后退添加链式操作:

$("div").next().css('background','red').addBack().css('color','blue');//当前和后退元素都生效

add()添加到集合:

$('div').add('span').css(...);相当于 $('div,span').css(...);

队列:

jQ中的队列存储的都是一些函数

queue() 入队

dequeue() 出队

//jQ的队列,当进行出对操作的时候,会自动执行相应的函数,一般针对运动操作

$(function(){
function a(){
alert(1);
}
function b(){
alert(2);
}
function c(){
alert(3);
}
//工具式的写法
$.queue( document,'miaov',a );
$.queue( document,'miaov',b );
$.queue( document,'miaov',c ); $.dequeue(document,'miaov');//a
$.dequeue(document,'miaov');//b
$.dequeue(document,'miaov');//c //对象式的写法
$(document).queue('miaov',a);
$(document).queue('miaov',b);
$(document).queue('miaov',c); $(document).dequeue('miaov',a);//a
$(document).dequeue('miaov',b);//b
$(document).dequeue('miaov',c);//c });
$(function(){
function a(){
$('div').css('backgroundColor','red');
$('div').dequeue('fx');//a要出队,不然后续无法执行,相当于买完票不动了...
}
$('div').animate({'width':200});//先
$('div').queue('fx',a);//执行并入队,fx是固定的运动的名字
$('div').animate({'height':200});//再
$('div').animate({'left':200});//后 //[A,B,C]>>>>A>>B>>C>>>队列的操作
});

delay()的实现:

$('div').delay(2000);

$('div').queue('fx',function(){//入队
setTimeout(function(){
$('div').dequeue();//两秒后出队
},2000);
});

$.Callbacks():

function a(){
alert(1);
}
function b(){
alert(2);
}
function c(){
alert(3);
}
var cb = $.Callbacks();
cb.add(a);//添加到集合
cb.add(b);//添加到集合
cb.fire();//触发,弹出结果1和2
cb.add(c);//添加到集合
cb.remove(a);//删除a
cb.fire();//触发,弹出结果2和3

应用场景:主要源码中使用

四大参数:

$.Callbacks('once');//只触发一次fire(),第一次触发的执行

$.Callbacks('memory');//写在fire()后的add(函数)也可以触发

$.Callbacks('unique');//去除重复的函数,例如cb.add(a);cb.add(a);

$.Callbacks('stopOnFalse');//碰到add()函数中的return false,后续的所有add()都不会执行

解决定时器异步形成的问题:

var cb = $.Callbacks();
setTimeout(function(){//异步的不影响后续代码
alert(1);
cb.fire();//触发
},1000);
cb.add(function(){
alert(2);
});

基于$.Callbacks()开发的$.Deferred():

var dfd = $.Deferred();
setTimeout(function(){//异步的不影响后续代码
alert(1);
dfd.resolve();//解决对应done
dfd.reject();//未解决对应fail
},1000);
dfd.done(function(){
alert(2);
});
dfd.fail(function(){
alert(3);
});

$.ajax('aaa.php').done(function(){ ... }).fail(function(){ ... });

//第一次延迟2s,第二次立即触发的两种实现方法
var bBtn = true;
$('input').click(function(){
if(oBtn){
bBtn = false;
setTimeout(a,2000);
}
else{
a();
}
});
function a(){
alert(1);
} var dfd = $.Deferred();
$('input').click(function(){
setTimeout(function(){
dfd.resolve();//2秒后才解决触发,第二次点的时候已经是解决状态了所以dfd.done(a)会立即触发,状态会保持住
},2000)
dfd.done(a);//第一次点击只是一个添加
});
function a(){
alert(1);
}

//两个请求同时成功之后走done()
$.when( $.ajax('aaa.php'),$.ajax('bbb.php') ).done(function(){ ... });

jQuery源码架构...:

$("div").css("backgroundColor","red");

function $(selector){
return new Jquery(selector);
}
function Jquery(selector){
selector > 获取元素
}
Jquery.prototype.css = function(){ }

$.extend():除了复制对象的功能外还能扩展工具形式的插件

$.extend({
leftTrim:function(str){
//this == $
return str.replace(/^\s+/g,'');
}
});
var str = " hello ";
alert('('+$.leftTrim(str)+')');//工具的方式$.leftTrim()

$.fn.extend():

$.fn.extend({
size2:function(){
//this == $('div')
return this.length;
}
});
alert( $('div').size2() );//选中元素的形式

简单选项卡插件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#tab div{
width: 200px;
height: 200px;
border: 1px solid black;
display: none;
}
.active{
background-color: red;
}
</style>
<script src="jquery-1.11.1.js"></script>
<script>
$(function(){
//$("#tab").tabs();
$("#tab").tabs({
heads : ['体育','新闻','节能','服务'],
bodys : ['体育1111','新闻11111','节能11111','服务1111'],
events : 'mouseover'
});
$("#tab").on('beforeChange',function(){//切换前
alert( $('#tab').find('div:visible').html() );
});
$("#tab").on('afterChange',function(){//切换后
alert( $('#tab').find('div:visible').html() );
});
});
(function($){
var defaults = {
heads : ['1','2','3'],
bodys : ['111111','222222','3333333'],
events : 'click'
}; var settings = {};
var $parent = null;
function fnTab(options){
$parent = this;
settings = $.extend(settings,defaults,options);
create();
bind();
}
function create(){
for(var i = 0;i < settings.heads.length;i ++){
var $input = $('<input type="button" value="'+ settings.heads[i] +'">');
if(i == 0){
$input.attr("class","active");
}
$parent.append( $input );
}
for(var i = 0;i < settings.bodys.length;i ++){
var $div = $('<div>'+ settings.bodys[i] +'</div>');
if(i == 0){
$div.show();
}
$parent.append( $div );
}
} function bind(){
$parent.find('input').on(settings.events,function(){
$parent.trigger('beforeChange');//前 $parent.find('input').attr('class','');
$(this).attr('class','active');
$parent.find('div').eq( $(this).index() ).show().siblings('div').hide(); $parent.trigger('afterChange');//后
});
} $.fn.extend({
tabs: fnTab
});
})(jQuery);
</script>
</head>
<body>
<div id="tab">
<!-- <input class="active" type="button" value="1">
<input type="button" value="2">
<input type="button" value="3">
<div style="display:block;">11111</div>
<div>22222</div>
<div>33333</div> -->
</div>
</body>
</html>

Sizzle选择器:

通用选择:

$("#div1").find("*")

层级选择:

>子

+后一个兄弟

~后所有兄弟

:animated选择有运动的元素

$("div:eq(1)")

:even

:odd

:first  $("div:first")或$("div").first()

:last

:gt()

:lt() $("div:lt(2)")选择索引小于2的元素

内容筛选:

$("div:contains(aaa)")

$("div:empty")选择内容是空的元素

$("div:parent")选择有内容的元素

可见性筛选:

:hidden

:visible

子元素筛选:

:first-child  $("#div1 span:first-child") #div1中所有子元素中第一个span的标签

:last-child

:first-of-type  $("#div1 span:first-of-type")  #div1中span中的第一个

:last-of-type

:nth-child()

:nth-of-type()

:only-child  仅有一个子元素时

:only-of-type 仅有指定类型的一个时

表单筛选:

:button

:checkbox

:radio

:checked

:disabled

:enabled

:selected

筛选方法:

filter()

not()

$("div").has(".box")  找div中有.box的子元素    作用于$("div")

$("div").find(".box")  作用于.box

jQ中的调试:FireQuery

自动注入jquery库

查看当前jQuery库版本

高亮对应选择DOM元素

数据缓存查看:$("div").data('name','hello')

模板引擎:基于jQ的Jsviews模板

http://www.jsviews.com/

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="js/jquery.js"></script>
<script src="js/jsviews.min.js"></script>
<script>
// $.ajax({
// url:'xxx.php',
// dataType:'json',
// success:function(data){
// for(var attr in data){
// var $li = $('<li>');
// $li.html(data[attr].text);
// $ul.append($li);
// }
// }
// });
$(function(){
var data = {
title : "排行榜",
list : [
{
text:'aaaaa'
},
{
text:'bbbbb'
},
{
text:'ccccc'
}
]
};
var $div = $("#div1");
// $.each(data,function(key,val){
// if(key == 'title'){
// var $h1 = $('<h1>');
// $h1.html( val );
// $div.append( $h1 );
// }
// if(key == 'list'){
// var $ul = $('<ul>');
// for(var i = 0;i<val.length;i++){
// var $li = $('<li>');
// $li.html( val[i].text );
// $ul.append($li);
// }
// $div.append($ul);
// }
// }); var template = $.templates("#temID");
var htmlOutput = template.render(data);
$div.html(htmlOutput);
});
</script>
<script id="temID" type="text/x-jsrender">
<h1>{{:title}}</h1>
<ul>
{{for list}}
<li>{{:text}}</li>
{{/for}}
</ul>
</script>
</head>
<body>
<div id="div1">
<!-- <h1>排行榜</h1>
<ul>
<li>aaaaaaaaa</li>
<li>bbbbbbbbb</li>
<li>ccccccccc</li>
</ul> -->
</div>
</body>
</html>

单元测试Qunit:

...

jQueryMobile:

...

jQuery精华的更多相关文章

  1. 学习jQuery的免费资源:电子书、视频、教程和博客

    jQuery毫无疑问是目前最流行的JavasScript库.排名最前的网站中70%使用了jQuery,并且jQuery也成为了Web开发的标准.如果你想找Web开发方面的工作,了解jQuery会大大的 ...

  2. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十七】

    <Web 前端开发精华文章推荐>2013年第五期(总第十七期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  3. Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】

    <Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  4. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】

    <Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  5. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  6. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十】

    <Web 前端开发精华文章推荐>2013年第八期(总第二十期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  7. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十九】

    <Web 前端开发精华文章推荐>2013年第七期(总第十九期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  8. Web 前端开发精华文章集锦(jQuery、HTML5、CSS3)【系列十八】

    <Web 前端开发精华文章推荐>2013年第六期(总第十八期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和 C ...

  9. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

随机推荐

  1. refresh的停车场(栈和队列的STL)

    refresh的停车场 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述  refresh近期发了一笔横財,开了一家停车场. 因 ...

  2. Multicast注册中心

    1 2 3 4 提供方启动时广播自己的地址. 消费方启动时广播订阅请求. 提供方收到订阅请求时,单播自己的地址给订阅者,如果设置了unicast=false,则广播给订阅者. 消费方收到提供方地址时, ...

  3. 看完这篇还不会自定义 View ,我跪搓衣板

    自定义 View 在实际使用的过程中,我们经常会接到这样一些需求,比如环形计步器,柱状图表,圆形头像等等,这时我们通常的思路是去Google 一下,看看 github 上是否有我们需要的这些控件,但是 ...

  4. 【JavaSE】Java问题总结

    使用BufferedInputStream时OutOfMemoryError异常 eclipse Luna安装subversion(SVN) 使用BufferedInputStream时OutOfMe ...

  5. Drupal 主题的表现形式

    1.template.php /**  * Implements hook_theme().  */ function yourtheme_theme($existing, $type, $theme ...

  6. 九度OJ 1081:递推数列 (递归,二分法)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6194 解决:864 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= 2. 求第 ...

  7. process_thread_action

    import psycopg2 import threading conn_fmac = psycopg2.connect(database='filter_useless_mac', user='u ...

  8. Java反射机制简单学习

    java中除了基本数据类型,几乎都为对象.例如 Person p=new Person(); 这句语句表明了p是Person类的一个实例对象.但其实,Person也是一个实例对象,它是Class类的实 ...

  9. 【题解】数字组合(NTT+组合 滑稽)

    [题解]数字组合(NTT+组合 滑稽) 今天实践一下谢总讲的宰牛刀233,滑稽. \((1+x)(1+x)(1+x)\)的\(x^2\)系数就代表了有三个一快钱硬币构成的两块钱的方案数量. 很好理解, ...

  10. Flask的Debug功能非常酷

    Flask是一个Python开发框架.在试用的过程中发现它的debug功能非常cool.如下图所示,在出错的页面每条栈新的右边都有一个按钮,点击之后我们可以执行Python代码,而且非常重要的一点是通 ...