《锋利的jQuery》观后记
API文档 https://api.jquery.com/
网页中所有 DOM结构绘制完毕后就执行,而不是在页面所有内容(例如图片等占用宽带的内容)加载完毕之后才执行事件。它允许用户在第一眼看到元素的时候,就能立即看到元素产生的一些隐藏效果、显示效果和其它效果。
若要访问图像的高度等属性,可以考虑jquery提供的load()事件。
$(document).ready(function(){ //code }); 缩写形式: (function () { //jquery代码 })();
链式操作风格
对于同一个对象的较多操作,建议每行写一个操作。
//等待dom元素加载完毕. $(document).ready(function(){ $(".level1 > a").click(function(){ $(this).addClass("current") //给当前元素添加"current"样式 .next().show() //下一个元素显示 .parent().siblings().children("a").removeClass("current")//父元素的兄弟元素的子元素<a>移除"current"样式 .next().hide();//它们的下一个元素隐藏 return false; }); }); </script>
jQuery对象和DOM对象
<script type="text/javascript"> //等待dom元素加载完毕. $(document).ready(function(){ var domObj = document.getElementsByTagName("h3")[0]; // Dom对象 var $jQueryObj = $(domObj); //jQuery对象 alert("DOM对象:"+domObj.innerHTML); alert("jQuery对象:"+$jQueryObj.html()); }); </script>
jQuery对象和DOM对象的相互转换
<script> //等待dom元素加载完毕. $(document).ready(function(){ var $cr = $("#cr"); //jQuery对象 var cr = $cr.get(0); //DOM对象,获取 $cr[0] $cr.click(function(){ if($cr.is(":checked")){ //jQuery方式判断 alert("感谢你的支持!你可以继续操作!"); } if(cr.checked){ //DOM方式判断 alert("感谢你的支持!你可以继续操作!"); } }) }); </script>
解决jQuery和其它库的冲突
<body> <p id="pp">Test-prototype(将被隐藏)</p> <p >Test-jQuery(将被绑定单击事件)</p> <script type="text/javascript"> var $j = jQuery.noConflict(); //自定义一个比较短快捷方式 $j(function(){//使用jQuery $j("p").click(function(){ alert( $j(this).text() ); }); }); $("pp").style.display = 'none';//使用prototype.js隐藏元素 </script> </body>
jQuery选择器「完善的处理机制」
<script type="text/javascript"> if(document.getElementById("tt")){//需要判断,如果不判断,找不到ID为tt会报错 document.getElementById("tt").style.color="red"; } //用jQuery,无需判断$('#tt')是否存在 $('#tt').css("color","red"); </script> 需要注意的是,$(‘#tt’)获取的永远是对象, 即使网页上没有此元素。所以判断应该根据获取到元素的长度来判断,代码如下: <script type="text/javascript"> if($('#tt').length > 0){ // do something } // 或者转换为DOM对象来判断 if($('#tt')[0]){ // do something } </script>
选择器
层次选择器 //选择 所有class为one 的下一个div元素. $('#btn3').click(function(){ $('.one + div').css("background","#bbffaa"); }) //选择 id为two的元素后面的所有div兄弟元素. $('#btn4').click(function(){ $('#two ~ div').css("background","#bbffaa"); }) 基本过滤选择器 //选择第一个div元素. $('#btn1').click(function(){ $('div:first').css("background","#bfa"); }) //选择最后一个div元素. $('#btn2').click(function(){ $('div:last').css("background","#bfa"); }) //选择class不为one的 所有div元素. $('#btn3').click(function(){ $('div:not(.one)').css("background","#bfa"); }) //选择 索引值为偶数 的div元素。 $('#btn4').click(function(){ $('div:even').css("background","#bfa"); }) //选择 索引值为奇数 的div元素。 $('#btn5').click(function(){ $('div:odd').css("background","#bfa"); }) //选择 索引等于 3 的元素 $('#btn6').click(function(){ $('div:eq(3)').css("background","#bfa"); }) //选择 索引大于 3 的元素 $('#btn7').click(function(){ $('div:gt(3)').css("background","#bfa"); }) //选择 索引小于 3 的元素 $('#btn8').click(function(){ $('div:lt(3)').css("background","#bfa"); }) //选择 所有的标题元素.比如h1, h2, h3等等... $('#btn9').click(function(){ $(':header').css("background","#bfa"); }) //选择 当前正在执行动画的所有元素. $('#btn10').click(function(){ $(':animated').css("background","#bfa"); }); //选择 当前获取焦点的所有元素. $('#btn11').click(function(){ $(':focus').css("background","#bfa"); }); 内容过滤选择器 //选取含有文本"di"的div元素. $('#btn1').click(function(){ $('div:contains(di)').css("background","#bbffaa"); }) //选取不包含子元素(或者文本元素)的div空元素. $('#btn2').click(function(){ $('div:empty').css("background","#bbffaa"); }) //选取含有class为mini元素 的div元素. $('#btn3').click(function(){ $("div:has('.mini')").css("background","#bbffaa"); }) //选取含有子元素(或者文本元素)的div元素. $('#btn4').click(function(){ $('div:parent').css("background","#bbffaa"); }) 属性过滤选择器 //选取含有 属性title 的div元素. $('#btn1').click(function(){ $('div[title]').css("background","#bbffaa"); }) //选取 属性title值等于 test 的div元素. $('#btn2').click(function(){ $('div[title=test]').css("background","#bbffaa"); }) //选取 属性title值不等于 test 的div元素. $('#btn3').click(function(){ $('div[title!=test]').css("background","#bbffaa"); }) //选取 属性title值 以 te 开始 的div元素. $('#btn4').click(function(){ $('div[title^=te]').css("background","#bbffaa"); }) //选取 属性title值 以 est 结束 的div元素. $('#btn5').click(function(){ $("div[title$=est]").css("background","#bbffaa"); }) //选取 属性title值 含有 es 的div元素. $('#btn6').click(function(){ $("div[title*=es]").css("background","#bbffaa"); }) //组合属性选择器,首先选取有属性id的div元素,然后在结果中 选取属性title值 含有 es 的元素. $('#btn7').click(function(){ $("div[id][title*=es]").css("background","#bbffaa"); }) 子元素过滤选择器 //选取每个父元素下的第2个子元素 $('#btn1').click(function(){ $('div.one :nth-child(2)').css("background","#bbffaa"); }) //选取每个父元素下的第一个子元素 $('#btn2').click(function(){ $('div.one :first-child').css("background","#bbffaa"); }) //选取每个父元素下的最后一个子元素 $('#btn3').click(function(){ $('div.one :last-child').css("background","#bbffaa"); }) //如果父元素下的仅仅只有一个子元素,那么选中这个子元素 $('#btn4').click(function(){ $('div.one :only-child').css("background","#bbffaa"); }) 表单选择器 var $alltext = $("#form1 :text"); var $allpassword= $("#form1 :password"); var $allradio= $("#form1 :radio"); var $allcheckbox= $("#form1 :checkbox"); var $allsubmit= $("#form1 :submit"); var $allimage= $("#form1 :image"); var $allreset= $("#form1 :reset"); var $allbutton= $("#form1 :button"); // <input type=button /> 和 <button ></button>都可以匹配 var $allfile= $("#form1 :file"); var $allhidden= $("#form1 :hidden"); // <input type="hidden" />和<div>test</div>都可以匹配. var $allselect = $("#form1 select"); var $alltextarea = $("#form1 textarea"); var $AllInputs = $("#form1 :input"); var $inputs = $("#form1 input"); 表单对象属性过滤选择器 //使用:selected选择器,来操作下拉列表. $("select").change(function () { var str = ""; $("select :selected").each(function () { str += $(this).text() + ","; }); $("div").eq(1).html("<strong>你选中的是:"+str+"</strong>"); }).trigger('change'); // trigger('change') 在这里的意思是:select加载后,马上执行onchange. // 也可以用.change()代替. //对表单内 可用input 赋值操作. $('#btn1').click(function(){ $("#form1 input:enabled").val("这里变化了!"); return false; }) //对表单内 不可用input 赋值操作. $('#btn2').click(function(){ $("#form1 input:disabled").val("这里变化了!"); return false; }) //使用:checked选择器,来操作多选框. $(":checkbox").click(countChecked); function countChecked() { var n = $("input:checked").length; $("div").eq(0).html("<strong>有"+n+" 个被选中!</strong>"); }
操作节点
插入节点 //<![CDATA[ $(function(){ var $li_1 = $("<li title='香蕉'>香蕉</li>"); // 创建第一个<li>元素 var $li_2 = $("<li title='雪梨'>雪梨</li>"); // 创建第二个<li>元素 var $li_3 = $("<li title='其它'>其它</li>"); // 创建第三个<li>元素 var $parent = $("ul"); // 获取<ul>节点,即<li>的父节点 var $two_li = $("ul li:eq(1)"); // 获取<ul>节点中第二个<li>元素节点 $parent.append($li_1); // append方法将创建的第一个<li>元素添加到父元素的最后面 $parent.prepend($li_2); // prepend方法将创建的第二个<li>元素添加到父元素里的最前面 $li_3.insertAfter($two_li); // insertAfter方法将创建的第三个<li>元素元素插入到获取的<li>之后 }); //]]> 移动节点 //<![CDATA[ $(function(){ var $one_li = $("ul li:eq(1)"); // 获取<ul>节点中第二个<li>元素节点 var $two_li = $("ul li:eq(2)"); // 获取<ul>节点中第三个<li>元素节点 $two_li.insertBefore($one_li); //移动节点 }); //]]> 删除节点 //<![CDATA[ $(function(){ $("ul li").click(function(){ alert( $(this).html() ); }) $("ul li:eq(1)").empty(); // 找到第二个<li>元素节点后,清空此元素里的内容 var $li = $("ul li:eq(1)").remove(); // 获取第二个<li>元素节点后,将它从网页中删除。 $li.appendTo("ul"); //把刚刚删除的节点又重新添加到ul元素里 // 对比 remove() 与detach(); var $li = $("ul li:eq(1)").detach(); // 获取第二个<li>元素节点后,将它从网页中删除。 $li.appendTo("ul"); //重新追加元素,发现之前绑定的事件还在,如果使用remove(),之前绑定的事件将失效。 }); //]]> 复制节点 <script type="text/javascript"> $(function(){ $("ul li").click(function(){ //同时复制元素中所绑定的事件 $(this).clone(true).appendTo("ul"); // 注意参数true //可以复制自己,并且他的副本也有同样功能。 }) }); </script> 替换节点 //<![CDATA[ $(function(){ $("p").replaceWith("<strong>你最不喜欢的水果是?</strong>"); // 同样的实现: $("<strong>你最不喜欢的水果是?</strong>").replaceAll("p"); }); //]]> 包裹节点 $(function(){ $("strong").wrap("<b></b>");//用<b>元素把<strong>元素包裹起来 $("strong").wrapAll("<b></b>");//将所有匹配的元素用b元素包裹起来 $("strong").wrapInner("<b></b>");//用b包裹strong的字内容 });
实战提示效果
<style type="text/css"> body{ margin:0; padding:40px; background:#fff; font:80% Arial, Helvetica, sans-serif; color:#555; line-height:180%; } p{ clear:both; margin:0; padding:.5em 0; } /* tooltip */ #tooltip{ position:absolute; border:1px solid #333; background:#f7f5d1; padding:1px; color:#333; display:none; } </style> <script type="text/javascript"> //<![CDATA[ $(function(){ var x = 10; var y = 20; $("a.tooltip").mouseover(function(e){ this.myTitle = this.title; this.title = ""; var tooltip = "<div id='tooltip'>"+ this.myTitle +"<\/div>"; //创建 div 元素 $("body").append(tooltip); //把它追加到文档中 $("#tooltip") .css({ "top": (e.pageY + y) + "px", "left": (e.pageX + x) + "px" }).show("fast"); //设置x坐标和y坐标,并且显示 }).mouseout(function(){ this.title = this.myTitle; $("#tooltip").remove(); //移除 }); }); //]]> </script> </head> <body> </body>
jQuery中的事件与动画
事件绑定 <script type="text/javascript"> $(function(){ $("#panel h5.head").mouseover(function(){ $(this).next().show(); }).mouseout(function(){ $(this).next().hide(); }) }) $(function(){ $("#panel h5.head").bind("click",function(){ var $content = $(this).next(); if($content.is(":visible")){ $content.hide(); }else{ $content.show(); } }) }) </script> 合成事件 jQuery有两个合成事件-----hover()方法和toggle()方法。 <script type="text/javascript"> $(function(){ $("#panel h5.head").toggle(function(){ $(this).addClass("highlight"); $(this).next().show(); },function(){ $(this).removeClass("highlight"); $(this).next().hide(); }); }) </script> 事件冒泡 // 为span元素绑定click事件 $('span').bind("click",function(event){//event:事件对象 var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>"; $('#msg').html(txt); event.stopPropagation(); // 阻止事件冒泡=return false }); $("#sub").bind("click",function(event){ var username = $("#username").val(); //获取元素的值 if(username==""){ //判断值是否为空 $("#msg").html("<p>文本框的值不能为空.</p>"); //提示信息 event.preventDefault(); //阻止默认行为 ( 表单提交 )=可以return false } }) 事件对象的属性 <script> $(function(){ $("a[href='http://google.com']").click(function(event) { alert(event.type);//获取事件类型 alert("Current mouse position: " + event.pageX + ", " + event.pageY );//获取鼠标当前相对于页面的坐标 alert(event.which) // 1 = 鼠标左键 ; 2 = 鼠标中键; 3 = 鼠标右键 var tg = event.target; //获取事件对象 alert( tg.href ) ; return false;//阻止链接跳转 }); }) </script> 移除事件 <script type="text/javascript"> $(function(){ $('#btn').bind("click", function(){ $('#test').append("<p>我的绑定函数1</p>"); }).bind("click", function(){ $('#test').append("<p>我的绑定函数2</p>"); }).bind("click", function(){ $('#test').append("<p>我的绑定函数3</p>"); }); $('#delAll').click(function(){ $('#btn').unbind("click");//移除按钮元素上以前注册的事件 }); }) </script> <script type="text/javascript"> $(function(){ $('#btn').bind("click", myFun1 = function(){ $('#test').append("<p>我的绑定函数1</p>"); }).bind("click", myFun2 = function(){ $('#test').append("<p>我的绑定函数2</p>"); }).bind("click", myFun3 = function(){ $('#test').append("<p>我的绑定函数3</p>"); }); $('#delTwo').click(function(){ $('#btn').unbind("click",myFun2);//移除指定的事件 }); }) </script>
jQuery 中的动画
.stop()方法会结束当前正在进行的动画,并立即执行队列中的下一个动画。 <script type="text/javascript"> $(function(){ $("#panel").hover(function() { $(this).stop() .animate({height : "150" } , 200 ) .animate({width : "300" } , 300 )//组合动画 },function() { $(this).stop() .animate({height : "22" } , 200 ) .animate({width : "60" } , 300 ) }); }); </script> $(function(){ $("button:eq(0)").click(function () { $("#panel") .animate({height : "150" } , 1000 ) .animate({width : "300" } , 1000 ) .hide(2000) .animate({height : "show" , width : "show" , opacity : "show" } , 1000 ) .animate({height : "500"} , 1000 ); }); $("button:eq(1)").click(function () { $("#panel").stop();//停止当前动画,继续下一个动画 }); $("button:eq(2)").click(function () { $("#panel").stop(true);//清除元素的所有动画 }); $("button:eq(3)").click(function () { $("#panel").stop(false,true);//让当前动画直接到达末状态 ,继续下一个动画 }); $("button:eq(4)").click(function () { $("#panel").stop(true,true);//清除元素的所有动画,让当前动画直接到达末状态 }); }) </script> 动画例子 <script type="text/javascript"> $(function(){ $("#panel").css("opacity", "0.5");//设置不透明度 $("#panel").click(function(){ $(this).animate({left: "400px", height:"200px" ,opacity: "1"}, 3000) .animate({top: "200px" , width :"200px"}, 3000 ,function(){ $(this).css("border","5px solid blue"); }) }); }); </script> 延迟动画 在动画执行的过程中,如果想对动画进行延迟操作,那么可以使用delay()方法。 $(function(){ $("#panel").css("opacity", "0.5");//设置不透明度 $("#panel").click(function(){ $(this).animate({left: "400px", height:"200px" ,opacity: "1"}, 3000) .delay(1000) .animate({top: "200px" , width :"200px"}, 3000 ) .delay(2000) .fadeOut("slow"); }); });
序列化元素
serialize() 因为serialize()方法作用于jQuery对象,所以不光只有表单能使用它。返回字符串。 var $data = $(":checkbox,:radio").serialize(); $.get("get1.asp", $("#form1").serialize() , function (data, textStatus){ $("#resText").html(data); // 把返回的数据添加到页面上 } ); serializeArray() 返回JSON格式的数据。 <script type="text/javascript"> $(function(){ var fields = $(":checkbox,:radio").serializeArray(); console.log(fields);// Firebug输出 $.each( fields, function(i, field){ $("#results").append(field.value + " , "); }); }) </script> param() 它是serialize()方法的核心,用来对一个数组或对象按照key/value进行序列化。 $(function(){ var obj={a:1,b:2,c:3}; var k = $.param(obj); alert(k) // 输出 a=1&b=2&c=3 })
jQuery插件的使用和写法
插件(plugin)是一种遵循一定规范的应用程序接口编写出来的程序。
网址 https://plugins.jquery.com/