顯示具有 jQuery 標籤的文章。 顯示所有文章
顯示具有 jQuery 標籤的文章。 顯示所有文章

2016年10月21日 星期五

公用:proxy (jQuery31)

※proxy

代理事件的東西
有四種方式


※第一個參數是functon,第二個參數是context(物件)

$(function(){
    var me = {
        type: "me",
        test: function(event) {
            $(event.target).css("background-color", "red");
            $("div").append(this.type + "<br>" );
            $("button").unbind("click", this.test);
        }
    };
    
    var you = {
        type: "you",
        test: function(event) {
            $("div").append(this.type + " ");
        }
    };
    
    $("button")
        .on("click", $.proxy(me.test, me)) // 只執行一次,因為被unbind了
        .on("click", $.proxy(you.test, you)) // you-->都是自己的,很好理解
        .on("click", $.proxy(you.test, me)) // me-->右邊是me,type抓的是me的
        .on("click", you.test); // button-->按鈕的type
});
----------
<button type="button">Test</button>
<div></div>

※


※第一個參數是context(物件),第二個參數是string

$(function(){
    var obj = {
        name: "John",
        xxx: function() {
            $("p").append(this.name);
            $("button").off("click", obj.test);
        }
    };
    
    $("button").on("click", $.proxy(obj, "xxx"));
});
----------
<button>Test</button>
<p></p>

※第二個參數要對應到第一個參數物件裡的名字才有效



※其他方式

第三種和第四種方式是給第三個參數(可以給很多,類似java的「…」),是給第二個參數用的
這裡以第二個參數是物件為例
$(function(){
    var me = {
        type: "dog",
        test: function(one, two, event) {
            $("p")
                .append(one.type + '<br />') // cat
                .append(two.type + '<br />') // fish
                .append(event.type + '<br />') // click
                .append(this.type + '<br />') // dog
                .append(event.target.type + '<br />'); // submit
        }
    };
    
    var you = {type: "cat"};
    var they = {type: "fish"};
    $("button").on("click", $.proxy(me.test, me, you, they));
});
----------
<button>Test</button>
<p></p>

※event.target.type 這個我不懂

公用:grep、contains、merge、map、noop、now、trim、type、unique (jQuery30)

※grep

$(function(){
    var rtn = $.grep([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1], function(element, index){
        console.log(index + '=' + element);
        return (element != 5 && index > 4);
    },false);
    alert(rtn);
    // 第三個參數是false或不給,結果為 6,7,8,9,8,7,6,4,3,2,1
    // 第三個參數是true,結果為 1,2,3,4,5,5 也就是上一行的相反
    
    var rtn = $.grep([{'a':1, 'b':2}, {'c':3, 'd':4}, 'e', 5], function(element, index){
        console.log('index=' + index);
        if($.isPlainObject(element)){
            for(e in element){
                console.log(e); // a b c d
            }
        } else {
            console.log(element); // e 5
        }
    });
});

※過濾陣列用的,如果過濾物件不會出錯,但好像沒有執行一樣



※contains

$(function(){
    console.log($.contains(document.documentElement, document.body)); // true
    console.log($.contains(document.body, document.documentElement)); // false
    console.log($.contains(document.getElementsByTagName("div"), document.getElementsByTagName("span"))); // false
});
----------
<div>
    <span></span>
</div>

※右邊的參數是否被左邊的參數包括,這個我不太懂



※merge

$(function(){
    console.log($.merge([0,1,2], [2,3,4])); // [0, 1, 2, 2, 3, 4]
    console.log($.merge([], [2,3,4] ));  // [2, 3, 4]
    console.log($.merge($.merge([0,1,2], [2,3,4]), [4,5,6])); // [0, 1, 2, 2, 3, 4, 4, 5, 6]
    
    var test = $.merge([0,{1:function(){return 'x'}},{2:'two'}], [{2:'owt'},3,{1:function(){return 'o'}}]);
    for(t in test){
        if($.isPlainObject(test[t])){
            for(tt in test[t]){
                console.log(test[t][tt]);
            }
        } else {
            console.log(test[t]); 
        }
    }
});

