2016年5月20日 星期五

function (JavaScript 2)

※剩餘參數

window.onload = () => {
    restParam('a','b','c');
}
    
function restParam(...str) {
    for(let s of str) alert(s);
}



※限制參數

限制最多幾個參數

window.onload = () => {
    RestrictionParam(); // undefined-undefined
    RestrictionParam('a','b'); // a-b
    RestrictionParam('a','b','c'); // a-b
}
    
function RestrictionParam(...[p1, p2]) {
    alert(p1 + '-' + p2);
    if(typeof(arguments[2]) != 'undefined'){
        alert(arguments[2]);
    }
}

※實際上沒有真的限制,只是傳進來不用

※...在變數的前面,和java相反

※...只能寫在參數的最後,和 java 一樣

※...傳進來的參數,可以是不同型態


※傳參數但不用

function test(){
    for(var i=0; i<arguments.length; i++){
        alert(arguments[i]);
    }
    
    for(i in arguments){
        alert(arguments[i]);
    }
}
----------
<button onclick="test('a', 'b')">f1</button>

※使用arguments還是可取得參數


※匿名function

<button onclick="(function(){alert(arguments[0])})('a')">f1</button>
<button onclick="(function(p1){alert(p1)})('a')">f2</button>

※兩種方式都可以

※這種匿名外面有圓括號,就是「(function xxx)()」最外層的圓括號,最後的圓括號是傳進去的值


※巢狀function

※無參數

function outer(){
    function inner(){
        return 1;
    }
    
    /*
    var inner = function(){
        return 1;
    }
    */
    
    return inner;
    // return inner(); 
}
----------
<button onclick="alert(outer())">f1</button>
<button onclick="alert(outer()())">f2</button>

※inner兩種方式我測的結果都一樣

※return有沒有加「()」有差
沒加時,f1按鈕是inner整個function;f2按鈕是1
有加時,f1按鈕是1;f2失效


※有參數

function outer(p1){
    function inner(p2){
        return p2;
    }
    return inner(p1); 
}
----------
<button onclick="alert(outer(2))">f1</button>
<button onclick="alert(outer(2)())">f2</button>

※有參數時,呼叫outer當然沒問題,但裡面要傳參數到內部的inner參數時,一定要有「()」,所以外面(button)無法呼叫到裡面的inner,也就是說inner function只供outer使用


※內外層互動

function outer(p1, p2){
    function inner(p3 ,p4){
        return p3 * p4;
    }
    return inner(p1, p2) + p1 + p2;
}
----------
<button onclick="alert(outer(1, 2))">f1</button>

※當然還是不能直接呼叫內部function,inner function只供outer使用


※內外層變數

var x = "xxx";
function outer(){
    var x = "ooo";
    /*
    var inner = function(){
        return x;
    }
    */
    var inner = new Function("return x;");
    return inner; 
}
----------
<button onclick="alert(outer())">f1</button>
<button onclick="alert(outer()())">f2</button>

※正常情形是抓最近的變數,但用new Function只會抓全域的,所以將全域的刪除,裡面new Function也不會抓到


※四種寫法

function f1(x){
    alert(x);
}
    
var f2 = new Function('x', 'alert(x);');
    
var f3 = function(x){
    alert(x);
}
    
var f4 = (x) => {
    alert(x);
}
----------
<button onclick="f1('F1')">f1</button>
<button onclick="f2('F2')">f2</button>
<button onclick="f3('F3')">f3</button>
<button onclick="f4('F4')">f4</button>

※f2的最後一個參數一定是內容就對了,換句話說,如果不放參數,那內容就是第一個

※f4是lambda的寫法,我用IE11了,都還是不支援,而且還會導致其他的function出錯,所以IE不要去用它

※f4可以說是從f3改的,放在f1和f2都不行

※還有匿名寫法,例如就把f1拿掉,就是了,要用時就整個搬到呼叫的方法即可

※箭頭函數沒有 this、super、arguments、new.target

※除了 f1 的寫法外,其他三種寫法,函數名稱一樣,會後者蓋前者,f1 只要名稱一樣,就會最先被蓋過去



※箭頭函數省略寫法

<script>
'use strict';
    window.onload = _ => {
        alert(xxx(9));
        ooo(8);
    }
    
    let xxx = x => {
        return x;
    }
    
    let ooo = o =>
        alert(o);
</script>

※1.如果沒有參數,除了「() =>」,還可以用「_ =>」
2.如果只有一個參數,可以省略「()」
3.如果只有一行,可以不用「{}」,但如果有回傳值,連「return」關鍵字也不能有



※一般函數和箭頭函數比較


※this

<script>
'use strict';
    window.onload = () => {
        let o = new Obj('x');
        alert(o.p);
    }
    
    function Obj(p) {
        this.p = p;
        return p;
    }
    
    /*
    let Obj = (p) => {
        this.p = p;
        return p;
    }
    */
</script>




※arguments

<script>
'use strict';
    window.onload = () => {
        xxx(9,8);
    }
    
    function xxx() {
        alert(arguments.length);
    }
    
    /*
    let xxx = () => {
        alert(arguments.length);
    }
    */
</script>




※new.target

<script>
'use strict';
    window.onload = _ => {
        Foo();
        new Foo();
    
        // x();
        // new x();
    }
    
    function Foo() {
        alert(new.target);
        if(typeof(new.target) == 'undefined'){
            alert('non constructor');
        } else {
            alert('is constructor');
        }
    }
    
    /*
    let x = _ => {
        alert(new.target);
    }
    */
</script>

※使用 new.target 可以知道是不是用 new 的方式進來的


※new.target.name

<script>
'use strict';
    window.onload = _ => {
        new Father(); // Father
        new Me(); // Me
    }
    
    class Father {
        constructor() {
            alert(new.target.name);
        }
    }
    
    class Me extends Father {
        constructor() {
            super();
        }
    }
</script>





※立刻執行的函數

(  function() {alert("一");}  )();
(  function() {alert("二");}  ());
new function() {alert("三");} ();
new Function("alert('四');")  ();
(  () => {alert("五");})      ();
    
+  function() {alert("1");}  ();
-  function() {alert("2");}  ();
!  function() {alert("3");}  ();
~  function() {alert("4");}  ();

※不需要呼叫,自己就執行了,中間可不用空格,只是方便對照而已

※如果有參數,參數值可以寫在最後面的圓括號裡

特效:基本、淡入淡出、滑動 (jQuery 22)

※基本特效

官網連結

目前有3個:
.hide():隱藏
.show():顯示
.toggle():顯示/隱藏互換


※無參數用法

$(function(){
    $('button:first').click(function(){
        $('div').hide();
    });
    
    $('button:eq(1)').click(function(){
        $('div').show();
    });
    
    $('button:last').click(function(){
        $('div').toggle();
    });
});
----------
<div style="background-color:lightblue;">div</div>
<button>hide</button>
<button>show</button>
<button>toggle</button>

※三個可以混用


※有參數用法

$(function(){
    $('button:first').click(function(){
        $('div').hide(500, function(){
            alert('隱藏速度0.5秒');
        });
    });
    
    $('button:eq(1)').click(function(){
        $('div').show(1000);
    });
    
    $('button:last').click(function(){
        $('div').toggle(function(){
            alert('toggle finish!');
        });
    });
});
----------
<div style="background-color:lightblue;">div</div>
<button>hide</button>
<button>show</button>
<button>toggle</button>


※物件參數

$(function(){
    $('button:first').click(function(){
        var obj = {'duration':'slow', 'complete':alert('xxx')};
        $('div').hide(obj);
    });
    
    $('button:eq(1)').click(function(){
        $('div').show({'duration':'fast', 'complete':function(){alert('ooo')}});
    });
    
    $('button:last').click(function(){
        $('div').toggle('normal');
    });
});
----------
<div style="background-color:lightblue;">div</div>
<button>hide</button>
<button>show</button>
<button>toggle</button>

※slow就是600;fast是200

※官網有11個,我只示範我會的部分,其他有要用再研究



※淡入淡出特效

官網連結

目前有4個:
.fadeIn():類似hide()
.fadeOut():類似show()
.fadeTo():透明度,參數是0~1
.fadeToggle():類似toggle()

※fadeIn()、fadeOut()、fadeToggle()用法和基本特效一樣,就不貼範例了


※.fadeTo()

