有需要可先看看上一次教學 : jQuery教學(1) - GridView/Table中使用Selectors
大家可以先試試效果 :
1. Click一下Row,會把整列Highlight起來。
2. 選取Row後,按Delete按鈕會把Row FadeOut。
3. Double click 藍色的格子會動畫式把文字放大。
4. Double click 粉紅色的格子會把文字摺疊起來。
我想只有toggleClass才需要用一點點文字表達,其他的,相信只放上代碼大家都能看得懂。
toggleClass
1.用Selector+filter把整個Table的cell return,filter的意義並不是把符合的去掉,而是相反地return給jQuery API。
2.再remove所有row的的Class:currRow,確保所有Row都沒有Highlight。
3.最後才把click() event中的row加上currRow class達至選取效果。
<script type="text/javascript">
//HighLight Row after mouse click
$('#gridtable tr').filter(function () {
return $('td', this).length && !$('table', this).length
}).click(function () {
$('#gridtable tr').removeClass("currRow");
$(this).toggleClass('currRow');
});
</script>
fade
<script type="text/javascript">
//delete row
$("#del").click(function () {
var hideRows = $("#gridtable tr").hasClass("currRow");
if (hideRows == true) {
$("#gridtable tr.currRow td").fadeOut(1000);
}
});
</script>
animate & slide
<script type="text/javascript">
//animate & slide
//Only td with div inside will be select.
//title="ani" is the flag for animate.
$('#gridtable tr td div').dblclick(function () {
if ($(this).attr('title') == 'ani') {
$(this).animate({
width: "100%",
opacity: 0.4,
marginLeft: "0in",
fontSize: "50px",
borderWidth: "10px"
}, 1500);
} else {
$(this).slideToggle("slow");
}
});
</script>
大家可見其實,透過jQuery去做這些效果並不複雜。其實WordPress中的Admin頁上,或者很多Web 2.0網站上,大家都看到很多類似的效果。
完整的網頁HTML碼:
<!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>
<title>亞特蘭提斯 Net Atlantis - jQuery教學(2) - GridView/Table的slide/fade/animate效果</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
//HighLight Row after mouse click
$('#gridtable tr').filter(function () {
return $('td', this).length && !$('table', this).length
}).click(function () {
$('#gridtable tr').removeClass("currRow");
$(this).toggleClass('currRow');
});
//delete row
$("#del").click(function () {
var hideRows = $("#gridtable tr").hasClass("currRow");
if (hideRows == true) {
$("#gridtable tr.currRow td").fadeOut(1000);
}
});
//animate & slide
//Only td with div inside will be select.
//title="ani" is the flag for animate.
$('#gridtable tr td div').dblclick(function () {
if ($(this).attr('title') == 'ani') {
$(this).animate({
width: "100%",
opacity: 0.4,
marginLeft: "0in",
fontSize: "50px",
borderWidth: "10px"
}, 1500);
} else {
$(this).slideToggle("slow");
}
});
});
</script>
<style type="text/css">
body
{
font: small arial;
}
tr:first-child
{
background-color: #F5F5DC;
}
tr:first-child:hover
{
background-color: #F5F5DC;
}
tr:hover
{
background-color: #E8FFEC;
cursor: pointer;
}
td
{
border: #ccc 1px solid;
text-align: center;
width: 100px;
}
td:hover
{
background-color: #E8FFEC;
border: #666 1px solid;
width: 100px;
cursor: pointer;
}
.currRow
{
background-color: #F0BD00;
cursor: pointer;
}
</style>
</head>
<body>
<table id="gridtable">
<tr>
<th>Product id</th><th>Console Name</th><th>Colour</th>
</tr>
<tr>
<td><div title="ani" style="background-color:#ADD8E6">1</div></td><td>Play Station 3</td><td>Black</td>
</tr>
<tr>
<td>4 </td><td>Xbox 360</td><td><div title="ani" style="background-color:#ADD8E6">White</div></td>
</tr>
<tr>
<td>11 </td><td><div title="slide" style="background-color:#FFB6C1">NDSL</div></td><td>Red</td>
</tr>
<tr>
<td>18</td><td>PSP</td><td><div title="slide" style="background-color:#FFB6C1">Silver</div></td>
</tr>
<tr>
<td>26</td><td><div title="ani" style="background-color:#ADD8E6">Wii</div></td><td>White</td>
</tr>
</table>
<button id="del" type="button">Delete Selected Row</button>
<button id="reload" type="button" onclick="window.location.reload()">Reload Table</button>
</body>
</html>
張大大:
回覆刪除小弟剛學Jquery而已,所以看的有些吃力。
本篇的這一行,看不懂,可以再說明一下嗎?
$('#gridtable tr').filter(function() {
return $('td', this).length && !$('table', this).length
}).click(function() {
$('#gridtable tr').removeClass("currRow");
$(this).toggleClass('currRow');
});
Q1:filter 是將tr元素中的某一些class取出對嗎?
Q2:return 的用法是指$('td', this).length && !$('table', this).length的回傳值嗎?
Q3: 一般$(selectors);中的selectors不都是單一值嗎? $('td', this) 這個是什麼意思呢?
Q4: 那$('td', this).length && !$('table', this).length 這是表示 td,this的個數 且不等於 table,this的個數嗎? 看不懂,用猜的,sorry
Q5:接著click(function() {.....這段,可以看出前面retrun出來的應該是一個個的tr,所以Q4的推論好像不對了,愈來愈不明....
請多指導了,感謝您!
Re:Mitchell Hu
回覆刪除Q1.代碼中, Filter的意思是取出td的collection.
Q2.這是jQuery中的inline function, return用純粹用作回存filter後的td
Q3. javascript中的Selector不是單一值,例如Javascript中GetElementsByName或GetElementByTagName就已經是collection,而jQuery中的selector亦是同一道理.
$(’td’, this),this 意思是Table中的tr, 所以整句可以理解為"Table中的tr的td".
Q4,Q5.意思是這樣,但這是用作合乎條件以回存td
其實我這個例子對初學者而言或者是比較難明,我個人推薦可以參考官網的例子,再回來看看我的,就會明白.
http://docs.jquery.com/Traversing/filter
謝謝網主的分享,請問一下如果想click的時候變成選取1整 colomn 而不是 row 的話,可以怎樣做呢?
回覆刪除