※將兩個陣列合併



※map

$.map(['a','b','c'], function(val, index) {
    console.log('val=' + val); // a b c
    console.log('index=' + index); // 0 1 2
});
    
$.map({'a':1,'b':2,'c':3}, function(val, index) {
    console.log('val=' + val); // 1 2 3
    console.log('index=' + index); // a b c
});

※用法和each一樣



※noop、now、trim

console.log($.noop);// function(){}
console.log($.noop()); // undefined
console.log($.now); // function(){return (new Date()).getTime();}
console.log($.now()); // long的數字
    
var $trim = $.trim('  1 2 3  ');
console.log($trim); // 1 2 3
console.log($trim.length); // 5

※



※type

console.log($.type()); // undefined
console.log($.type(undefined)); // undefined
console.log($.type(window)); // object
console.log($.type(null)); // null
    
console.log('----------');
console.log($.type(true)); // boolean
console.log($.type(3)); // number
console.log($.type("test")); // string
console.log($.type(function(){} )); // function
console.log($.type([])); // array
    
console.log('----------');
console.log($.type({})); // object
console.log($.type(new Date())); // date
console.log($.type(new Error())); // error
console.log($.type(/test/)); // regexp

※



※unique

$(function(){
    var divs = $("div").get();
    console.log(divs.length); // 5
    console.log($.unique(divs).length); // 5
    
    divs = divs.concat($(".d").get());
    console.log(divs.length); // 7
    var xxx = $.unique(divs);
    console.log(xxx.length); // 5
    
    $('input[type="button"]').one('click', function(){
        $('p').append(xxx);
    });
});
----------
<div>d1</div>
<div class="d">d2</div>
<div>d3</div>
<div class="d">d4</div>
<div>d5</div>
<input type="button" value="click me"/>
<p>p</p>

※

2016年10月20日 星期四

公用:globalEval、makeArray、inArray (jQuery29)

※globalEval、eval 的差異

和javascript的eval很像,但是全域的

$(function(){
    test();
});
    
function test(){
    $.globalEval('var xxx = 2;');
    eval('var ooo = 3;');
    console.log('init xxx=' + xxx);
    console.log('init ooo=' + ooo);
}
    
function after(){
    console.log('after xxx=' + xxx);
    // console.log('after ooo=' + ooo); // 執行時錯誤
}
----------
<input type="button" value="click me" onclick="after()" />

※註解那行打開會發生錯誤,因為並不是全域的



※makeArray

故名思義,就是用來產生陣列的

$(function(){
    var arr = $.makeArray($('span'));
    // alert(arr[0].childNodes[0].data);
    // debugger;
    $.each(arr, function(i, v){
        console.log('v=' + v.childNodes[0].data); // s1-->s2
    });
});
----------
<span>s1</span>
<div>d1</div>
<span>s2</span>
<div>d2</div>



※makeArray 使用多層時

$(function(){
    $.each($.makeArray($('li')).reverse(), function(i, v){
        console.log('v=' + v.childNodes[0].data); // s1-->s2
    });
});
----------
<ul>
    U1
    <li>L1</li>
    <li>L2</li>
    <li>
        L3
        <ul>
            U2
            <li>L4</li>
            <li>L5</li>
        </ul>
    </li>
</ul>

※結果如以下畫面


※會發現L3前後都空很大,這是因為HTML有換行的關係,改成以下就不會了

<ul>
    U1
    <li>L1</li>
    <li>L2</li>
    <li>L3<ul>
            U2
            <li>L4</li>
            <li>L5</li>
        </ul>
    </li>
</ul>



※inArray、indexOf 的差異

var str = "abc cba array abc cba";
console.log($.inArray("b", str)); // 1
console.log($.inArray("b", str, 5)); // 5
console.log($.inArray("b", str, -8)); // 15
console.log($.inArray("x", str)); // -1
    
console.log(str.indexOf('b')); // 1
console.log(str.indexOf('b', 5)); // 5
console.log(str.indexOf('b', -8)); // 1
console.log(str.indexOf('x')); // -1
    
