六、[前端] jQuery
jQuery 簡介
Javascript 的程式庫 library。程式庫就是程式碼的倉庫,裡面有很多工具
每個程式庫都有自己擅長的事情。jQuery 擅長
- Event - click event 
 
- Traversing - 抓到節點後,可以爬到其他節點 
 
- DOM Manipulate (洞) - 把標籤變成物件,document object model 
- 變成物件,就多了很多函式可以用 
- 像是刪除、修改 
 
這三件事情怎麼綜合發生的呢?已待辦清單為例
- 點擊叉叉 
- 找到叉叉的 li 項目 
- 移除該項目 
events 事件的發生
mouse 相關
- .click()打開、關閉
- .hover()滑到導覽列文字變色
- .scroll()滾動到某個地方就縮小 logo
keyboard 相關
- kepress 完整操作 
- keydown,gmail 按 shift 多選視窗 
- keyup 
form 相關
- blur / focus / change - .focues()選中 input 時,就是 focus 專注
- .blur()跳出 focus 狀態時,就是 blur 不專注、模糊
- .change()focus 後,打了 hi,要 blur 前,就會觸發 change
- .select()word focus,文字選取反白時
 
- submit - 註冊、送出表單前,先擋下來驗證資料,正確再送出 
 
$(document).ready()
- 找 header 底下的 li,但還不存在;只要 ready 準備好再找就好 
binding
- 再解釋 event。 
- 點擊 #header, #header li 都是事件 
- 只要做了之後,有設定要做什麼事情,有 handle,就能做操作 
- 只要在目標上 binding 就好 
$('#target').bind('click', function(){
    // ... 找目標,綁事件,做功能
});
$('target').click(function() {
    // ... 要監聽什麼事件,可以直接寫
});.on()
- bind 的 target 如果不存在,就像是跟空氣進來;後來 target 進來後,還是不知道做什麼事情 
- .on() 如何解決不在場的問題? 
- 可以先找在場的人,後來目標進來的話,再跟他說 
- 綁匪先跟父母預告,我要綁你小孩喔,等你小孩回家後,記得要讓我綁 
- 什麼時候會有這種狀況? 例如,AJAX,資料可能後來才進來 
$('#header').on('click', 'li', function() {
    // ...
})events 整理
- click / hover / scroll 
- keypress / keydown / keyup 
- blur / focus / change 
- submit 
- $(document).ready() 
- bind / on 
自己另外想了解拖放 event
- 因為我的 todo list 想要能夠排序 
traversing 爬樹
html 的架構,就像是一顆樹,是一種樹狀結構,一顆倒過來的樹。traversing 就是在樹上亂跑
- body 
- #header- #posts- h1 
- p 
- p 
- #target- p 
- p 
 
- p 
 
- #sidebar
 
- content
- #footer
find / children
find 找全部下層的東西;children 只找孩子
$('#content').find('p') // 有點像 filter 
$('#posts').children()
$('#posts').children('p')parent / closest
上一層/最近的祖先
$('#target').parent()    // #posts
$('target').closest('#content')    // #contentsiblings
找同輩
$('#target').siblings()first / last / eq
可是剛剛找的方式,會回傳很多個元素,該怎麼辦?就用數字指定
$('#posts').children().first()
$('#posts').children().last()
$('#posts').children().eq(1)    // 第二個整理
- find / children 
- parent / closest 
- siblings 
- first / last / eq 
提問
- 為什麼沒提到讀取一個目標的用法 
- 像是 - document.getElementByID('target')之類的,jQuery 應該有類似的用法吧?
- 啊,還是上一小節就講了 orz 
DOM manipulate 處理網頁元素
插入系列
- 在 todo 清單底下插入新 item,就是插入的動作 
- .append()- 目標元素的最後一個孩子的後面 
 
- .prepend()- 目標元素的第一個孩子的前面 
 
- .before()- 在目標元素之前,sibling 
 
- .after()- 在目標元素之後 
 