$(function() {
    $('button:first').click(function(){
        $('div').fadeTo('slow', 0.3, function(){
            alert('slow 33%');
        });
    });
    
    $('button:eq(1)').click(function(){
        $('div').fadeTo('fast', 0.6, function(){
            alert('fast 66%');
        });
    });
    
    $('button:last').click(function(){
        $('div').fadeTo('normal', 1);
    });
});
----------
<div style="background-color:lightblue;">div</div>
<button>33%</button>
<button>66%</button>
<button>100%</button>



※滑動特效

官網連結

目前有3個:
.slideUp():類似hide()
.slideDown():類似show()
.slideToggle():類似toggle()

※用法和基本特效一樣,就不貼範例了

2016年5月16日 星期一

雜項:DOM 元素方法、資料儲存、集合操作 (jQuery 21)

※DOM 元素方法

DOM和jQuery的轉換,所以經過這個方法會變成DOM,只能用DOM的東西(除非再轉回來)
官網連結

目前有4個:
.get():給索引值,回傳DOM節點
.index():給DOM節點,回傳索引值,沒有回傳-1
.size():1.8已廢棄,但還沒移除,取集合的長度用的
.toArray():轉換成陣列


※.get()

$(function() {
    alert($('div').get(0).innerText);
    alert($('div').get()[1].innerText);
    alert($('div').get(-1).innerText);
});
----------
<div>A</div>
<div>B</div>
<div>C</div>


※.index()

var divb = document.getElementById('b');
alert($('div').index(divb));
alert($('div').index($('#b')));
alert($('p').index());
----------
<div>A</div>
<div id="b">B</div>
<div>C</div>
<p>P</p>


※.toArray()、.size()

$(function() {
    var arr = $('div').toArray();
    for(var i=0; i<arr.length; i++){
        alert(arr[i].innerText);
    }
    
    /*
    $('div').each(function(i){
        alert(arr[i].innerText);
    });
    */
    
    alert($('div').size());
});
----------
<div>A</div>
<div id="b">B</div>
<div>C</div>

※註解的each方法也是可以的



※資料儲存


官網連結

目前有2個:
.data():儲存資料,很像java的java.util.Map
.removeData():移除.data()設定的資料


※.data()、.removeData()

$(function(){
    $('body').data('xxx', 'x');
    $('body').data('ABC', {A:'a', B:'b', C:'c'});
    $('body').data({ooo:['o', 'oo', 'ooo']});
    
    console.log($('body').data('xxx'));// x
    console.log($('body').data('ABC').A);// a
    console.log($('body').data().xxx);// x
    console.log($('body').data().ABC.B);// b
    console.log($('body').data().ooo);// o,oo,ooo
    
    $('span').data('xxx', 'span x');
    console.log($('span').data('xxx'));// span x
    console.log($('span').data('x'));// undefined
    
    $('body').removeData('ABC');
    console.log('移除body的ABC後');
    console.log($('body').data('ABC'));// undefined
    console.log($('body').data('xxx'));// x
    console.log($('span').data('xxx'));// span x
    
    $('body').removeData();
    console.log('移除body的data後');
    console.log($('body').data('ABC'));// undefined
    console.log($('body').data('xxx'));// undefined
    console.log($('span').data('xxx'));// span x
});
----------
<span>span</span>



※集合操作

官網連結

目前有2個:
.each():迴圈,有兩個參數,視情況可加
jQuery.param():將json變成一個字串,方便傳遞


※.each()

$(function(){
    $('span').each(function(i, e){
        $(this).text('span' + i);
        $(e).css('color', 'blue');
    });
});
----------
<span></span>
<span></span>
<span></span>

※e就是this


※$.param()

$(function(){
    $('p:first').text($.param({xxx:'x', ooo:'o'}));// xxx=x&ooo=o
    $('p:eq(1)').text($.param({zzz: [1,2,3]}));// zzz%5B%5D=1&zzz%5B%5D=2&zzz%5B%5D=3
    $('p:last').text($.param(
        {
        eee: {a:1,b:2}, 
        ttt: [3,4,{c:5}]
        })
    );
    // eee%5Ba%5D=1&eee%5Bb%5D=2&ttt%5B%5D=3&ttt%5B%5D=4&ttt%5B2%5D%5Bc%5D=5
});
----------
<p></p>
<p></p>
<p></p>

2016年5月14日 星期六

型態屬性操作 (CSS的屬性) (jQuery 20)

官網連結

目前有12個:
.css():設定css

以下6個下面範例會說明:
.height():取得、設定高度
.innerHeight():取得、設定高度
.outerHeight():取得、設定高度
.width():取得、設定寬度
.innerWidth():取得、設定寬度
.outerWidth():取得、設定寬度

.scrollLeft():取得、設定捲軸的寬(裡面)
.scrollTop():取得、設定捲軸的高(裡面)

.offset():絕對定位
.position():相對定位,要使用css的position才有用

jQuery.cssNumber:css物件



※取得css屬性(一組)

<style>
    span{color:blue};
</style>
    
$(function(){
    alert($('span').css('color'));// rgb(0, 0, 255)
});
----------
<span>span</span>


※取得css屬性(多組)

<style>
    .s1 {color:green; background-color:pink; padding:5px;}
    .s2 {color:blue; background-color:lightgreen; padding:10px;}
    .s3 {color:red; background-color:lightblue; padding:15px;}
</style>
    
$(function(){
    $('span').mouseleave(function(){
        var styleSheet = $(this).css(['color', 'background-color', 'padding']);
        $.each(styleSheet, function(k, v){
            alert(k + ":" + v);
        });
    });
});
----------
<span class="s1">span1</span>
<span class="s2">span2</span>
<span class="s3">span3</span>


※設定css屬性

$(function(){
    $('.s1').css('background-color', 'green');
    $('.s2').css({'color':'red', 'background-color':'blue'});
    $('span').css('padding', function(i) {
        return i * 50 + 'px';
    });
});
----------
<span class="s1">span1</span>
<span class="s2">span2</span>
<span class="s3">span3</span>

※使用function設定多個無效



※取得.height()、.innerHeight()、.outerHeight()、width()、.innerWidth()、.outerWidth()

<style>
    div { 
        width:150px; height:200px; 
        padding:10px; 
        border:2px red solid; 
        margin:20px; 
        background-color:lightblue;
    }
</style>
    
$(function() {
    console.log('height/width');
    console.log($('div').css('height'));
    console.log($('div').css('width'));
    console.log($('div').height());
    console.log($('div').width());
    
    console.log('innerHeight/innerWidth');
    console.log($('div').css('innerHeight'));
    console.log($('div').css('innerWidth'));
    console.log($('div').innerHeight());
    console.log($('div').innerWidth());
    
    console.log('outerHeight/outerWidth');
    console.log($('div').css('outerHeight'));
    console.log($('div').css('outerWidth'));
    console.log($('div').outerHeight());
    console.log($('div').outerWidth());
    
    console.log('outerHeight/outerWidth true');
    console.log($('div').outerHeight(true));
    console.log($('div').outerWidth(true));
});
----------
<div>
    div
</div>

※Chrome瀏覽器按F12,如下操作可知道這幾個屬性的用意,其實就是Box Model

一層一層的包覆,最裡面是內容,有些書寫content、有些寫element,然後是padding、border、margin
width:150px; height:200px; 設定content,使用height()和width()取得
padding:10px; 設定padding,使用innerHeight()和innerWidth()取得
border:2px red solid; 設定border,使用outerHeight()和outerWidth()取得
margin:20px; 設定margin,使用outerHeight(true)和outerWidth(true)取得

※結果:
height/width
200px
150px
200
150

innerHeight/innerWidth
undefined
undefined
220
170

outerHeight/outerWidth
undefined
undefined
224
174

outerHeight/outerWidth true
264
214

※以高度內容200來說明,padding我設10,但它是包覆,所以上下左右都有,上下是高度,所以要加20,所以innerHeight會是220
同樣的border我設2,要加4,會變成224;outerHeight也是一樣的想法


※設定.height()、.width()

$(function() {    
    $('div').css('background-color', 'lightblue');
    // $('div').css('height', '200');
    // $('div').css('width', '150');
    $('div').height(200);
    $('div').width(150);
    
    $('div').one('click', function(){
        $(this).height(function(i, h){
            alert(i);
            alert(h);
            return 300;
        });
    
        $(this).width(function(i, w){
            alert(i);
            alert(w);
            return 250;
        });
    });
});
----------
<div>
    div