console.log($.inArray("ab", str)); // -1
console.log($.inArray("ab", str, 5)); // -1
console.log($.inArray("ab", str, -8)); // -1
    
console.log(str.indexOf('ab')); // 0
console.log(str.indexOf('ab', 5)); // 14
console.log(str.indexOf('ab', -8)); // 0
    
console.log($.inArray("abc", str)); // -1
console.log($.inArray("abc", str, 5)); // -1
console.log($.inArray("abc", str, -8)); // -1
    
console.log(str.indexOf('abc')); // 0
console.log(str.indexOf('abc', 5)); // 14
console.log(str.indexOf('abc', -8)); // 0
    
console.log($.inArray("John", [ 4, "Pete", 8, "John" ])); // 3
console.log($.inArray("Joh", [ 4, "Pete", 8, "John" ])); // -1
    
console.log([ 4, "Pete", 8, "John" ].indexOf("John")); // 3
console.log([ 4, "Pete", 8, "John" ].indexOf("Joh")); // -1

※inArray可以有第三個參數,沒有寫預設是0,表示從第一個字開始找

※用在搜尋字串且找一個字時:相同的地方是
使用正數時,還有找不到時都是-1,只有負數不同

※搜尋兩個字或一個單字時,inArray都是-1,也就是不支援;但indexOf有支援

※搜尋陣列時,inArray和indexOf都一樣

公用:each、isXXX、parseXXX (jQuery28)

※$.each 

就是迴圈

$(function(){
    $.each(['a', 'b', 'c'], function(i, v){
        console.log('i=' + i);
        console.log('v=' + v);
    });
    //0 a-->1 b-->2 c
    
    $.each({'a':'one', 'b':'two', 'c':'three'}, function(i, v){
        console.log('i=' + i);
        console.log('v=' + v);
    });
    //a one-->b two-->c three
    
    $.each({'a':{a1:1}, 'b':'two', 'c':{c3:3}}, function(i, v){
        console.log('i=' + i);
        if($.isPlainObject(v)){
            for(vc in v){
                console.log('vc=' + vc);
                console.log('v[vc]=' + v[vc]);
            }
        } else {
            console.log('v=' + v);
        }
    });
    // a a1 1-->b two-->c c3 3
});

※如果只有value,那第一個參數就是index



※$.isXXX 

isXXX都是判斷用的方法,目前有以下七種

1.$.isArray():是否是陣列
2.$.isEmptyObject():是否是空物件
3.$.isFunction():是否是function
4.$.isNumeric():是否是數字
5.$.isPlainObject():是否是物件
6.$.isWindow():是否是window物件
7.$.isXMLDoc():是否是XML文件



※isPlainObject、isArray、isEmptyObject

console.log($.isPlainObject({a:1, b:2})); // true
console.log($.isPlainObject([1,2,3])); // false
console.log($.isPlainObject({})); // true
console.log($.isPlainObject([])); // false
console.log($.isPlainObject({a:[4,5,6], b:[7,8,9]})); // true
console.log($.isPlainObject([{c:3}, {d:4}])); // false
console.log($.isPlainObject(function(){})); // false
    
console.log($.isArray({a:1, b:2})); // false
console.log($.isArray([1,2,3])); // true
console.log($.isArray({})); // false
console.log($.isArray([])); // true
console.log($.isArray({a:[4,5,6], b:[7,8,9]})); // false
console.log($.isArray([{c:3}, {d:4}])); // true
console.log($.isArray(function(){})); // false
    
console.log($.isEmptyObject('')); // true
console.log($.isEmptyObject("")); // true
console.log($.isEmptyObject({})); // true
console.log($.isEmptyObject([])); // true
console.log($.isEmptyObject(function(p){})); // true
console.log($.isEmptyObject(function(){var a = 5; return a + 5})); // true

※{}就是物件;[]就是陣列

※要注意判斷空物件時的function,裡面明明有東西,但還是true



※isFunction

function aFunction(){}
var bFunction = function(){}
var cFunction = new Function();
// var dFunction = (x) => {}
    