另外一個東西
- .html()整個取代
- 如果沒有塞值進去的話,就是當讀取用 
- $('#target').html('<li>hello</li>'); // 覆蓋 var foo = $('#target').html(); // 讀取與賦值
其他
- .remove()把選到的目標移除
- .empty()把目標的內容物全部清空
- .clone()複製目標
其他
- 例如,gmail 打勾信件,會變黃 
- .addClass()加上 class
- .removeClass()移除 class
- .toggleClass()開關
其他
- .css()修改 css 內容
- $('.bar').css({ width: '20px', left: '500px', });
其他
- .prop()/- .val();property, value,用來讀取屬性的值
- <div id="header"> <ul> <li> <a href="about.html">about</a> </li> </ul> </div>
- <form action="action.php"> <input type="text" name="email" value="john@gmail.com"> <button>submit</button> </form>
- $('input').prop('value'); // 好像只有 form 裡面的 input 比較常用到 value $('input').val(); // 簡寫 $('input').prop('value', 20); // 寫入 $('input').val(20);
其他
- .data()
- 像是 gmail 在跟伺服器拿信的內容,要怎麼知道是那一封 
- 每封信有自己的編號 data-id 
- <ul> <li data-id="2028">Lorem</li> <li data-id="1720">Lorem</li> <li data-id="9728">Lorem</li> </ul>
- var result = $('ul li').eq(2).data('id'); // 抓到 9725 $('ul li').eq(2).data('id', 25); // 改成 25
DOM manipulate 整理
- append / prepend / before / after 
- html 
- remove / empty / clone 
- addClass / removeClass / clone 
- css 
- prop / val 
- data 
jQuery 整理
- event 
- traversing 
- DOM manipulating 
[練習] 極簡版 todo list
用 Codepen 練習,記得要把 JS 區塊引用 jQuery,quick add
需求
- 有 Lorem list 介面 
- 有能新增 list 的 button 
- 有能刪除 list 的 button 
自己試作的
html
<div class="container">
  <div class="lists">
    <div class="list" id="temp">
      <div class="content">Lorem</div>
      <div class="delete">x</div>
    </div>
  </div>
  <div class="clearfix"></div>
  <button class="add">+ todo</button>
</div>css
.list {
  background-color: pink;
  padding: 5px;
  margin: 5px 0 ;
}
.content {
  float: left;
  background-color: pink;
  width: 95%
}
.delete {
  text-align: center;
  background-color: gray;
}
.delete:hover {
  background-color: orange;
}
.clearfix {
  clear: both;
}js
// 清單範本
var tempListHtml = $('.lists').html();
// add button,能在 lists 底下新增清單範本
$('.add').click(function(){
  $('.lists').append(tempListHtml);
});
// delete button,偵測到第幾個 list 的 button 被 click,就 remove 第幾個 list
$('.lists').on('click', '.delete', function(){
  var order = $('.delete').index(this);
  $('.list').eq(order).remove();
})參考後修改的 Codepen
html
<ul id="todo">
  <li>
    <div class="content">Lorem, ipsum.</div>
    <div class="delete">x</div>
  </li>
  <li>
    <div class="content">Lorem, ipsum.</div>
    <div class="delete">x</div>
  </li>
  <li>
    <div class="content">Lorem, ipsum.</div>
    <div class="delete">x</div>
  </li>
</ul>
<button id="create">+ todo</button>css
ul {
  padding: 0;
  mragin: 0;
  list-style-type: none;
}
li {
  position: relative;
  background-color: pink;
  padding: 10px;
  margin: 5px 0;
}
.delete {
  /*  del btn 用絕對定位  */
  position: absolute;
  top: 5px;
  right: 20px;
  padding: 4px 10px;
  cursor: pointer;
  background-color: #ccc;
}
.delete:hover {
  background-color: yellow;
}
#create {
  background-color: pink;
  width: 200px;
  height: 50px;
}js
$(document).ready(function(){
  $('#create').click(function(){
    // clone
    var todo = $('#todo').find('li').first().clone();
    // insert @bottom
    $('#todo').append(todo);
  });
  $('#todo').on('click', '.delete', function(e){ // 會傳 event 進來
     $(e.currentTarget).closest('li').remove();
  });
  // $('.delete').click(function(e){
  //   // target's li, remove
  //   $(e.currentTarget).closest('li').remove();
  // });
});[練習] event binding 做不到的事
// 原先是這個,新出現的 .delete 會不知道要監聽
$('.delete').click(function(e){
  // target's li, remove
  $(e.currentTarget).closest('li').remove();
});
// 改成這個才能持續監聽,讓別人交待新來的
$('#todo').on('click', '.delete', function(e){
    $(e.currentTarget).closest('li').remove();
});AJAX 的概念
舉例
- 填表單時,在網頁上填好,傳訊息給 server 
- server 回傳結果。如果有錯誤,就提醒 
- 壞處是,只是想知道想東西,卻需要重整頁面 
改良
- server 在背景傳資料給網頁,不用重整頁面 
- 沒有 AJAX 的話,在 Google Docs 修改文字時,就會一直跳頁跳頁跳針跳針 
jQuery + AJAX
- 例如,想刪掉 li,會觸發 delete 的 click event。 
- 前端刪,後端也要刪,透過 jQuery code 和 AJAX call 互動 
- 例如,想獲得 data-id="20" 的資料,透過 traversing 拿,並與 AJAX call 互動 
- 想移除 li,就使用 DOM manipulate 移除 
前端小結
- HTML 
- CSS 
- Javascript 
- jQuery 
Last updated
Was this helpful?