$("#box").change(function () {
//此时获取的已经是change后的值了
if($(this).prop("checked")){//如果全选按钮已经被选中
$(".sub").prop("checked",this.checked);
}else{//如果全选按钮未被选中
$(".sub").prop("checked",false);
}
});
#box是全选按钮(它也是个复选框),.sub是底下各个条目的复选框。用的是jq的.prop()方法。
刚才同学做全选功能,出了问题,来问我。我拿到代码试了试,点击全选按钮,然后获取并判断它的checked值,结果没反应。
然后去调试,发现发现获取到的复选框(checkbox)的checked值始终是undefined,选中了也不变。这还怎么做?
难道要把复选框放到form标签里才行?或者是需要手动加上checked这个属性?都试了试,完全没用
想想两年前还在学校的时候,就做过全选和反选这样的功能,怎么现在就做不出来了呢?这个郁闷啊
于是去百度“jq怎么获取checked值”,百度出来的各个教程的方法和我一样啊,怎么人家能用我就不能用?
最后直接百度“checkbox checked undefined”,总算找到答案了。
原来,在jquery1.6版本有了变更:
checked属性在页面初始化的时候已经初始化好了,不会随着状态的改变而改变。
也就是说如果checkbox在页面加载完毕时是选中的,那么返回的永远都是checked,如果一开始没被选中,则返回的永远是undefined。
然后怎么办呢, 用jq的.prop()方法。例子就是上边的代码了。
真想说过期信息害死人,以后搜索技术问题的时候最好去搜索选项里,把结果限制在最近一年之内。
比较简单的一个小玩意,昨天做的网站里需要这个类似的功能,于是改了下单独发出来。 代码如下:
<div id="wrap">
<a href="">hug_(artist)</a><a href="">single_shoe</a><a href="">豊聡耳神子</a><a href="">東方 東方project 東方プロジェクト touhou Touhou 东方 东方project</a><a href="">百合 レズ</a><a href="">碧眼</a><a href="">青髪 青い髪 水色髪</a><a href="">髪飾り</a><a href="">花 はな フラワー</a><a href="">short_sleeves</a><a href="">short_sleeves</a><a href="">御札</a>
</div>
<style>
#wrap{width: 900px;}
#wrap a{display: inline-block; padding: 0 10px;margin:0 8px 8px 0;font-family: "Microsoft YaHei";font-size: 13px;color: #fff;line-height: 26px;text-decoration: none;border-radius: 2px;}
#wrap a:hover{opacity: 0.8;transition:all .3s;}
</style>
<script>
function setbg (id,allColor) {//参数为容器id和颜色数组
var alla=document.getElementById("wrap").getElementsByTagName("a");
/*如果展示的区域太窄,可以截取字数以控制a标签的长度,以确保一行最少能有2个或几个
for (var i = 0; i < alla.length; i++) {
if(alla[i].innerHTML.length>8){
alla[i].innerHTML=alla[i].innerHTML.substr(0,7);
}
};
*/
//设置背景颜色
var allcolor=allColor;
usedColor=null; //上次用到的颜色
nowColor=null;//当前随机到的颜色
allaBgIndex=0;//给a标签设置背景颜色时,a的索引数字
bgindex = Math.floor((Math.random()*allcolor.length));
usedColor=allcolor[bgindex]; //先随机一个颜色设置为用过的颜色
for (var i = 0; i < 999; i++) {
bgindex = Math.floor((Math.random()*allcolor.length));
nowColor=allcolor[bgindex]; //随机一个颜色
if (usedColor!=nowColor) { //如果当前颜色和上一个用过的颜色不同,则设置背景色
alla[allaBgIndex].style.backgroundColor=nowColor;
usedColor=nowColor;//把这次用的颜色设置为上次用到的
allaBgIndex++;
if (allaBgIndex==alla.length) {//如果a标签已经全部设置了背景颜色
break;
};
};
};
};
setbg ("wrap",["#448EEF","#E95555","#1369C0","#1AB4C1","#F49129","#2C9F42"]);
</script>
主要的功能就是设置相邻的a标签的背景色不重复了,样式上没有什么难度。
注释里有个蛋疼的截取字数的功能,那是昨天在做网站时弄的。当时的展示区域非常小,宽度只有270多px,但是调取的还是文章标题,都不算短。要求一行最少有两个a标签,只好截取了。截取的缺点就是肯定有一些标签宽度是一样的,这显得很死板,展示区域越窄越明显。
display: inline-block;如果相邻的两个元素不对齐,可以使用vertical-align: top;
现在排版的网站中有一个地方,指示器的位置需要变化,我用jQuery做了动画,把这个指示器设置为背景图,然后使用backgroundPosition属性来使其移动。
可是今天测试兼容性的时候发现在火狐下这个动画无效。百度一番,找到了解决办法。参见此处
解决这个问题之前(火狐中无效)的动画代码如下:
$("#anlilist").animate({
backgroundPositionX:bgLeft+"px",
backgroundPositionY:"0px"
},100);
这时候X和Y值要分别定义,否则chrome中是无效的。
要解决火狐中无效的问题,先在动画的代码之前加入以下代码:
/**
* 自定义backgroundPosition的animate,支持火狐,jQuery1.8以上版本
* @author Meleong
* v1.00
*/
(function($) {
$.fx.step["backgroundPosition"] = function(fx) {
if (typeof fx.end == 'string') {
fx.start = getBgPos(fx.elem);
//fx.end原本是一个string,这里将它转换成数组,就不会再进入这个if,也方便我们下面的计算
//例 "0px -21px"
fx.end = [parseFloat(fx.end.split(" ")[0]), parseFloat(fx.end.split(" ")[1])];
}
//这里fx.pos是根据传入的时间参数,从0到1变化的浮点数
var nowPosX = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit;
var nowPosY = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit;
fx.elem.style.backgroundPosition = nowPosX + ' ' + nowPosY;
/**
* 获取backgroundPosition数组[top, left],没有单位
*/
function getBgPos(elem) {
var top = 0.0;
var left = 0.0;
if ($(elem).css("backgroundPosition")) {
//例 "0px -21px"
top = parseFloat($(elem).css("backgroundPosition").split(" ")[0]);
left = parseFloat($(elem).css("backgroundPosition").split(" ")[1]);
}else{
top = parseFloat($(elem).css("backgroundPositionX"));
left = parseFloat($(elem).css("backgroundPositionY"));
}
return [top, left];
}
}
})(jQuery);
然后改一下动画的代码,把X和Y的值写在一起就行了。
$("#anlilist").animate({
backgroundPosition: bgLeft.toString()+"px 0px"
},100);
这样写一起chrome里也是能用的,分开写chrome里反而无效了。此时,IE、chrome、firefox三大浏览器里都可以正常实现动画效果了。
百度了一些tooltip插件,后来感觉bootstrap的这个tooltip插件比较顺眼,于是鼓捣一番,会简单的使用了。
上例的代码如下:
<script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script>
<script src="/f/bootstrap-tooltip.js"></script>
<link rel="stylesheet" href="/f/bootstrap_tooltip.css"/>
<script>
$(function () { $("[data-toggle='tooltip']").tooltip(); }); //启用页面中的所有的工具提示(tooltip)
</script>
<img src="/f/穹妹%20小图.jpg" alt="" data-toggle="tooltip" data-placement="bottom" title="不要羡慕我的床"/>
<br /><br />
<a href="saber.我爱你" data-toggle="tooltip" title="这是一个hentai网站">saber酱的抱枕</a>
<br /><br />
<span data-toggle="tooltip" data-placement="right" title="原来saber是我的剑鞘啊~">最爱saber啦~</span>
<br /><br />
<div data-toggle="tooltip" title="练习~练习~">练习~练习~</div>
原理是触发时添加html元素和class类,提示的样式是css实现的,无需图片,所以我们只需要处理代码就行了。
Read More →
代码如下:
html{
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: grayscale(100%);
filter: gray;
}
chrome下效果完美,火狐中body的背景图片没有变灰,IE11中完全无效。对于IE应该可以兼容到IE9。
我花了半个多小时,测试了各种方法,除了各种css外,还找过用js创建canvas的代码,或是使用某jq插件,最后也没成功实现全浏览器通吃。css的方法最简单,不过兼容性不怎么让人满意。
chrome是使用了-webkit-filter: grayscale(100%)这一项,火狐中生效的是filter:grayscale(100%)。
IE10和IE11在图像滤镜方面还是比较坑爹的,不能执行filter滤镜,而且连svg滤镜也不支持。
使用chrome的话可以玩玩下面这个小玩意:
可以重复点哦。
代码如下:
<button id="setGray">设置网页的灰度</button>
<script>
$("#setGray").click(
function setGray () {
var grayCss="-webkit-filter: grayscale(100%);-moz-filter: grayscale(100%);-ms-filter: grayscale(100%);-o-filter: grayscale(100%); filter: grayscale(100%);";
var num=prompt("请输入您希望的灰度(正整数)","");
if (num!=100) {
grayCss=grayCss.replace(/100/g, num);
};
$("html").attr("style",grayCss);
}
)
</script>
以上真是蛋疼之作,不知道会有地方用到不。
今天想到了验证码倒计时的效果,于是做了一个出来。
发现定时器里面写函数名的话,如果带了括号,函数会瞬间执行多次。
代码如下:
<form action="">
<input type="text"> <input type="button" id="getyzm" value="获取验证码">
</form>
<script>
function yzmdjs (id,time) {
var getyzm=document.getElementById(id);
var getyzmYuan=getyzm.value;
getyzm.setAttribute("disabled","disabled");
time=time;
getyzm.value=time+"秒后可重新获取验证码";
daojishiT=setTimeout(daojishi(),1000);
function daojishi () {
//console.log(time);
time--;
getyzm.value=time+"秒后可重新获取验证码";
if (time==0) {
getyzm.value=getyzmYuan;
getyzm.removeAttribute("disabled");
}else{
daojishiT=setTimeout(daojishi,1000);
};
}
}
document.getElementById("getyzm").onclick=function (argument) {
//添加发送验证码的操作
yzmdjs(this.id,10);
}
</script>
刚才有个同学问了个问题,div里面有个超链接,但点击div时中的其他地方时,也有事件。这样如果点击超链接了,会同时触发“页面跳转”和“div上的事件”这两个事件。我们当然希望这两个事件互不影响。
后来我想到以前看过用js获取当前焦点元素的办法,找了出来,写了个demo,成功了。用的是document.activeElement属性。
原理就是div上发生onclick事件时,判断是不是里面的a标签获得了焦点。如果不是,则触发div上的事件。
demo如下:
<div id="a" style="border:1px solid #f00;width:300px;height:100px;">
<a href="bbbbb" id="b" target="_blank">bbbbbbb</a>
</div>
<script>
document.getElementById("a").onclick =function (argument) {
if(document.activeElement!=document.getElementById("b")){
window.open("aaaaa");
};
}
</script>
经过试验发现,div是获取不到焦点的。简单的说,table不到div。如果点击div,获取焦点的是body元素。
之前我们想过做定位,让div和超链接处在不同的z-index上,经过试验,没用。但今天想到的有个思路看情况是可以选择使用的:
首先给内部元素设置一个属性,默认为false。当鼠标经过内部元素时,变为true。这样就可以判断点击发生时,点击区域是不是在内部元素上了。
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.8.1/jquery.min.js"></script>
<script src="/f/jquery-sakura.min.js"></script>
<link type="text/css" rel="stylesheet" media="screen" href="/f/jquery-sakura.min.css" />
<script>
// domReady
$(function() {
$('body').sakura();
});
// windowLoad
$(window).load(function() {
$('body').sakura();
});
</script>
转自离别歌,十几岁已经完爆我了。
页面太长的话可能会导致有点卡顿。jq版本不知有无影响。
之前发了个《js左右切换展示的效果》,作用是在小区域内展示内容并且可以左右来回切换。放在大区域用就不合适了,于是改大之后加上了指示器,加上了指示器跳转,加上了自动播放,改到最后改成了banner……很无语,单独放出来吧。
代码也很简单,需要修改功能的话也不难。