console.log($.isFunction(aFunction)); // true
console.log($.isFunction(bFunction)); // true
console.log($.isFunction(cFunction)); // true
// console.log($.isFunction(dFunction)); // true
console.log($.isFunction(function(){})); // true

※注解的部分是IE不支援



※isNumeric、isWindow

console.log($.isNumeric(+10)); // true
console.log($.isNumeric("-10")); // true
console.log($.isNumeric(0144)); // true 
console.log($.isNumeric(0xFF)); // true
console.log($.isNumeric("0xFF")); // true
console.log($.isNumeric("8e5")); // true
console.log($.isNumeric(3.1415)); // true
    
console.log($.isWindow(window)); // true
console.log($.isWindow(document)); // false

※注意判斷數字時,其他進位也有支援



※isXMLDoc、parseXML

console.log($.isXMLDoc('<xxx></xxx>')); // false
console.log($.isXMLDoc($.parseXML('<xxx></xxx>'))); // true
console.log($.isXMLDoc($.parseXML('<xxx />'))); // true

※經過parseXML後,才是XML,就算字串裡有加xml第一行的version1.0之類的結果也是一樣,反正裡面就是字串



※parseXXX

目前有三種
1. parseXML:轉成XML,上個範例已有,以下就不寫了
2.parseJSON:轉成JSON
3.parseHTML:轉成HTML


※parseJSON

// alert($.parseJSON('{a:1}').a); // 執行時錯誤
// alert($.parseJSON("{'a':1}").a); // 執行時錯誤
alert($.parseJSON('{"a":1}').a); // 1
// alert($.parseJSON('["a":1]').a); // 執行時錯誤
// alert($.parseJSON('{"a":"1\t2"}').a); // 執行時錯誤
alert($.parseJSON(null)); //null
alert($.parseJSON(undefined)); // 1.9之前null,之後執行時錯誤

※只有雙引號才可以,其他就只有null不會報錯


※parseHTML

<div id="log" />
----------
var html = $.parseHTML("hello, <b>my name is</b> jQuery.");
$("#log").append(html);
    
$.each(html, function(i, v) {
    console.log(i); // 0-->1-->2
    console.log(v); // hello,--><b>my name is</b>-->jQuery.
    console.log('-----');
});

※append時,轉不轉成HTML都可以,但如果不轉成HTML,用each會執行錯誤

※還有第二、三個參數可用,我沒研究

2016年10月13日 星期四

幫助方法、全域Ajax事件處理器 (jQuery25)

官網連結

※幫助方法

就是serialize和 serializeArray
serialize可將form變成字串的形式
serializeArray可將form變成name、value的形式,回傳JSON物件(不是JSON字串),

<form action="xxx/ooo" method="post">
    使用者:
    <input type="text" name="username" value="user" /><br />
    密碼:
    <input type="password" name="password" value="pass" /><br />
    
    <input type="radio" name="ra" value="r1" />
    <input type="radio" name="ra" value="r2" />
    <input type="radio" name="ra" value="r3" checked="checked" /><br />
    
    <input type="checkbox" name="ch" value="c1" checked="checked" />
    <input type="checkbox" name="ch" value="c2" checked="checked" />
    <input type="checkbox" name="ch" value="c3" /><br />
    
    <select name="se">
        <option>s1</option>
        <option selected="selected">s2</option>
        <option>s3</option>
    </select>
    <br />
    
    <input type="button" value="serialize" onclick="serialize()" /><br />
    <input type="button" value="serializeArray" onclick="serializeArray()" /><br />
</form>
    
<span id="span1"></span><br />
<span id="span2"></span>
-----
$(function(){
    $('#span1').text($("form").serialize());
    console.log($("form").serialize()); // username=user&password=pass&ra=r3&ch=c1&ch=c2&se=s2
    
    $('#span2').text($("form").serializeArray());
    console.log($("form").serializeArray()); // [Object, Object, Object, Object, Object, Object]
    
    $.each($("form").serializeArray(), function(i, f){
        console.log("name=" + f.name);
        console.log("value=" + f.value);
    });
});


因為serializeArray印出來是Object,所以可以用$.each印出來



官網連結

※全域Ajax事件處理器

