JQuery筆記
===
###### tags: `web` `frontend`
## 引入
網址: http://jquery.com/
```html
<script src="https://code.jquery.com/jquery-3.1.1.js"></script>
```
## 選擇器 Selector
```javascript=
$("#id")
$(".class")
$("tagName")
/* 取得其 name 屬性值為 email 的 input 元素 */
$('input[name="email"]');
var data = "te";
$("#"+data+"st");
/* 可以選擇多個元素 */
$("#id, li, p")
```
> input需注意``''``,不要和email的``""``衝突
EX:
```javascript=
$("#id").click(function(){
alert("Hello World");
});
$("div").click(function(){
alert("Hello World Again");
});
```
this
```javascript=
$("div").click(function(){
$(this).css("color","blue");
});
```
## HMTL
取得元素內容
```javascript=
alert($("#id").html());
```
改變元素內容
```javascript=
$("#id").click(function(){
$(".test").html("The text was changed!");
});
```
## CSS
取得屬性值
```javascript=
alert($("#demo").css("color"));
```
第二個參數可放要取代的內容
```javascript=
$("#demo").css("color","pink");
```
同時修改多個屬性
```javascript=
$('#demo').css({
color: 'red',
'background-color': 'blue'
});
/* 上面等同下面 */
$("#demo").css("color","red").css("background-color","blue");
```
> 若屬性中包含 -,記得加上引號,沒有的話則可有可無。
## Events
### hover
```javascript=
$("#id").hover(function(){
$(".test").html("The text was changed!");
});
```
### submit
form表單的提交
```javascript=
$("#testForm").submit(function(event){
...
})
```
### preventDefault
阻止當前動作繼續進行
```javascript=
$("#testForm").submit(function(event){
event.preventDefault();
})
```
## attribute
取得屬性值
```javascript=
alert($("iframe").attr("src"));
```
第二個參數可放要取代的內容
```javascript=
$("#demo").attr("class","changed");
```
移除屬性值
```javascript=
$('#demo').removeAttr('title');
/* 上面同等於這樣做 */
$('#demo').attr('title', null);
```
## Class
### addClass
增加 class
```javascript=
$("#demo").addClass("className");
```
增加多個 class
```javascript=
$("#demo").addClass("className1 className2");
```
> 用空白隔開多個 class
### removeClass
移除 class
```javascript=
$('#demo').removeClass("className1");
/* 沒寫則是移除所有className */
$('#demo').removeClass();
```
## toggle
### toggleClass
不同於``addClass``、``removeClass``,它會執行當前的相反狀態。
有指定之className時,觸發``toggleClass``會把此className移除;反之沒有此className時,會加入此className。
```javascript=
$("#demo").toggleClass("className");
$("#demo").toggleClass("className1 className2");
```
### toggle
``toggle()``可以把指定元素隱藏/顯示
```javascript=
/* demo元素隱藏或再次顯示 */
$("#demo").toggle();
```
## 隱藏
```javascript=
$("#demo").click(function(){
$(this).css("display","none");
});
/*上面等同這樣做*/
$("#demo").click(function(){
$(this).hide();
});
```
### fadeOut 慢慢消失
```javascript=
$("#demo").click(function(){
$(this).fadeOut();
});
/* 也可加上自訂秒數或是fast、slow */
$(this).fadeOut(5000);
$(this).fadeOut("fast");
$(this).fadeOut("slow");
```
### fadeIn 慢慢出現
```javascript=
$("#demo").click(function(){
$(this).fadeIn();
});
```
## 簡易動畫 animate
```
.animate({css屬性值},秒數);
```
```javascript=
$("div").click(function(){
$(this).animate({
width: "200px",
height: "200px",
marginLeft: "100px",
marginTop: "100px"},1500);
});
```
> 若屬性中包含 -,需去掉後把首字大寫
## 正則表達式 Regular Expression
```javascript=
var res = /great/ig;
/*i:查找時忽略大小寫
* g:查找全域(global)
*/
var string ="Regular Expression is Great";
var result = string.match(res);
alert(result);
```
檢查Email格式是否正確
```javascript=
function isValidEmailAddress(emailAddress){
var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i;
return pattern.test(emailAddress);
};
/*調用它來檢查是否符合*/
if( !isValidEmailAddress( emailaddress ) ){
alert("It not a valid Email!");
}
```
檢查傳入值是否是數字
```javascript=
var a = -10;
$.isNumeric(a); //ture
```
## Ajax
>AJAX即「Asynchronous JavaScript and XML」(非同步的JavaScript與XML技術),指的是一套綜合了多項技術的瀏覽器端網頁開發技術。 來源:維基百科
```javascript=
$.ajax({
url: "test.html"
}).done(function(data){
alert(data);
});
```
```javascript=
$.ajax({
url: 'http://test/hotel',
type: 'get',
dataType: 'json',
success: function(data){
// console.log(data);
for(let hotel of data){
// console.log(hotel.Name);
var name = hotel.Name;
var city = hotel.City;
$('#hotelTable tbody').append(`<tr><td>${city}</td><td>${name}</td></tr>`);
}
},
error: function(jqXHR){
console.log(jqXHR);
}
});
```
## height
```javascript=
var contentHeight = 200;
$("#myContent").height(contentHeight+"px");
$("#myContent").height("100px");
```
取得瀏覽器高度
```javascript=
var windowHeight = $(window).height();
```
## .length
可以用.length
1. 取得字串長度
```javascript=
var str = "Hello World!";
alert(str.length);
```
2. 取得元素數目
```htmlmixed=
<body>
<select id="favAnimal">
<option>dog</option>
<option>cat</option>
<option>rabit</option>
</select>
</body>
```
```javascript=
/* 3 */
alert($("#favAnimal option").length);
```
## has
``has``可以選擇含有指定元素之元素。
查找的條件判斷在子元素上,意即``has``返回的是子元素滿足 class=topLine 的自身 li 對象
```javascript=
$("li").has(".topLine");
```
```javascript=
/* 選擇包含span元素之p元素 */
$("p:has(span)").css("color","red");
$("p:has(#id)").length;
```
> :has中不用把要查找的元素用``"`` ``"``包住
另外寫法
```javascript=
$("#myContent").has("span").css("color","red");
```
### hasClass
也可以用來確認元素是否含有指定之className
```javascript=
/* return true or false */
alert($(#myContent).hasClass("hello"));
```
> 加在結尾``.has``、``.hasClass``需要用``"`` ``"``包住查找之目標
## filter
查找的條件判斷在自己上,意即``filter``返回的是自身 li 其 class=topLine 的元素
```javascript=
$("li").filter(".topLine");
```
### className
``filter``方法會過濾出每個指定className之元素
```htmlmixed=
<body>
<div class="myList done">1 (index 0)</div>
<div class="myList">2 (index 1)</div>
<div class="myList done">3 (index 2)</div>
<div class="myList">4 (index 3)</div>
<div class="myList">5 (index 4)</div>
</body>
```
```javascript=
/* 把清單中完成的項目,其字體顏色改為紅色 */
$(".myList").filter(".done").css("color","red");
```
### odd、even
也可以指定奇/偶數,要注意是看index來判斷奇偶數
```javascript=
/* 2、4變紅色,注意是看index來判斷奇偶數 */
$(".myList").filter(":odd").css("color","red");
```
### function
除了指定className查找,也可以執行function
```javascript=
$(".myList").filter(function(){
/* 列出每個清單的內容 */
alert($(this).html());
});
```
### 結合length用法
```javascript=
var doneNum = $(".myList").filter(function(){
var tmp = $(this).hasClass("done");
return tmp;
}).length;
alert(doneNum+" things were done");
```
## find
``find``判斷條件作用在子元素上,但是不同於``has``、``filter``;``find``回傳的不是自身,而是查找到的子元素。
意即在 li 的子元素中查找是否有 class=a 的元素,並回傳所有滿足 class=a 的元素集合。
```javascript=
$("li").find(".a");
```
<style>
.ui-infobar { display: none; }
</style>