Web前端的35个jQuery小技巧
发布时间:2016-05-26, 14:35:13 分类:HTML | 编辑 off 网址 | 辅助
正文 12035字数 350,311阅读
1. 禁止右键点击$(document).ready(function(){
$(document).bind("contextmenu",function(e){
return false;
});
});
Run code
Cut to clipboard
2. 隐藏搜索文本框文字
Hide when clicked in the search field, the value.(example can be found below in the comment fields)
$(document).ready(function() {
$("input.text1").val("Enter your search text here");
textFill($('input.text1'));
});
function textFill(input){ //input focus text function
var originalvalue = input.val();
input.focus( function(){
if( $.trim(input.val()) == originalvalue ){ input.val(''); }
});
input.blur( function(){
if( $.trim(input.val()) == '' ){ input.val(originalvalue); }
});
}
Run code
Cut to clipboard
3. 在新窗口中打开链接
XHTML 1.0 Strict doesn’t allow this attribute in the code, so use this to keep the code valid.
$(document).ready(function() {
//Example 1: Every link will open in a new window
$('a[href^="http://"]').attr("target", "_blank");
//Example 2: Links with the rel="external" attribute will only open in a new window
$('a[@rel$='external']').click(function(){
this.target = "_blank";
});
});
// how to use
<a href="http://www.opensourcehunter.com" rel=external>open link</a>
Run code
Cut to clipboard
4. 检测浏览器
注: 在版本jQuery 1.4中,$.support 替换掉了$.browser 变量
$(document).ready(function() {
// Target Firefox 2 and above
if ($.browser.mozilla && $.browser.version >= "1.8" ){
// do something
}
// Target Safari
if( $.browser.safari ){
// do something
}
// Target Chrome
if( $.browser.chrome){
// do something
}
// Target Camino
if( $.browser.camino){
// do something
}
// Target Opera
if( $.browser.opera){
// do something
}
// Target IE6 and below
if ($.browser.msie && $.browser.version <= 6 ){
// do something
}
// Target anything above IE6
if ($.browser.msie && $.browser.version > 6){
// do something
}
});
Run code
Cut to clipboard
5. 预加载图片
This piece of code will prevent the loading of all images, which can be useful if you have a site with lots of images.
$(document).ready(function() {
jQuery.preloadImages = function()
{
for(var i = 0; i<ARGUMENTS.LENGTH; jQuery(?<img { i++)>").attr("src", arguments[i]);
}
}
// how to use
$.preloadImages("image1.jpg");
});
Run code
Cut to clipboard
6. 页面样式切换
$(document).ready(function() {
$("a.Styleswitcher").click(function() {
//swicth the LINK REL attribute with the value in A REL attribute
$('link[rel=stylesheet]').attr('href' , $(this).attr('rel'));
});
// how to use
// place this in your header
<LINK rel=stylesheet type=text/css href="default.css">
// the links
<A href="#" rel=default.css>Default Theme</A>
<A href="#" rel=red.css>Red Theme</A>
<A href="#" rel=blue.css>Blue Theme</A>
});
Run code
Cut to clipboard
7. 列高度相同
如果使用了两个CSS列,使用此种方式可以是两列的高度相同。
$(document).ready(function() {
function equalHeight(group) {
tallest = 0;
group.each(function() {
thisHeight = $(this).height();
if(thisHeight > tallest) {
tallest = thisHeight;
}
});
group.height(tallest);
}
// how to use
$(document).ready(function() {
equalHeight($(".left"));
equalHeight($(".right"));
});
});
Run code
Cut to clipboard
8. 动态控制页面字体大小,用户可以改变页面字体大小
$(document).ready(function() {
// Reset the font size(back to default)
var originalFontSize = $('html').css('font-size');
$(".resetFont").click(function(){
$('html').css('font-size', originalFontSize);
});
// Increase the font size(bigger font0
$(".increaseFont").click(function(){
var currentFontSize = $('html').css('font-size');
var currentFontSizeNum = parseFloat(currentFontSize, 10);
var newFontSize = currentFontSizeNum*1.2;
$('html').css('font-size', newFontSize);
return false;
});
// Decrease the font size(smaller font)
$(".decreaseFont").click(function(){
var currentFontSize = $('html').css('font-size');
var currentFontSizeNum = parseFloat(currentFontSize, 10);
var newFontSize = currentFontSizeNum*0.8;
$('html').css('font-size', newFontSize);
return false;
});
});
Run code
Cut to clipboard
9. 返回页面顶部功能
For a smooth(animated) ride back to the top(or any location).
$(document).ready(function() {
$('a[href*=#]').click(function() {
if (location.pathname.replace(/^//,'') == this.pathname.replace(/^//,'')
&& location.hostname == this.hostname) {
var $target = $(this.hash);
$target = $target.length && $target
|| $('[name=' + this.hash.slice(1) +']');
if ($target.length) {
var targetOffset = $target.offset().top;
$('html,body')
.animate({scrollTop: targetOffset}, 900);
return false;
}
}
});
// how to use
// place this where you want to scroll to
<A name=top></A>
// the link
<A href="#top">go to top</A>
});
Run code
Cut to clipboard
10. 获得鼠标指针XY值
Want to know where your mouse cursor is?
$(document).ready(function() {
$().mousemove(function(e){
//display the x and y axis values inside the div with the id XY
$('#XY').html("X Axis : " + e.pageX + " | Y Axis " + e.pageY);
});
// how to use
<DIV id=XY></DIV>
});
Run code
Cut to clipboard
11.返回顶部按钮
你可以利用 animate 和 scrollTop 来实现返回顶部的动画,而不需要使用其他插件。
// Back to top
$('a.top').click(function () {
$(document.body).animate({scrollTop: 0}, 800);
return false;
});
<!-- Create an anchor tag -->
<a href="#">Back to top</a>
Run code
Cut to clipboard
改变 scrollTop 的值可以调整返回距离顶部的距离,而 animate 的第二个参数是执行返回动作需要的时间(单位:毫秒)。
12.预加载图片
如果你的页面中使用了很多不可见的图片(如:hover 显示),你可能需要预加载它们:
$.preloadImages = function () {
for (var i = 0; i < arguments.length; i++) {
$('<img>').attr('src', arguments[i]);
}
};
$.preloadImages('img/hover1.png', 'img/hover2.png');
Run code
Cut to clipboard
13.检查图片是否加载完成
有时候你需要确保图片完成加载完成以便执行后面的操作:
$('img').load(function () {
console.log('image load successful');
});
Run code
Cut to clipboard
你可以把 img 替换为其他的 ID 或者 class 来检查指定图片是否加载完成。
14.自动修改破损图像
如果你碰巧在你的网站上发现了破碎的图像链接,你可以用一个不易被替换的图像来代替它们。添加这个简单的代码可以节省很多麻烦:
$('img').on('error', function () {
$(this).prop('src', 'img/broken.png');
});
Run code
Cut to clipboard
即使你的网站没有破碎的图像链接,添加这段代码也没有任何害处。
15.鼠标悬停(hover)切换 class 属性
假如当用户鼠标悬停在一个可点击的元素上时,你希望改变其效果,下面这段代码可以在其悬停在元素上时添加 class 属性,当用户鼠标离开时,则自动取消该 class 属性:
$('.btn').hover(function () {
$(this).addClass('hover');
}, function () {
$(this).removeClass('hover');
});
Run code
Cut to clipboard
你只需要添加必要的CSS代码即可。如果你想要更简洁的代码,可以使用 toggleClass 方法:
$('.btn').hover(function () {
$(this).toggleClass('hover');
});
Run code
Cut to clipboard
注:直接使用CSS实现该效果可能是更好的解决方案,但你仍然有必要知道该方法。
16.禁用 input 字段
有时你可能需要禁用表单的 submit 按钮或者某个 input 字段,直到用户执行了某些操作(例如,检查“已阅读条款”复选框)。可以添加 disabled 属性,直到你想启用它时:
$('input[type="submit"]').prop('disabled', true);
Run code
Cut to clipboard
你要做的就是执行 removeAttr 方法,并把要移除的属性作为参数传入:
$('input[type="submit"]').removeAttr('disabled');
Run code
Cut to clipboard
17.阻止链接加载
有时你不希望链接到某个页面或者重新加载它,你可能希望它来做一些其他事情或者触发一些其他脚本,你可以这么做:
$('a.no-link').click(function (e) {
e.preventDefault();
});
Run code
Cut to clipboard
18.切换 fade/slide
fade 和 slide 是我们在 jQuery 中经常使用的动画效果,它们可以使元素显示效果更好。但是如果你希望元素显示时使用第一种效果,而消失时使用第二种效果,则可以这么做:
// Fade
$('.btn').click(function () {
$('.element').fadeToggle('slow');
});
// Toggle
$('.btn').click(function () {
$('.element').slideToggle('slow');
});
Run code
Cut to clipboard
19.简单的手风琴效果
这是一个实现手风琴效果快速简单的方法:
// Close all panels
$('#accordion').find('.content').hide();
// Accordion
$('#accordion').find('.accordion-header').click(function () {
var next = $(this).next();
next.slideToggle('fast');
$('.content').not(next).slideUp('fast');
return false;
});
Run code
Cut to clipboard
20.让两个 DIV 高度相同
有时你需要让两个 div 高度相同,而不管它们里面的内容多少。可以使用下面的代码片段:
var $columns = $('.column');
var height = 0;
$columns.each(function () {
if ($(this).height() > height) {
height = $(this).height();
}
});
$columns.height(height);
Run code
Cut to clipboard
这段代码会循环一组元素,并设置它们的高度为元素中的最大高。
21. 验证元素是否为空
This will allow you to check if an element is empty.
$(document).ready(function() {
if ($('#id').html()) {
// do something
}
});
Run code
Cut to clipboard
22. 替换元素
$(document).ready(function() {
$('#id').replaceWith('
<DIV>I have been replaced</DIV>
');
});
Run code
Cut to clipboard
23. jQuery延时加载功能
$(document).ready(function() {
window.setTimeout(function() {
// do something
}, 1000);
});
Run code
Cut to clipboard
24. 移除单词功能
$(document).ready(function() {
var el = $('#id');
el.html(el.html().replace(/word/ig, ""));
});
Run code
Cut to clipboard
25. 验证元素是否存在于jquery对象集合中
$(document).ready(function() {
if ($('#id').length) {
// do something
}
});
Run code
Cut to clipboard
26. 使整个DIV可点击
$(document).ready(function() {
$("div").click(function(){
//get the url from href attribute and launch the url
window.location=$(this).find("a").attr("href"); return false;
});
// how to use
<DIV><A href="index.html">home</A></DIV>
});
Run code
Cut to clipboard
27. ID与Class之间转换
当改变Window大小时,在ID与Class之间切换
$(document).ready(function() {
function checkWindowSize() {
if ( $(window).width() > 1200 ) {
$('body').addClass('large');
}
else {
$('body').removeClass('large');
}
}
$(window).resize(checkWindowSize);
});
Run code
Cut to clipboard
28. 克隆对象
$(document).ready(function() {
var cloned = $('#id').clone();
// how to use
<DIV id=id></DIV>
});
Run code
Cut to clipboard
29. 使元素居屏幕中间位置
$(document).ready(function() {
jQuery.fn.center = function () {
this.css("position","absolute");
this.css("top", ( $(window).height() - this.height() ) / 2+$(window).scrollTop() + "px");
this.css("left", ( $(window).width() - this.width() ) / 2+$(window).scrollLeft() + "px");
return this;
}
$("#id").center();
});
Run code
Cut to clipboard
30. 写自己的选择器
$(document).ready(function() {
$.extend($.expr[':'], {
moreThen1000px: function(a) {
return $(a).width() > 1000;
}
});
$('.box:moreThen1000px').click(function() {
// creating a simple js alert box
alert('The element that you have clicked is over 1000 pixels wide');
});
});
Run code
Cut to clipboard
31. 统计元素个数
$(document).ready(function() {
$("p").size();
});
Run code
Cut to clipboard
32. 使用自己的 Bullets
$(document).ready(function() {
$("ul").addClass("Replaced");
$("ul > li").prepend("‒ ");
// how to use
ul.Replaced { list-style : none; }
});
Run code
Cut to clipboard
33. 引用Google主机上的Jquery类库(谷歌用不了,可以用百度CDN)
//Example 1
<SCRIPT src="http://www.google.com/jsapi"></SCRIPT>
<SCRIPT type=text/javascript>
google.load("jquery", "1.2.6");
google.setOnLoadCallback(function() {
// do something
});
</SCRIPT><SCRIPT type=text/javascript src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></SCRIPT>
// Example 2:(the best and fastest way)
<SCRIPT type=text/javascript src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></SCRIPT>
Run code
Cut to clipboard
34. 禁用Jquery(动画)效果
$(document).ready(function() {
jQuery.fx.off = true;
});
Run code
Cut to clipboard
35. 与其他Javascript类库冲突解决方案
$(document).ready(function() {
var $jq = jQuery.noConflict();
$jq('#id').show();
});
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 4 条评论 »
使用Ajax
使用Ajax的步骤主要有:创建Ajax对象,Ajax对象打开连接,Ajax对象发送数据,Ajax获得响应。
1. 创建Ajax对象
不同的浏览器有着不同的创建方法,因此我们需要封装一个创建Ajax对象的方法,大部分标准浏览器都支持原生的XMLHttpRequest对象,因此我们首先检测是否存在XHR对象方法,存在则直接调用,否则我们定义一个XMLHttpRequest方法。
[javascript] view plaincopy
//自运行函数,用于创建XMLHttpRequest方法
(function() {
//存在原生的XHR,直接返回
if( typeof XMLHttpRequst !== 'undefined') {
return;
} else if( typeof ActiveXObject !== 'undefined') {//否则判断ActiveXObject
XMLHttpRequest = function() {
if( typeof arguments.callee.activeXString !== 'string') {
var versions = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
for(var i = 0, len = versions.length; i < len; ++i) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
} catch(ex) {
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
} else{
XMLHttpRequest = function(){
throw new Error('No XHR object available');
};
}
})();
2. 打开连接
通过第1步的代码,我们可以首先创建一个AJAX对象: var xhr = new XMLHttpRequest(); 接着打开连接xml.open("GET", "/some/url.cgi", true);
当然,我们通过后台异步的发送请求,自然先要对请求参数进行序列化,以下是一个序列化函数:
[javascript] view plaincopy
//表单数据序列化,支持两种不同的对象:
//-表单输入元素的数组
//-键/值对的散列表
//返回串行化后的字符串
var serialize = function(a){
var s = [];
if(a instanceof Array){
for (var i=0, len = a.length; i<len; ++i) {
s.push(a[i].name + '=' + encodeURIComponent(a[i].value));
};
} else{
for(var k in a){
s.push(k + '=' + encodeURIComponent(a[k]));
}
}
return s.join('&');
};
3.发送请求
发送GET请求则可以按如下步骤:
[javascript] view plaincopy
<pre name="code" class="javascript"><pre name="code" class="javascript">var xhr = new XMLHttpRequest();
xhr.open('GET', "/some/url.cgi?"+serialize(data), true);
xhr.send(null); //参数null对某些浏览器来说是必须的
发送POST的请求则需要先设置请求头的MIME类型,通常是application/x-www-form-urlencoded, 一个简单的示例如下:
[javascript] view plaincopy
<pre name="code" class="javascript" style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; background-color: rgb(240, 240, 240); ">var xhr = new XMLHttpRequest();
xhr.open('POST', "/some/url.cgi?", true);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(serialize(data));
4. 处理HTTP响应
在收到响应后,响应的数据会自动填充XHR对象的属性:
responseText:作为响应主体被返回的文本
respinseXML: 如果响应的内容类型是"text/xml"或"application/xml",这个属性将保存包含着响应数据的XML DOM文档
status: 响应的HTTP状态
statusText:HTTP状态的说明
在接到响应后,第一步是检查status属性,以确定响应已经成功返回。一般来说,可以将HTTP状态代码为200作为成功标志,此外状态码304表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本,因此应该检测这两种属性。
当收到响应时,可以检测XHR对象的readyState属性,该属性表示请求/响应过程中的当前活动状态,且当readyState属性的值由一个变成另一个时,会触发一次readyStatechange事件,可以利用这个事件来检测每次状态变化后的readyState的值。 readyState的值有以下几种:
0:未初始化。尚未调用open()方法。
1:启动。已经调用open()方法,但尚未调用send()方法。
2:发送。已经调用send()方法,但尚未收到响应。
3:接收。已经接收到部分响应数据。
4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
另外,在IE8中,还为XHR对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止,在给timeout设置一个数值后,如果在规定时间内浏览器还未收到响应,那么会触发一个timeout事件,进而会调用ontimeout事件处理程序。当然为了保持跨浏览器的运行,我们可以自行模拟一个超时响应。
有了以上的介绍,我们则可以开发出一个完整的ajax包,包括了错误处理,超时处理等功能。代码如下:
[javascript] view plaincopy
//一个封装好的ajax对象
var ajax = {};
//检查服务器HTTP响应的成功状态
ajax.httpSuccess = function(xhr){
return xhr.status >= 200 && xhr.status < 300 || xhr.status == 304;
};
//发起一个ajax请求,opt为传入的设置参数对象
ajax.request = function(opt){
//如果没有提供某个选项的值,就用默认值代替
opt = {
//请求方法
method: opt.method || "POST",
//请求的URL
url:opt.url || "",
//请求超时的时间
timeout: opt.timeout || 5000,
//请求失败、成功或完成(不管成功还是失败都会调用)时执行的函数
complete: opt.complete || function(){},
error: opt.error || function(){},
success: opt.success || function(){},
//发送的请求参数
params: opt.params || ""
};
var xhr = new XMLHttpRequest(), //创建xhr对象
timeout = opt.timeout,//保存超时时间,默认5秒
requestDone = false,//标志请求是否完成
params = XX.serialize(opt.params); //GET请求的话则将参数序列化接到url后面
if(params !== '' && opt.method === 'GET'){
params = '?' + params;
opt.url += params;
}
//初始化xhr
xhr.open(opt.method, opt.url, true);
//初始化一个5秒的回调函数,用于取消请求(如果尚未完成的话)
setTimeout(function(){
requestDone = true;
}, timeout);
//监听文档状态的更新
xhr.onreadystatechange = function(){
//保持等待,直到数据完全加载,并保证请求未超时
if(xhr.readyState == 4 && !requestDone){
if(XX.ajax.httpSuccess(xhr)){
//成功则调用回调函数,并传入xhr对象
opt.success(xhr, xhr.responseText)
} else {
//发生错误
opt.error();
}
//调用完成回调函数
opt.complete();
//避免内存泄漏,清理文档
xhr = null;
}
};
if(opt.method === 'POST'){
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params); //若为POST请求,则需序列化数据
} else{
xhr.send(null);
}
};
软件工程规定写代码的原则是“高内聚,低耦合”。内聚是代码块间的独立性,耦合是各个代码块间的联系。
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。
代码内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
高内聚,低耦合的系统有什么好处呢?事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。长期来看,低耦合的模块便于进行单元测试,且便于维护。
举例:
在java中,你想在你的程序中调用某个类比如说是A1,如果你在程序中直接new A1(),这样就写死了。如过下次业务逻辑有变化,你就必须重新修改A1类的代码。在这种情况下,如果A1类被其他的程序调用,你修改了A1类的代码,可能会对其他程序造成影响。
但是如果你在配置文件里配置你要用到的类的相关属性,通过程序动态地区获得,你只用修改这个配置文件,把他指向另一个类A2就行了。用A2替代A1。这就是低耦合,也是java的面向增加开放,面向修改关闭的原则。
手机版的抓取出来会有必应的水印,我就不介绍了。一下主要介绍一下首页抓取和XML中抓取
XML/JOSN的内容都是必应的一个接口,用哪个都是可以的,就不多说了。
XML和json的抓取很简单。
XML的抓取正则preg_match("/<url>(.+?)<\/url>/ies", $str, $matches)
如果是JSON就更简单了,直接从JSON中接收就好了
再说说直接首页的抓取吧,一样是正则抓取
首页抓取正则preg_match_all("/g_img={url:'(.*)'/U",$d,$img)
然后,后面你要干什么自己想吧!
额,忘了说几个被抓取得页面了
首页抓取,就直接打开首页即 cn.bing.com
XML文档地址
http://cn.bing.com/HPImageArchive.aspx?idx=0&n=1
JSON地址
http://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
好了,就这么写,不过速度我真不知道哪个好,自己看着办吧,反正我用着首页的,不过我是保存到数据库。不用每次都抓取,每次打开都重新抓取一遍,感觉不太友好!