目前共6種
由上往下執行,ajaxError、ajaxSuccess只會執行其中之一,global設false不會執行
.ajaxStart():一開始就會執行
.ajaxSend():開始發送會執行
.ajaxError():失敗時執行
.ajaxSuccess():成功時執行
.ajaxComplete():完成時執行
.ajaxStop():結束執行


var ajaxTest = function(){
    $.ajax({
        url : "xxx",
        type : "POST",
        // dataType: 'abc',
        data : $.param({ 
                    username: $('input[name="username"]').val(), 
                    password: 'p' 
                }),
        success : function(data, textStatus, jqXHR){
            console.log('data=' + data);
            console.log('textStatus=' + textStatus);
        }
    });
}
    
function setGlobalFalse(){
    $.ajaxSetup({
        global : false
    });
}
    
$(document).ajaxStart(function() {
    alert('start');
});
    
$(document).ajaxSend(function() {
    alert('send');
});
    
$(document).ajaxError(function() {
    alert('error');
});
    
$(document).ajaxSuccess(function() {
    alert('success');
});
    
$(document).ajaxComplete(function() {
    alert('complete');
});
    
$(document).ajaxStop(function() {
    alert('stop');
});
----------
<h3>${success}</h3>
<form action="xxx/ooo" method="post">
    使用者:
    <input type="text" name="username" value="user" /><br />
    密碼:
    <input type="password" name="password" value="pass" /><br />
    <input type="submit" />
</form>
    
<input onclick="ajaxTest()" type="button" value="test" />
<input onclick="setGlobalFalse()" type="button" value="globalFalse" />

※這範例是成功的,所以ajaxSuccess會跳出來;將dataType打開會失敗,所以ajaxError跳出來

※將globalFalse的按鈕按下後,都不會觸發了

※注意官網有說版本的問題,我沒有測

2016年7月9日 星期六

ajax低階介面、快速方法 (jQuery24)

官網連結

※ajax()

@WebServlet(urlPatterns = { "/xxx" })
public class XxxServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        PrintWriter out = resp.getWriter();
        // try {
        //     Thread.sleep(2000);
        // } catch (InterruptedException e) {
        //     e.printStackTrace();
        // }
        out.print("username=" + req.getParameter("username") + "<br />");
        out.print("password=" + req.getParameter("password"));
    }
}
----------
var ajaxTest = function(){
    $.ajax({
        url : "xxx",
        type : "POST",
        // data : {
        //        username:'u', 
        //        password:$('input[name="password"]').val()
        //        },
        // async : false,
        data : $.param({ 
                    username: $('input[name="username"]').val(), 
                    password: 'p' 
                }),
        success : function(data, textStatus, jqXHR){
            alert(data); // username=user<br />password=p
            alert(textStatus); // success
            for(xhr in jqXHR){
                alert('xhr=' + xhr); // readyState、getResponseHeader、getAllResponseHeaders、setRequestHeader、overrideMimeType、statusCode、abort、state、always、then、promise、pipe、done、fail、progress、complete、success、error、responseText、status、statusText
                // alert('jqXHR[xhr]=' + jqXHR[xhr]);
            }
        }
    });
    alert('think');
}
----------
<form action="xxx" method="post">
    使用者:<input type="text" name="username" value="user" /><br />
    密碼:<input type="password" name="password" value="pass" /><br />
    <input type="submit" />
</form>
<input onclick="ajaxTest()" type="button" value="test" />

※最下面的form不是ajax,是一般的寫法,整批一起丟到controller

※按鈕test是ajax寫法,async預設是true,是非同步,至少要有url和type才可以運作(雖然預設是GET,但我不寫就是不行),但總是要看結果回傳什麼,所以我加了success;而data是傳過去的json資料,「:」左邊等同name名稱,controller是抓這個名稱的
data我用了兩種方法

※如果將async設為false,就是同步

※注意think印出的時機,如果沒將controller的sleep打開,我試的結果它都是最後執行
但打開時,也就是停2秒,這兩秒的意思是模擬後端有很多工作
這時async為true時think會先執行,所以才叫非同步;false就變成最後執行,所以才叫同步