</div>

※innerXXX和outerXXX沒有這種用法,要設定只好用.css()了



※.scrollLeft()、.scrollTop()

<style>
    div { 
        width:100px; height:100px; 
        border:20px red solid; 
        background-color:lightblue;
        overflow:auto;
    }
</style>
    
$(function() {
    $('div').scrollTop(50);
    $('div').scrollLeft(30);
    $('button').click(function(){
        alert('高:' + $('div').scrollTop());
        alert('寬:' + $('div').scrollLeft());
    });
});
----------
<div>
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd<br />
    ddddddddddddddddddddddddddddddddddddd
</div>
<button>click me</button>

※移動完捲軸再按按鈕



※設定、取得.offset()

<style>
    body {
        padding:0;
        margin:0;
    }
    
    div { 
        width:100px; height:120px; 
        border:20px red solid; 
        background-color:lightblue;
    }
</style>
    
$(function() {
    // $('div').eq(0).offset({ top: 5, left: 10 });
    $('div').eq(0).offset(function(i ,c){
        c.top = 5;
        c.left = 10;
        return c;
    });
    
    $('div').each(function(i){
        var $offset = $('div').eq(i).offset();
        $('div').eq(i).html('左右:' + $offset.left + '<br />高低:' + $offset.top);
    });
});
----------
<div>div1</div>
<div style="float:left">div2</div>
<div style="float:left">div3</div>

※因為沒有設定position,所以用offset()和position()都一樣



※取得.position()

<style>
    body {
        padding:0;
        margin:0;
    }
    
    div { 
        width:100px; height:120px; 
        border:20px red solid; 
        background-color:lightblue;
    }
    
    .two {
        float:right;
        position:relative;
        width:200px; height:240px;
    }
</style>
    
$(function() {
    $('div').each(function(i){
        if(i != 1){
            var $position = $('div').eq(i).position();
            $('div').eq(i).html('左右:' + $position.left + '<br />高低:' + $position.top);
        }
    });
});
----------
<div>div1</div>
<div class="two">
    div2
    <div>div3</div>
</div>

※結果可以看到div3和父元素div2的相對定位,改成offset()會發現兩者不一樣

※因為是相對定位,所以沒有設定的寫法

2016年5月13日 星期五

切割子網路 (IPv4)

必備的知識要先會何謂同網段的內容

C類:

※例一

192.168.0.100/25想知道同網段的IP?
最後的數字是10000000 = 128
1表示網路數,2的1次方,所以有2個子網路
0表示主機數,2的7次方-2,所以有126台主機;減2是第一個數字和最後一個數字表示整個網段和廣播位址

2的8次方是256
256-128 = 128,
網段:    0  128 (192.168.0省略)
廣播:127  255 (192.168.0省略)
上下對照,中間的差就是可以分配的主機IP
裡面真的有126台主機(1~126和129~254),而100是在第一個裡面

192.168.0.0代表192.168.0.1~192.168.0.127整個網段,廣播是192.168.0.127
這是IPv4,IPv6已經沒有廣播了,因為要傳訊息(封包)時,會發到廣播位址,一廣播後,1~126都收的到,就算沒有要訊息,也會收到,所以會被駭客截取資訊

如果要將封包傳到另外一個網段(128~255)就要設定default gateway,通常是路由器,它會將封包傳給不同網段的主機


※例二

192.168.0.100/27?
11100000 = 224
2的3次方 = 8個子網路
2的5次方-2 = 30台主機

256-224 = 32
網段:  0  32  64    96  128  160  192  224
廣播:31  63  95  127  159  191  223  255


※例三

192.168.0.100/28?
11110000 = 240
2的4次方 = 16個子網路
2的4次方-2 = 14台主機

256-240 = 16
網段:  0  16  32  48  64  80    96  112  128  144  160  176  192  208  224  240
廣播:15  31  47  63  79  95  111  127  143  159  175  191  207  223  239  255



B類:

※例一

172.16.0.100/18?
11000000 00000000 = 192.0
2的2次方 = 4個子網路
2的14次方-2 = 16382台主機

256-192 = 64
網段:      0.0        64.0      128.0      192.0 (172.16省略;和C類比,最後多.0)
廣播:63.255  127.255  191.255  255.255 (172.16省略;和C類比,最後多.255)

※驗證主機數:0.0~0.255、1.0~1.255、2.0~2.255一直到63.0~63.255,每組都是256台主機
所以是64*256-2 = 16382台主機 (減2是減0.0和63.255的關係)


※例二

172.16.0.100/24?
11111111 00000000 = 255.0
2的8次方 = 256個子網路
2的8次方-2 = 254台主機

256-255 = 1
網段:    0.0      1.0      2.0 ~     255.0
廣播:0.255  1.255  2.255 ~ 255.255


※例三

172.16.0.100/26?
11111111 11000000 = 255.192
2的10次方 = 1024個子網路
2的6次方-2 = 62台主機

256 - 192 = 64(目前和例一一樣,但切割超過8個1,所以數字要加在左邊)
網段:  0.0    0.64  0.128  0.192    1.0    1.64 ~~~
廣播:0.63  0.127  0.191  0.255  1.63  1.127 ~~~

※驗證網段數:0.0~0.255、1.0~1.255、2.0~2.255一直到255.0~255.255,每組都是4個網段
所以是256*4 = 1024個子網路



A類:

※例一

10.0.0.100/9?
10000000 00000000 00000000 = 128.0.0
2的1次方 = 2個子網路
2的23次方-2 = 8388606台主機

256-128 = 128
網段:            0.0.0          128.0.0 (10省略)
廣播:127.255.255  255.255.255 (10省略)

※驗證主機數:
0.0.0~0.0.255-->256台主機
0.1.0~0.1.255-->256台主機

0.255.0~0.255.255-->256台主機
目前是256*256
而最左邊的0~127有128台主機,所以要再乘128
結果是256*256*128-2 = 8388606


※例二

10.0.0.100/17
11111111 10000000 00000000 = 255.128.0
2的9次方 = 512個子網路
2的15次方-2 = 32766台主機

256-128 = 128
網段:        0.0.0      0.128.0          1.0.0          1.128.0 ~~~
廣播:0.127.255  0.255.255  1.127.255  127.255.255 ~~~

※驗證網段數:
0.0.0~0.128.0-->2個網段
1.0.0~1.128.0-->2個網段

255.0.0~255.128.0-->2個網段
所以是256*2 = 512個網段

※驗證主機數:
0.0.0~0.0.255-->256台主機
0.1.0~0.1.255-->256台主機

0.127.0~0.255.255-->256台主機
所以是256*128-2 = 32766台主機


※例三

10.0.0.100/25
11111111 11111111 10000000 = 255.255.128
2的17次方 = 131072個子網路
2的7次-2 = 126台主機

256-128 = 128
網段:    0.0.0  0.0.128      0.1.0  0.1.128 ~~~
廣播:0.0.127  0.0.255  0.1.127  0.1.255 ~~

※驗證網段數:
0.0.0~0.0.128-->2個網段
0.1.0~0.1.128-->2個網段

0.255.0~0.255.128-->2個網段
目前是256*2
而最左邊的是0~255有256個網段,所以要再乘256
結果是256*2*256 = 131072個網段

何謂同網段 (IPv4)

A~E類網路
2進位與十進位的轉換,最右邊為2的0次方,到最左邊為2的7次方(不是0的就加起來)
看要用手算還是用執行-->calc-->檢視-->程式設計師 驗證
1000 0000 = 128
1100 0000 = 192
1110 0000 = 224
1111 0000 = 240
1111 1000 = 248
1111 1100 = 252
1111 1110 = 254
1111 1111 = 255


0~127為A類(127為內部測試用),預設遮罩:255.0.0.0
128~191為B類,預設遮罩:255.255.0.0
192~223為C類,預設遮罩:255.255.255.0
224~239為D類
240~255為E類(因為後面太少了)
一般都用A~C類,D為群播用、E類為測試用,較少人討論


虛擬IP

A類:10.0.0.0~10.255.255.255    預設遮罩:255.0.0.0
B類:172.16.0.0~172.31.255.255    預設遮罩:255.240.0.0
C類:192.168.0.0~192.168.255.255    預設遮罩:255.255.0.0
維基連結