※另外還有可能會用到的還有error和statusCode,其他就很少用到了,要用時再研究



※ajaxPrefilter()、ajaxSetup()

var ajaxTest = function(){
    $.ajaxSetup({
        config1: 123,
        config2: "c2",
        config3: false,
        config4: 4.5,
        config5: {'c1': 1, 'c2': false},
        url: "zzz"
    });
    
    $.ajaxPrefilter(function(options, originalOptions, jqXHR) {
        alert(options.url);//xxx
        options.url = "http://localhost:8080/TestServletXXX/xxx/ooo/zzz";
        alert(options.url);
    
        alert('options=' + options);
        alert('config1=' + options.config1); // 123
        alert('config5=' + options.config5.c2); //false
    
        for(o in options){
            alert('o=' + o); // url、type、isLocal、global、processData、async、contentType、accepts、contents、responseFields、converters、flatOptions、jsonp、jsonpCallback、xhr、data、success、dataTypes、crossDomain
        }
    
        for(oo in originalOptions){
            alert('oo=' + oo); // url、type、data、success
        }
    });
    
    $.ajax({
        url : "xxx",
        type : "POST",//async : false,
        data : $.param({ 
                    username: $('input[name="username"]').val(), 
                    password: 'p' 
                }),
        success : function(data, textStatus, jqXHR){
            // ...
        }
    });
    alert('think');
}

※使用ajaxPrefilter表示要在$.ajax前過濾,所以將$.ajax註解後,ajaxPrefilter也不會執行

※ajaxPrefilter的第一個參數是個選項,可以是xml html text json jsonp script,預設是「*」,像上面的範例,是沒有第一個參數的,這個參數表示還要特定的類型才會過濾,也就是說$.ajax有一個dataType的屬性,兩個對應才會過濾,隨便打也行,兩個有對應就ok

※ajaxSetup是設定options用的,在ajaxPrefilter的第二個參數的第一個option去點就有了,可以用自訂的、也可以用options本來就有的
理論上ajaxSetup是設options的預設值,我設sync有成功,但url居然失敗了,不知道為什麼,而致於其他的我也沒試

※像上面的ajaxPrefilter,我在呼叫前過濾一下,將xxx轉成另外一支叫xxx/ooo/zzz的servlet了



※ajaxTransport

$.ajaxTransport('abc', function(options, originalOptions, jqXHR) {
    for(o in options) {
        alert('o=' + o); // url、type、isLocal、global、processData、async、contentType、accepts、contents、responseFields、converters、flatOptions、jsonp、jsonpCallback、xhr、dataType、data、success、dataTypes、crossDomain、hasContent
    }
    
    for(oo in originalOptions) {
        alert('oo=' + oo); // url、type、dataType、data、success
    }
    
    for(xhr in jqXHR) {
        alert('xhr=' + jqXHR.xhr);// readyState、getResponseHeader、getAllResponseHeaders、setRequestHeader、overrideMimeType、statusCode、abort、state、always、then、promise、pipe、done、fail、progress、complete、success、error、[Object object]、completeCallback=function done(...
    }
    
    return {
        send: function(headers, completeCallback) {
            alert('headers=' + headers);
            alert('completeCallback=' + completeCallback);
        },
    
        abort: function() {
            alert('abort function');
        }
    };
});


※ajaxTransport的第一個參數是必填,否則不會執行,所以$.ajax的dataType也要一樣才會執行

※這個功能是用在ajaxPrefilter也無法滿足需求時,實際的用法我也不清楚



※快速方法

官網連結

※post、get、getJSON

$.post(
    'xxx', 
    $.param({ 
        username: $('input[name="username"]').val(), 
        password: 'p' 
    }),
    function(data, textStatus, jqXHR){
        alert(data);
        alert(textStatus);
        alert(jqXHR);
    },
    'html'
);

※總共4個參數,第一個參數一定要,其他都是選項,最後一個參數是dataType,就是從server返回的格式是哪一種,如xml、json、script、text、htm,不給的話會自己猜測

※和另外一個$.get完全一樣,只差在要對應後端的doGet

※$.getJSON,差在沒有最後的dataType參數,因為就是json


※load

$('input[name="username"]').load(
    'xxx', 
    $.param({ 
        username: $('input[name="username"]').val(), 
        password: 'p' 
    }),
    function(responseText, textStatus, XMLHttpRequest){
        alert(responseText);
        alert(textStatus);
        alert(XMLHttpRequest.status);
        alert(XMLHttpRequest.statusText);
    }
);

※事件也有一個方法叫load,兩個是不一樣的

※總共3個參數,第一個參數一定要,其他都是選項


※getScript

$.getScript(
    'xxx.js', 
    function(script, textStatus, jqXHR){
        alert(script);
        alert(textStatus);
        alert(jqXHR);
    }
);

※前面的一定要連到server,這個不用

※第一個參數抓javascript,像我是將xxx.js和寫getScript這一支放在同一個目錄,所以這樣子就抓到了

※總共2個參數,第一個參數一定要

2016年7月4日 星期一

特效:客製化 (jQuery23)

官網連結

目前有10個
.animate:動畫的老大

.queue():將一小段動畫放在一起,很多個時,就可以組成很多的queue
.dequeue():有寫這行才會跳到下一個queue,最後一個queue在最後下dequeue並不會跑回第一個queue
.clearQueue():按下後,queue會將目前的queue跑完才停止,但不做下一個queue
.stop():按下後,queue馬上停止並做下一個queue
.finish():按下後,會直接將queue做完,但只會執行.animate的部分
.delay():可以延遲指定的時間

jQuery.fx.interval:動畫的頻率,預設是13,單位是毫秒
jQuery.fx.off:是否將動畫關閉的功能,預設是false,寫個按鈕,內容是「$.fx.off = true;」,會發現按下後,動畫不是沒作用,是直接到最後的結果;但如果動畫執行到一半,看似沒有作用,其實是要等下一次才有作用
jQuery.speed:看起來和animate很像,感覺是能和animate分開,官方說在jQuery UI的addClass找到範例,看官網首頁最上面黃色很像U的就是jQuery UI,左邊真的有addClass,而右邊還有一些動畫的方法,但我就是沒找到範例



※animate

$(function(){
    $('#xxx').click(function() {
        $('span').animate({
            opacity: 0.25,
            left: "+=50",
            height: "toggle"
        }, 3000, function() {
            alert('success!');
        });
    });
});
----------
<div id="xxx" style="background-color:lightblue;">div</div>
<span>s1</span>
<span>s2</span>

※還有很多,看官網



※queue、dequeue、clearQueue、stop、finish、delay

$(function(){
    $('#start').click(function(){
        // 看過程
        $('div').show('fast');
    
        // 往右200
        $('div').animate({left:'+=200'}, 1000);
        $('div').queue(function () {
            $(this).css('background-color', 'yellow');
            $(this).dequeue();
        });
    
        // 往左200
        $('div').animate({left:'-=200'}, 1000);
        $('div').queue(function () {
            $(this).css('background-color', 'red');
            $(this).dequeue();
        });
    
        // 往右500
        $('div').animate({left:'+=500'}, 2000);
        $('div').queue(function () {
            $(this).css('background-color', 'pink');
            // $(this).dequeue();
        });
    });
    
    $('#clearQueue').click(function(){
        $('div').clearQueue();
    });
    
    $('#stop').click(function(){
        $('div').stop();
    });
    
    $('#finish').click(function(){
        $('div').finish();
    });
});
----------
<input id="start" type="button" value="開始" />
<input id="clearQueue" type="button" value="clearQueue" />
<input id="stop" type="button" value="stop" />
<input id="finish" type="button" value="finish" />
<br><br>
<div style="background-color:green; height:50px; width:50px; left:5px; top:40px; position:absolute;"></div>

※按此範例開始鈕第二次後,div會從最後結束的地方開始

※$('div').slideUp(1000).delay(2000).fadeIn(1000);會發現delay的功能

2016年5月20日 星期五

特效:基本、淡入淡出、滑動 (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月12日 星期四

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,是包含整個螢幕的,所以數字和解析度一樣