微軟的作業系統如果不能連網路預設是169.254開頭(APIPA的功能)
想修改可用 執行-->ncpa.cpl,然後打開想設定的網卡,如下操作:


※例一:

192.168.0.15/24和192.168.0.50/24是同網段嗎?
24表示1的個數11111111 11111111 11111111 00000000,8個一組,3組是24個
這是C類的預設遮罩

1.將192.168.0.15/24和192.168.0.50/24都做AND運算
AND運算就是兩個為真才是真,0是假;1是真
AND運算在這裡和九九乘法表完全一樣,因為只有0和1而已

11000000 10101000 00000000 00001111
11111111 11111111 11111111 00000000
_________________________________
11000000 10101000 00000000 00000000
192.168.0.15得到的結果換算成10進位為:192.168.0.0

11000000 10101000 00000000 00110010
11111111 11111111 11111111 00000000
_________________________________
11000000 10101000 00000000 00000000
192.168.0.50得到的結果換算成10進位為:192.168.0.0
所以兩個網路是同網段

會了以後,可以用更快速的想法
遮罩的前面24個都是1,所以前面不要去算,因為192.168.0AND後,一定和自己一樣
只要算最後一個15和50的部分,但遮罩的後面8個都是0,所以不管數字是什麼,一定為0


※例二:

192.168.0.15/24和192.168.1.15/24是同網段嗎?
不同,答案是192.168.0和192.168.1是不同的網段


進階的切割子網路請看這一篇

2016年5月12日 星期四

Calendar的運用範例(13號星期五)

int start = 1950;
int end = 2050;
if (start > end) {
    System.err.println("起始年>結束年");
    System.exit(0);
}
    
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 13);// 寫死的13號
List<Integer> months = Arrays.asList(Calendar.JANUARY, Calendar.FEBRUARY, Calendar.MARCH, Calendar.APRIL,
        Calendar.MAY, Calendar.JUNE, Calendar.JULY, Calendar.AUGUST, Calendar.SEPTEMBER, Calendar.OCTOBER,
        Calendar.NOVEMBER, Calendar.DECEMBER);
    
for (int i = start; i < end + 1; i++) {
    String[] ymd = null;
    // int count = 0;
    cal.set(Calendar.YEAR, i);
    for (int j = 0; j < months.size(); j++) {
        cal.set(Calendar.MONTH, j);
    
        // 如果是星期五
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
            DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
            ymd = df.format(cal.getTime()).split("/");
            System.out.println(ymd[0] + "年" + ymd[1] + "月" + ymd[2] + "日");
            // count++;
        }
    }
    System.out.println("-----------------------------");
    // System.out.println("#######################################");
    // if (count == 3) {
    // System.out.println("一年有3次13號星期五的是" + ymd[0] + "年");
    // }
}

※註解的部分是判斷一年中13號星期五的次數用的

DOM 移除、取代 (jQuery 19)

※DOM移除

官網連結

目前有4個:
.empty():移除元素,自己的不會移除
.detach():移除元素,自己的會移除,事件不會移除
.remove():移除元素,自己的會移除,連事件都會移除
.unwrap():上一篇已講過


※.empty()

$(function(){
    $('.div2').empty();
});
----------
<div>
    div1
    <div class="div2">
        div2
        <ul>
            <li>li1</li>
            <li>li2</li>
            <li>li3</li>
        </ul>
    </div>
</div>
<!-- 變成以下的樣子 -->
<div>
    div1
    <div class="div2"></div>
</div>

※可以看出<div class="div2">裡面的才會移除


※.remove()、.detach()

$(function(){   
    $('.div2').remove();
    // $('div').remove('.div2');
    
    // $('.div2').detach();
    // $('div').detach('.div2');
});
----------
<div>
    div1
    <div class="div2">
        div2
        <ul>
            <li>li1</li>
            <li>li2</li>
            <li>li3</li>
        </ul>
    </div>
</div>
<!-- 變成以下的樣子 -->
<div>
    div1
</div>

※這個例子,這四種寫法都一樣


※.remove()和.detach()的差別

<style>
    .xxx{background-color:yellow};
</style>
    
$(function(){
    $("div").hover(function() {
        $(this).toggleClass('xxx');
    });
    
    var xxx;
    $('button').click(function(){
        if (xxx) {
            $('body').prepend(xxx);
            xxx = null;
        } else {
            xxx = $('div').detach();
        }
    });
});
----------
<div>
    div1
</div>
<button>click me</button>

※滑鼠進出div都會觸發xxx

※按下按鈕後,使用detach的事件可以循環;而remove一移除就破功了



※DOM 取代

官網連結

目前有2個:
.replaceWith():右邊取代左邊
.replaceAll():左邊取代右邊

兩個方法功能一樣,但replaceWith()多一個function寫法


$(function(){
    $('p').replaceWith($('.one'));
    // $('.one').replaceAll('p');
});
----------
<div>
    div
    <p>
        p1
        <span>s1</span>
        <span>s2</span>
        <span>s3</span>
    </p>
    <p>
        p2
        <span>s4</span>
        <span>s5</span>
        <span>s6</span>
    </p>
</div>
<h1 class="one">xxx</h1>
    
<!-- 變成以下的樣子,連h1都消失了 -->
<div>
    div
    <h1 class="one">xxx</h1>
    <h1 class="one">xxx</h1>
</div>


※replaceWith的function寫法

$(function(){
    $('p').replaceWith(function(){
            return '<b>bold</b>';
    });
});
----------
<div>
    div
    <p>
        p1
        <span>s1</span>
        <span>s2</span>
        <span>s3</span>
    </p>
    <p>
        p2
        <span>s4</span>
        <span>s5</span>
        <span>s6</span>
    </p>
</div>
<h1 class="one">xxx</h1>
    
<!-- 變成以下的樣子,h1不會消失 -->
<div>
    div
    <b>bold</b>
    <b>bold</b>
</div>
<h1 class="one">xxx</h1>

2016年5月11日 星期三

DOM 插入操作(包覆、外部、內部) (jQuery 18)

※DOM包覆插入操作

官網連結

目前有4個:
wrap就是包覆起來的意思
.wrap():插入到外層
.wrapInner():插入到內層
.wrapAll():會將選擇器變成一組,然後插入到外層
.unwrap():將外層刪除


※範例

<style>
    .xxx{border:solid 1px blue}
    .ooo{border:solid 1px red}
</style>
    
$(function() {
    //$('p').wrap('<div>div</div>');
    $('p').wrap(function(){
        return '<div>div</div>';
    });
    
    //$('p').wrapInner('<div>div</div>');
    /*
    $('p').wrapInner(function(){
        return '<div>div</div>';
    });
    */
    
    //$('p').wrapAll('<div>div</div>');
    
    $('p').addClass('xxx');
    $('div').addClass('ooo');
    $('button').click(function(){
        $('p').unwrap();
    });
});
----------
<p>p1</p>
<span>span1</span>
<p>p2</p>
<span>span2</span>
<p>p3</p>
<button>unwrap</button>

※wrapAll()沒有function的寫法

※裡面不一定要寫HTML,也可以寫選擇器

※以下是按F12看到的結果,IE按DOM總管;Chrome按Elements,檢視原始檔是看不出來的

※HTML使用wrap後會變成如下的樣子

<div>
    div
    <p>p1</p>
</div>
<span>span1</span>
<div>
    div
    <p>p2</p>
</div>
<span>span2</span>
<div>
    div
    <p>p3</p>
</div>


※HTML使用wrapInner後會變成如下的樣子

<p>
    <div>
        div
        p1
    </div>
</p>
<span>span1</span>
<p>
    <div>
        div
        p2
    </div>
</p>
<span>span2</span>
<p>
    <div>
        div
        p3
    </div>
</p>


※HTML使用wrapAll後會變成如下的樣子

<div>
    div
    <p>p1</p>
    <p>p2</p>
    <p>p3</p>
</div>
<span>span1</span>
<span>span2</span>



※DOM 外部插入操作

官網連結

目前有4個:
.after():在前面插入
.before():在後面插入
.insertAfter():在前面插入
.insertBefore():在後面插入

※after和insertAfter基本功能一樣,只是一個選擇器在前、一個在後;before和insertBefore也是一樣

※after和before還多了function寫法和多個參數寫法


※基本寫法

$(function(){
    $('p').after('<div>div</div>');
    // $('<div>div</div>').insertAfter('p');
    
    // $('p').before('<div>div</div>');
    // $('<div>div</div>').insertBefore('p');
});
----------
<p>p1</p>
<span>span1</span>
<p>p2</p>
<span>span2</span>
<p>p3</p>


※HTML會變成如下的樣子

<p>p1</p>
<div>div</div>
<span>span1</span>
<p>p2</p>
<div>div</div>
<span>span2</span>
<p>p3</p>
<div>div</div>

※p後面會多個div;before就變成在前面


※after和before的function和多參數寫法

$(function(){
    // $('p').after('<div>div</div><h1>h1</h1>');
    $('p').after('<div>div</div>', '<h1>h1</h1>');
    /*
    $('p').after(function(){
        return '<div>div</div>';
    });
    */
});
----------
<p>p1</p>
<span>span1</span>
<p>p2</p>
<span>span2</span>
<p>p3</p>

※第一行的註解和第二行都是一樣的意思

※多行註解是function的寫法,當然不會有return '<div>div</div>', '<h1>h1</h1>'這種東西



※DOM 內部插入操作

官網連結

目前有6個:
.append():在後面插入
.appendTo():在後面插入
.prepend():在前面插入
.prependTo():在前面插入

※append和appendTo基本功能一樣,只是一個選擇器在前、一個在後;prepend和prependTo也是一樣

※append和prepend還多了function寫法和多個參數寫法

※prepend的HTML看起來和before一樣,兩個都寫的話,會發現prepend會在裡面、before在最外面;append和after這一組也是一樣

.text():設定和取得「<>xxx</>」之間的字元,也就是xxx,所以input無效,因為它是value
此方法對HTML和XML都有效
如果設定HTML,會將「<」轉成「&lt;」;「>」轉成「&gt;」

.html():設定和取得HTML,此方法只對HTML有效,所以名稱才取名為html


※.append()、.appendTo()、.prepend()、.prependTo() 的基本寫法

$(function(){
    $('p').append('<div>div</div>');
    // $('<div>div</div>').appendTo('p');
    
    // $('p').prepend('<div>div</div>');
    // $('<div>div</div>').prependTo('p');
});
----------
<p>p1</p>
<span>span1</span>
<p>p2</p>
<span>span2</span>
<p>p3</p>


※append和prepend的function和參數寫法

$(function(){
    $('p').append('<div>div</div><h1>h1</h1>');
    // $('p').append('<div>div</div>', '<h1>h1</h1>');
    /*
    $('p').append(function(){
        return '<div>div</div>';
    });
    */
});
----------
<p>p1</p>
<span>span1</span>
<p>p2</p>
<span>span2</span>
<p>p3</p>



※取得.text()、.html()

$(function(){
    alert($('div').html());
    alert($('div').text());
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※結果:

※上面是html();下面是text(),可以看出text沒有html標籤


※設定.text()、.html()

$(function() {
    $('p').text('<h1>h1</h1>');
    // $('p').html('<h1>h1</h1>');
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※.text()結果(上面是結果圖,下面是HTML最後的結果):


※.html()結果(上面是結果圖,下面是HTML最後的結果):



※使用function設定.text()、.html()

$(function() {
    $('p > span').text(function(i){
        return '<h1>' + i + '</h1>';
    });
    
    /*
    $('p > span').text(function(i){
        return '<h1>' + i + '</h1>';
    });
    */
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
        <span>span</span>
        <span>span</span>
    </p>
</div>

※.text()結果(上面是結果圖,下面是HTML最後的結果):

※.html()結果(上面是結果圖,下面是HTML最後的結果):


2016年5月9日 星期一

Class屬性操作、複製操作 (jQuery 17)

※Class屬性操作

官網連結

目前有4個:
.addClass():增加class
.hasClass():判斷有沒有class
.removeClass():移除class
.toggleClass():增加/移除class


※.addClass()、.removeClass()單個class

<style>
    .xxx{color:red;}
    .ooo{background-color:yellow;}
</style>
    
$(function() {
    $('#b1').click(function(){
        $('span').addClass('xxx');
    });
    
    $('#b2').click(function(){
        $('span').addClass('ooo');
    });
    
    $('#b3').click(function(){
        $('span').removeClass('xxx');
    });
    
    $('#b4').click(function(){
        $('span').removeClass('ooo');
    });
});
----------
<span>span</span>
<button id="b1">addClassXXX</button>
<button id="b2">addClassOOO</button>
<button id="b3">removeXXX</button>
<button id="b4">removeOOO</button>



※.addClass()、.removeClass()多個class

<style>
    .xxx{color:red;}
    .ooo{background-color:yellow;}
</style>
    
$(function() {
    $('#b1').click(function(){
        $('span').addClass('xxx ooo');
    });
    
    $('#b2').click(function(){
        $('span').removeClass('xxx ooo');
    });
});
----------
<span>span</span>
<button id="b1">addClassXXXOOO</button>
<button id="b2">removeXXXOOO</button>



※.addClass()、removeClass()的function用法

<style>
    .xxx0{color:red;}
</style>
    
$(function() {    
    $('#b1').click(function(){
        $('span').addClass(function(i){
            return 'xxx' + i;
        });
    });
    
    $('#b2').click(function(){
        $('span').removeClass(function(i){
            return 'xxx' + i;
        });
    });
});
----------
<span>span</span>
<button id="b1">addClassXXX</button>
<button id="b2">removeXXX</button>



※.hasClass()

$(function() {
    $('#b1').click(function(){
        $('span').addClass('xxx');
    });
    
    $('#b2').click(function(){
        alert($('span').hasClass('xxx'));
    });
});
----------
<span>span</span>
<button id="b1">addClassXXX</button>
<button id="b2">hasClass</button>



※.toggleClass()

<style>
    .xxx{color:red;}
    .ooo0{background-color:yellow;}
</style>
    
$(function() {
    $('#b1').click(function(){
        $('span').toggleClass('xxx');
    });
    
    $('#b2').click(function(){
        $('span').toggleClass(function(i, c){
            alert('class=' + c);
            return 'ooo' + i;
        });
    });
    
    $('#b3').each(function(){
        var i=0;
        $(this).click(function(){
            i++;
            $('span').toggleClass('xxx', i%2==0);
        });
    });
    
    $('#b4').each(function(){
        var i=0;
        $(this).click(function(){
            i++;
            $('span').toggleClass(function(i, c){
                alert('class=' + c);
                return 'ooo' + i;
            }, i%2==0);
        });
    });
});
----------
<span>span</span>
<button id="b1">origin</button>
<button id="b2">origin function</button>
<button id="b3">odd even</button>
<button id="b4">origin function + odd even</button>



※複製操作

官網連結

目前就一個:
.clone():就是複製,第一個參數表示要不要複製事件(指的是動態給的),預設是false


$(function(){
    $('p').css('background-color', 'yellow');
    $('span').eq(1).click(function(){
        alert('xxx');
    });
    $('div').clone().insertAfter('div');
});
----------
<div>
    div
    <p>
        p1
        <span onclick="alert('span1')">span1</span>
        <span>span2</span>
    </p>
    <p>
        p2
        <span>span3</span>
        <span>span4</span>
    </p>
</div>

※寫在HTML上的onclick一定會複製,但動態給的xxx預設是false,所以不會複製,改成clone(true)就會複製了

※要注意id的屬性也會複製,但只會抓到第一筆,所以如果有id要removeProp,或改成class或name

2016年5月7日 星期六

一般屬性操作 (jQuery 16)

官網連結

目前有5個:
.attr():塞屬性
.prop():塞屬性
.removeAttr():移除attr,官網說 IE 6~8 移除oncick會有問題,要用removeProp
.removeProp():移除prop設定的屬性,且不能移除內鍵的屬性
.val():塞value、取value

1.6版後,attr和prop對特定的方法,回傳的不一樣,prop回傳的大部分都是布林值;attr回傳的是屬性



※.attr()、.prop()基本用法

$(function() {
    $('input').prop('readonly', 'readonly');
    var $prop = $('input').prop('readonly');
    alert('prop=' + $prop); // true
       
    $('input').attr('readonly', 'readonly');
    var $attr = $('input').attr('readonly');
    alert('attr=' + $attr); //readonly
    
    // $('input').attr('value', 'xxx').attr('disabled', 'disabled');
    // $('input').attr({value:'xxx', disabled:'disabled'});
----------
<input />

※使用兩個參數是設定,attr和prop在設定時都一樣

※使用一個參數是取值,這時attr和prop回傳結果不同,prop回傳的是boolean值


※.attr()、.prop()的function用法

$(function() {
    $('p').attr('id', function(i, j) {
        alert(j);
        return "xxx" + i;
    }).each(function () {
        $('span', this).text($(this).attr('id'));
    });
});
----------
<p>p1 <span></span></p>
<p>p2 <span></span></p>
<p>p3 <span></span></p>

※j取到的是id值,看第一個參數是什麼決定的



※.attr()、.prop()差異一

$(function() {
    $('#b1').click(function() {
        $('#ooo').attr('readonly', true);
        alert($('#ooo').attr('readonly'));
    });
    
    $('#b2').click(function() {
        $('#ooo').prop('readonly', true);
        alert($('#ooo').prop('readonly'));
    });
    
    $('#b3').click(function() {
        var $checkbox = $('input[name="xxx"]').eq(0);
        alert($checkbox.attr('checked'));
        alert($checkbox.prop('checked'));
    });
});
----------
<input id="ooo" />
<button id="b1">B1</button>
<button id="b2">B2</button>
<br />
<input type="checkbox" name="xxx" id="c1" checked="checked"/>
<label for="c1">a</label>
<input type="checkbox" name="xxx" id="c2" />
<label for="c2">b</label>
<input type="checkbox" name="xxx" id="c3" />
<label for="c3">c</label>
<button id="b3">B3</button>

※B1回傳的是「readonly」,是屬性名稱;B2回傳的是true,是布林值

※B3用attr回傳的是「checked」,用prop回傳的是true



※.attr()、.prop()差異二

$(function() {
    $('select').prop('selectedIndex', 1);
    alert($('select').prop('selectedIndex'));
    
    $('input[type="checkbox"]').prop('defaultChecked', true);
    alert($('input[type="checkbox"]').prop('defaultChecked'));
});
----------
<select>
    <option>A</option>
    <option>B</option>
    <option>C</option>
    <option>D</option>
    <option>E</option>
</select>
    
<input type="checkbox" name="xxx" />
<input type="checkbox" name="xxx" />
<input type="checkbox" name="xxx" />

※用attr和prop回傳的都是1和true,但是用prop真的有選到B,checkbox也都有勾;而attr就是個初始值而已

※官方還有說 selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, or defaultSelected 都要用prop,我這裡示範兩個而已

※總之使用prop有以下兩個的,就用prop比較好
1.屬性值是true/false
2.只增加屬性名稱,而不增加屬性值就可以的


個人經驗:
「$('xxx').attr('disabled', true);」有些瀏覽器不行,
但用「$('xxx').attr('disabled', 'disabled');」就可以;readonly也是一樣



※.removeAttr()、.removeProp()

$(function() {
    $('input').removeAttr('readonly');
    // $('input').removeProp('readonly');
});
----------
<input readonly="readonly"/>

※使用removeProp無效

※remove範例二

$(function() {
    $('input').prop('readonly', 'readonly');
    $('input').removeAttr('readonly');
    // $('input').removeProp('readonly');
});
----------
<input />

※這次用jQuery的prop塞屬性,removeAttr是有用的,但removeProp還是無效

※官網有說不要用prop移除內鍵的屬性,所以無效是很正常的

※remove範例三

$(function() {
    $('span').prop('xxx', 'x');
    alert($('span').prop('xxx'));
    $('span').removeProp('xxx');
    alert($('span').prop('xxx'));
});
----------
<span>span</span>

※此時xxx不是內鍵的屬性,所以運作正常,全部改成attr也是ok的,但如果是將removeProp改成removeAttr是不行的

※兩個最好不要混用,因為很少人會去記哪些可以混用;都不混用一定可以就對了



※.val()基本用法

$(function() {
    $('input').val('xxx');
    alert($('input').val());
    $('input').val('');
    alert($('input').val());
});
----------
<input />

※取的是value,不是text



※.val()的function用法

$(function() {
    $('input').change(function() {
        $(this).val(function(i, v) {
            return v.toUpperCase() + ' success!';
        });
    });
});
----------
<input />

※i是index;v就是打字的內容了

事件物件 (jQuery 15)

官網連結

目前有19個:
preventDefault():使事件的預設行為不觸發
isDefaultPrevented():判斷有沒有執行過 preventDefault()

stopPropagation():停止父輩層傳播,也就是停止冒泡
isPropagationStopped():判斷有沒有執行過 stopPropagation()

stopImmediatePropagation():停止同輩層傳播
isImmediatePropagationStopped():判斷有沒有執行過 stopImmediatePropagation()

target:一開始的DOM元素
currentTarget:當前DOM元素
delegateTarget:正在調用jQuery事件的元素
relatedTarget:相關連的DOM元素,這個我試的結果,只有滑鼠事件才會觸發

data:回傳可選的…,我也不太會解釋,看下面的範例
metaKey:是否按下Meta鍵,一般不會有這個鍵,回傳布林值
namespace:回傳命名空間
pageX:左右的數字(最左邊是0,右邊要看解析度而定)
pageY:上下的數字(最上面是0,下面要看解析度而定)
result:回傳被觸發事件的最後返回值,沒有就回傳undefined
timeStamp:回傳1970年1月1日到現在的毫秒數
type:回傳事件名稱
which:回傳按鍵或滑鼠的數字
  ※滑鼠用mousedown,左、中、右鍵,分別回傳1、2、3;click事件只抓到左和中鍵,右鍵沒抓到,其他都回傳0
  ※keypress:回傳ASCII的數字,但ctrlKey、shiftKey、altKey抓不到
  ※keydown、keyup:回傳的英文是大寫的ASCII,數字左邊的和keypress一樣,都是回傳ASCII,但右邊的數字鍵盤回傳的是 96~105
  ※ctrlKey、shiftKey、altKey抓的到,但keyup都是顯示false;keydown回傳的很正確,不曉得和瀏覽器有沒有關係



※preventDefault、isDefaultPrevented



$(function(){
    $( "input" ).keydown(function(e) {
        alert(e.isDefaultPrevented());
        e.preventDefault();
        alert(e.isDefaultPrevented());
    });
});
----------
<input />

※按下鍵盤後,好像沒按一樣,因為取消了原本的行為



※stopPropagation、isPropagationStopped


$(function(){
    $( "div" ).click(function(e) {
        alert('div');
    });
    
    $( "p" ).click(function(e) {
        alert('p');
    });
    
    $( "span" ).click(function(e) {
        alert(e.isPropagationStopped());
        e.stopPropagation();
        alert(e.isPropagationStopped());
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※原本的行為是按span後,會跳出span、p、div,加了以後只會執行自己的



※stopImmediatePropagation、isImmediatePropagationStopped


$(function(){
    $('span').click(function(e) {
        alert(e.isPropagationStopped());
        e.stopImmediatePropagation();
        alert('span1');
        alert(e.isPropagationStopped());
    });
    
    $('span').click(function(e) {
        alert('span2');
    });
});
----------
<span>span</span>

※原本span2會執行的,但加了stop就不會了,這個是以在html的順序為執行的順序,所以將span2放在span1前面還是會執行



※target

$(function(){    
    $("div").click(function(e) {
        alert(e.target.nodeName);
    });
    
    $("p").click(function(e) {
        alert(e.target.nodeName);
        alert($(e.target).is('SPAN'));
    });
    
    $("span").click(function(e) {
        alert(e.target.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※因為是一開始的元素,所以往上冒泡時,都是一開始的那一個元素,如點span,執行到p和div都會出現span;點p,執行到div,也是出現p


※currentTarget、delegateTarget

$(function(){
    $("div").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
    
    $("p").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
    
    $("span").click(function(e) {
        alert(e.currentTarget.nodeName === e.delegateTarget.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※和target不一樣的地方在按p或div時,按的是p就是p,是div就是div;而target都是按的那一個

※兩者差別我分不出,官方也寫說這兩個總是一樣


※relatedTarget

$(function(){
    $('span').mouseover(function(e) {
        console.log(e.relatedTarget.nodeName);
    });
});
----------
<div>
    div
    <p>
        p
        <span>
            span
            <input />
        </span>
    </p>
</div>

※這個物件我試的結果很奇怪,結果不太一定,大部分是BODY,有時候又會出現HTML、P、SPAN



※which

$(function() {
    $('input').keyup(function(e){
        alert(e.which);
    });
});
----------
<input />

※ctrlKey、shiftKey、altKey雖然官網沒寫,但javascript有,回傳布林值,可以用debugger查看,會看到非常多,官網可能只訂一些較常用的而已


※data

$(function() {
    for (var i = 0; i < $('div').length; i++) {
        $('div').eq(i).click({xxx: i}, function(e) {
            alert(e.data.xxx);
        });
    }
});
----------
<div>A</div>
<div>B</div>
<div>C</div>

※xxx名稱要對應好


※type

$(function() {
    $('div').click(function(e) {
        alert(e.type);
    });
});
----------
<div>A</div>
<div>B</div>
<div>C</div>

※回傳click


※namespace

$(function() {
    $('div').on('aaa.bbb.ccc', function(e) {
        alert(e.namespace);
    });
});
    
function testCustomEven(){
    $('div').trigger('aaa.bbb.ccc');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※回傳bbb.ccc


※result

$(function() {
    $('div').click(function() {
        return 'xxx';
    });
    
    $('div').click(function(e) {
        alert(e.result);
    });
});
----------
<div>div</div>

※回傳xxx;如果沒有寫第一個click,回傳undefined


※pageX、pageY

$(function() {
    $('html').click(function(e) {
        alert(e.pageX + ':' + e.pageY);
    });
});

※javascript是叫clientX、clientY,所以結果也是一樣

※javascript還有一組叫screenX、screenY,是包含整個螢幕的,所以數字和解析度一樣

2016年5月4日 星期三

瀏覽器事件、鍵盤事件、表單事件、滑鼠事件 (jQuery 14)

這篇都是上一篇的快速寫法,例如$('xxx').on('click', function(){});
快速寫法變成$('xxx').click(function(){});


※瀏覽器事件

官網連結

目前有三個:
.error():載入錯誤時
.resize():將視窗大小改變時
.scroll():右邊或下面有捲軸時,去按或用滑鼠的滾輪時


※.error()

$("img").error(function(){
    alert('我錯了!');
    $(this).hide();
}).attr("src", "Koala.bmp");
----------
<img src="xx.jpg" />

※img裡的src故意寫抓不到的名稱,這時會到attr抓圖,再沒有就會觸發


※.resize()

$(window).resize(function() {
    $('body').prepend('<div>' + $(window).height() + ':' + $(window).width() + '</div>');
});


※.scroll()

$(window).scroll(function () {
    $("div").css('color', 'red');
});
----------
<div>divdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdivdiv</div>

※移動視窗大小,使右邊或下面出現捲軸,去按或滾動滑鼠滾輪會觸發(沒出現捲軸沒用)



※鍵盤事件

官網連結

目前有三個:
.keydown():按下按鍵時觸發
.keypress():按下按鍵,按鍵到最底部時觸發
.keyup():按下按鍵,並彈回來時觸發


$("input").keypress(function(){
    alert('keypress');
});
    
$("input").keydown(function(){
    alert('keydown');
});
    
$("input").keyup(function(){
    alert('keyup');
});
    
$("input").keyup(function(){
    alert('keyup');
}).keydown(function(){
    alert('keydown');
}).keypress(function(){
    alert('keypress');
});
----------
<input />

※在IE 11和Chrome測試的結果一樣,keyup和其他兩個一起執行都不會觸發
只有寫一個keyup才會觸發

※最下面的寫法是將三個合起來寫,效果也是一樣,當然keyup也還是不會觸發



※表單事件

官網連結

目前有7個:
以下三個是一組的,都是聚焦時觸發,如進入input時,滑鼠游標會在裡面
.focus():最基本的
.focusin():最先執行
.focusout():最後執行

.blur():離開焦點時觸發,如離開input時,游標也不會在裡面
.change():很像.blur(),但只有內容改變時才會觸發

.select():就文字選起來時,如用滑鼠拖曳使背景變色就是選取,按兩下是選一個單字,也會觸發
.submit():表單提交時觸發


※.focus()相關

$(function(){
    $('input').focusin(function(){
        alert('1');
    });
    
    $('input').focus(function(){
        alert('2');
    });
    
    $('input').focusout(function(){
        alert('3');
    }); 
    
    $('input').blur(function(){
        alert('4');
    });
});
----------
<input />

※我將這四個順序弄亂,還是會按照1234的順序執行



※.select()

$(function(){
    $('form').submit(function(){
        alert('1');
    });
});
----------
<form>
    <input type="submit" />
</form>

※$('input').submit()是不會觸發的



※滑鼠事件

因為和其他事件差不多用法,就不貼範例了(hover例外)
.toggle():1.8過時;1.9移除了

.click():滑鼠按一下時觸發
.dblclick():滑鼠按二下時觸發
.contextmenu():按滑鼠右鍵時觸發

以下兩個比click還快
.mousedown():滑鼠按下時觸發
.mouseup():滑鼠按下並彈回時觸發

.mousemove():滑鼠移動時觸發
.hover():滑鼠進入離開時都會觸發

.mouseenter():滑鼠進入時觸發
.mouseover():滑鼠進入時觸發

.mouseleave():滑鼠離開時觸發
.mouseout():滑鼠離開時觸發


※滑鼠進入快到慢:mousemove-->hover-->mouseenter-->mouseover

※滑鼠離開快到慢:mousemove-->hover-->mouseleave-->mouseout


※.hover()

$(function() {
    $("p").hover(function () {
        $(this).css({'background-color' : 'green', 'color' : 'red'});
    }, function () {
        $(this).css({'background-color' : 'red', 'color' : 'green'});
    });
});
----------
<p>
    p
    <span>span</span>
    <span>span</span>
    <span>span</span>
</p>

※第一個function是進入時觸發,第二個是離開時觸發
如果只寫一個,則進入離開都觸發同一個

事件處理 (jQuery 13)

事件就是做了特定的事以後,會自動觸發的程式

除了複製程式碼外,比較不會錯的寫法:
1.$('xxx').xxxEventName();
2.在()裡面寫「function(){}」
3.在{}裡面按enter


官網連結
目前有12個:

以下4組都是挷定事件和解除事件,因版本的差異才會看起來這麼多
.live():1.7過時,1.9移除,舊版要使用delegate()來代替
.die():1.7過時,1.9移除,舊版要使用undelegate()來代替

.bind():效能比.on()慢
.unbind():效能比.off()慢

.delegate():1.7版被on()取代,可是並沒有寫過時和移除,但我試的結果是無效的,我用1.10.2測的
.undelegate():1.7版被off()取代,可是並沒有寫過時和移除,但我試的結果是無效的,我用1.10.2測的

.on():很像bind,但多個selector參數
.off():很像unbind,但多個selector參數


.one():和上面一樣,但只執行一次,所以也不會有解除事件的方法
.trigger():自定義的事件,會抓全部的自定名稱
.triggerHandler():自定義的事件,只會抓第一次的自定名稱
.jQuery.proxy():接收函數,返回新的函數



※.bind()、.unbind()、.on()、.off()

※基本使用

$(function() {
    $('button').on('click', function(){
        alert(this.tagName);
    });
});
    
function removeEvent(){
    $('button').off('click');
}
----------
<button>click me</button>
<input type="button" value="remove" onclick="removeEvent()" />

※也可以用bind配合off和on配合unbind


※參數

$(function() {
    $('button').on(
        'click', 
        {key1 : $('p:eq(0)').text(), key2 : $('p:eq(1)').text()}, 
        function(e){
            alert(e.data.key1 + ':' + e.data.key2);
        }
    );
});
----------
<button>click me</button>
<p>p1</p>
<p>p2</p>


※事件裡的元素

$(function() {
    $('div').on(
        'click', 
        'span', 
        function(e){
            alert($(this).text());
        }
    );
    
    $('div').on(
        'click', 
        'p', 
        function(e){
            alert($(this).text());
        }
    );
});
    
function removeDiv(){
    $('div').off('click');
}
    
function removeSpanOfDiv(){
    $('div').off('click', 'span');
}
----------
<span>span1</span>
<div>
    div1
    <p>
        p1
        <span>span2</span>
    </p>
</div>
<div>
    div2
    <p>
        p2
        <span>span3</span>
    </p>
</div>
<input type="button" value="removeDiv" onclick="removeDiv()" />
<input type="button" value="removeSpanOfDiv" onclick="removeSpanOfDiv()" />

※bind()的參數沒有什麼selector可以用,所以它會忽略這個參數


※多個事件

$(function() {
    $('input').on(
        {
            click : function(){
                alert('click');
            },
            mouseout : function(){
                alert('mouseout');
            },
            keydown :function(){
                alert('keydown');
            }
        }
    );
});
----------
<input />



※.trigger()

※和內鍵事件配合使用

$(function(){
    $('div').on('click', function() {
        alert($(this).text());
    });
});
    
function testCustomEven(){
    $('div').trigger('click');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※除了點一下會觸發外,按下按鈕也會觸發


※自定名稱

$(function(){
    $('div').on('xxx', function() {
        alert($(this).text());
    });
});
    
function testCustomEven(){
    $('div').trigger('xxx');
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>

※xxx是自定義的,所以只剩按下按鈕會觸發


※傳參數

$(function(){
    $('div').on('xxx', function(e, p1, p2) {
        alert(p1 + ':' + p2);
    });
});
    
function testCustomEven(){
    $('div').trigger('xxx', ['ooo', 'xxx']);
}
----------
<div>div</div>
<button onclick="testCustomEven()">fire</button>



※.triggerHandler()

$(function(){
    $('#o').on('click', function() {
        alert('o');
    });
    
    $('#x').on('click', function() {
        alert('x');
    });
});
    
function testCustomEven(){
    $('[id]').trigger('click');
    // $('[id]').triggerHandler('click');
}
----------
<input id="o" value="ooo" />
<input id="x" value="xxx" />
<button onclick="testCustomEven()">fire</button>

※按下按鈕後,會發現用triggerHandler只會傳回一筆,我試的結果是抓到HTML的順序排在前面的;而trigger會全部都抓

※官網還有說,用了triggerHandler後,原本的行為就不會觸發了
如click是按一下觸發,但用了triggerHandler後,原本的行為不會觸發(就好像上面的例子可以自定名稱,但想要定的名稱內鍵剛好也有),可是我試的結果用IE 和 Chrome按一下(click)都還是會觸發



※$.proxy()

$(function(){
    $('button').on('click', $.proxy(a.a2, a));
    $('button').on('click', $.proxy(a, 'a2'));
    
    $('button').on('click', $.proxy(b.b2, b, {ooo:'o', xxx:'x'}));
    $('button').on('click', $.proxy(b, 'b2', {ooo:'o', xxx:'x'}));
});
    
var a = {
    a1: "a1",
    a2: function(event) {
        alert(this.a1);
    }
};
    
var b = {
    b1: "b1",
    b2: function(p, event) {
        alert(p.ooo);
        alert(p.xxx);
    }
};
----------
<button>click me</button>

※一共有四種用法
$.proxy(function, context)
$.proxy(context, name):name是個字串,是context的屬性
context其實就是一個物件;另外兩種是1.6才加的,就是在最後面多個傳參數

※1.9版後,context給null或undefined,會轉換成this

2016年5月1日 星期日

開發常會用到的 checkbox、radio、select (jQuery 12)

※checkbox和radio

尤於Web開發的checkbox和radio常常會用到,下面就寫一個判斷、取值的範例
裡面有些方法還沒介紹到,後面還會再介紹


function displayCheckbox(){
    var count = $("input[name='alphabeta']:checked").length;
    alert('checkbox勾了' + count + '個!');
    // alert($("input[name='alphabeta']:checked").val());
    
    alert($("input[name='alphabeta']").eq(0).val());
    alert($("input[name='alphabeta']:eq(0)").val());
    
    var $alphabeta = $("input[name='alphabeta']");
    for(var i=0; i<$alphabeta.length; i++){
        if($alphabeta.get(i).checked == 1){
            alert('是' + $alphabeta.get(i).value);
            alert('是' + $("input[name='alphabeta']:eq(" + i +")").val());
        }
    }
}
    
function displayRadio(){
    var count = $("input[name='zoo']:checked").length;
    
    if(count != 0){
        alert('選的是' + $("input[name='zoo']:checked").val());
    } else {
        alert('沒選radio!');
    }
}
----------
<input type="checkbox" name="alphabeta" value="A" checked="checked">
<input type="checkbox" name="alphabeta" value="B">
<input type="checkbox" name="alphabeta" value="C">
    
<input type="radio" name="zoo" value="monkey" id="m">
<input type="radio" name="zoo" value="dog" id="d">
<input type="radio" name="zoo" value="pig" id="p">
    
<input type="button" value="checkCheckbox" onclick="displayCheckbox()">
<input type="button" value="checkRadio" onclick="displayRadio()">

※註解那一行只會取到第一筆,radio的name一樣只會取到一筆,所以可以用;但checkbox就不適合了

※寫法有很多種



※select

※select單選

$(function($) {
    $('option').eq(2).prop('selected', 'selected');
    $('option').eq(3).hide();
    $('option').each(function(){
        if($(this).is(':selected')){
            alert($(this).text());
        }
    });
});
----------
<select>
    <option value="a">A</option>
    <option value="b">B</option>
    <option value="c">C</option>
    <option value="d">D</option>
    <option value="e">E</option>
</select>


※select多選

$('option').each(function(i){
    if(i % 2 == 0){
        $(this).prop('selected', 'selected');
        // $(this).hide();
    }
});
----------
<select  multiple="multiple">
    <option value="a">A</option>
    <option value="b">B</option>
    <option value="c">C</option>
    <option value="d">D</option>
    <option value="e">E</option>
</select>

雜項遍歷 (jQuery 11)

官網連結
目前有6個:

.not():基本過濾器 (jQuery 6)已講過
.add():增加選擇的結果
.addBack():增加上一個選擇的結果
.contents():取得元素的子元素,和內容過濾器的「:contents」不一樣,裡面不能放參數
.end():回上一層
.andSelf():包括自己,1.8把它標識為過時了,是過時不是移除,所以還能用


※.add()

$('span, p').css('color', 'red');
$('span').add('p').css('color', 'red');
$('span').css('color', 'red').add('p').css('background-color', 'green');
----------
<div>
    <span>A</span>
    <span>B</span>
    <span>C</span>
</div>
<p>p</p>

※第一行是抓元素是span和p;第二行是抓span,然後將p抓進來,所以效果一樣

※第三行抓span先設定顏色再將p抓進來,所以p沒有變紅,一直到後面的綠底會針對全部的元素設定,如果css裡的屬性一樣,後者會蓋前者



※.addBack()

$("div.a").find("p").css('background-color', 'green');
$("div.a").find("p").addBack().css('background-color', 'green');
----------
<div class="A">
    <p>
        <strong>
            1
            <code>2</code>
        </strong>
    </p>
    
    <div class="a">
        3
        <p>4</p>
        <p>5</p>
    </div>
</div>

※第一行還沒加addBack()時,只抓到4和5

※加了之後,會抓到345,也就是抓到$('div.a'),所以才叫addBack



※.contents()

$(function($) {
    $('div').contents().filter(function(){
        alert($(this).text());
        return true;
    }).css('background-color', 'green');
});
----------
<div>
    div1
    <span class="a">span</span>
    div2
    <p class="b">p</p>
    div3
    <ul>
        <ol>1</ol>
        <ol>2</ol>
    </ul>
    div4
</div>

※取得div的子元素,所以div1~4不會被選中,其他都會



※.end()

$("div").find("p").find('span').css('color', 'red');
$("div").find("p").find('span').end().css('color', 'red');
$("div").find("p").find('span').end().end().css('color', 'red');
----------
<div>
    div
    <p>
        p
        <span>span</span>
    </p>
</div>

※.end()是回上一層

※第一行沒用end()時,抓到的是span而已

※第二行用了一個end(),所以回到上一層p,抓到的是p和span

※第三行用了兩個end(),所以回到上兩層div,抓到的是div、p、span



※.andSelf()

$('span:eq(2)').nextAll().andSelf().css('color', 'red');
----------
<span>A</span>
<span>B</span>
<span>C</span>
<span>D</span>
<span>E</span>

※結果是CDE;若沒加andSelf(),結果會是DE