2017年5月26日 星期五

$.closestChildren 找到符合過濾條件最接近的子孫

 //for backbone(取代 find)
(function ($) {
    // 找到符合過濾條件最接近的子孫
    $.fn.closestChildren = function (selector) {
        debugger;
        var self = this;
        this.each(function (i, dom) {

            $find = $.closestChildren(dom, selector);
            self[i] = $find.get(0);
        });
        /*------------------------------------*/
        var resultList = this.toArray().filter(function (item) {
            return (item != null);
        });
        for (var i = 0; i < this.length; i++) {
            if (resultList[i]) {
                this[i] = resultList[i];
            } else {
                delete this[i];
            }
        }

        this.length = resultList.length;
      
        return this;
    };
    /* ====================================================================== */
    $.closestChildren = function (dom, selector) {
        var domList = [];
        var target = find(dom);
        /* ---------------------------------- */
        if (target.length) {
            // 第一輪就找到
        } else {
            // 廣域搜尋
            for (var i = 0; i < domList.length; i++) {
                target = find(domList[i]);
                if (target.length > 0) {
                    break;
                }
            }
        }
        /* ---------------------------------- */
        function find(dom) {
            var $findList = $(dom).children(selector);

            if ($findList.length) {
                // 有找到
            } else {
                // 沒找到
                var childList = $(dom).children().toArray();
                domList = domList.concat(childList);
            }
            return $findList;
        }

        domList = [];
        return target;
    };
})(jQuery);

(js)編寫含式變項,常會遇到的問題

function test_1() {
            var data = {};

            var y;
            if(data.age){
                    y = data.age;
            }else{
                y = 5
            }

            alert(y);
        }

        function test_2() {
            var data = [];

            var y;

             if(data[0]){
                 y = data[0];
             }else{
                 y = 5;
             }

            alert(y);
        }

function test_3() {           
            var data;

            var y;

            // 以下不行
            if(data.age){
                    y = data.age;
            }else{
                y = 5
            }

            alert(y);
        }

2017年5月25日 星期四

alert視窗如何換行?

在要斷行的地方插入一個 "\n" , 要斷幾行就插幾個 "\n

<script>
alert("第一行\n第二行\n\n第四行")
</script>

2017年5月18日 星期四

backbone 模組事件

Model >>

change
change:attriubute

destory

invalid
-------------------------------------------------------------

Collection >>

add
remove
reset
sort
change
change:attribute

默默更新數據,不激發事件 => collection.at(i).set({}, {silent: true})
-------------------------------------------------------------
{}.listenTo({}, 'change reser', fn);


2017年5月17日 星期三

backbone幾個模組的 initailize

var Model_1 = Backbone.Model.extend({
    idAttribute: 'house_id',
    initialize: function(model, option) {
        debugger;

        console.log('model initialize');
        console.dir(arguments);
    }
});

var option = {
    age: 15
};
var m_1 = new Model_1(data_1[0], option);
------------------------------------------------------------------------
var Model_1 = Backbone.Model.extend({
    idAttribute: 'house_id'
});

var option = {
    age: 15,
    model: Model_1 // 直接附加
};
var dataList_1 = _.bbc({
    initialize: function(models, option) {
        debugger;

        console.log('collection initailize');
        console.dir(arguments);
    }
}, data_1, option);

2017年5月16日 星期二

mustache

if
{{#print}}
    {{#beatles}}
        <p>{{name}}</p>
    {{/beatles}}
{{/print}}
------------------------------------
else
{{^print}}
    {{#beatles}}
        <p>no print: {{name}}</p>
    {{/beatles}}
{{/print}}

viewData =
{
            print: true,
            beatles: [
                { "firstName": "John", "lastName": "Lennon" },
                { "firstName": "Paul", "lastName": "McCartney" },
                { "firstName": "George", "lastName": "Harrison" },
                { "firstName": "Ringo", "lastName": "Starr" }
            ],
            name: function () {
                return this.firstName + " " + this.lastName;
            }
        }

2017年5月15日 星期一

atom 設定

'.platform-win32':
    'ctrl-\\': 'unset!'
    'ctrl-alt-l': 'unset!'
    'ctrl-`':'tree-view:toggle'
    'alt-`':'symbols-list:toggle'

'atom-text-editor':
    'ctrl-space': 'unset!'
    'ctrl-\\': 'autocomplete-plus:activate'
    # 'ctrl-\\': 'autocomplete:toggle'
    'alt-/': 'autocomplete:toggle'

'.active.pane':
    'alt-\'': 'autocomplete:toggle'


'atom-workspace':
    'ctrl-alt-g': 'git-control:toggle'

2017年5月11日 星期四

http://earthtechint.com/ftp/books/JavaScript/

http://earthtechint.com/ftp/books/JavaScript/

(backbone)簡化程序

;
(function() {
    // 簡化 backbone 程序
    //

    if (typeof _ !== 'function' && typeof Backbone !== 'object') {
        return;
    } else {
        _.mixin({
            // Backbone.view.extend()
            bbv: function(option) {
                var bb = new BackboneExtend();
                var view = bb.view(option);

                return view;
            }
        });
        _win_included = true;
    }
    /* ====================================================================== */

    function BackboneExtend() {};

    (function() {
        this.view = function(option) {
            var View_class = Backbone.View.extend(option);

            var view = new View_class();
            // view._class = View_class;  view.constructor 可取得
            return view;
        }
    }).call(BackboneExtend.prototype);
    /* ====================================================================== */


})();

2017年5月10日 星期三

參考書籍

RWD跨平台響應式網頁設計

HTML5 與 Javascript Web Apps

jQuery 開發實戰

巧用 jQuery

jquery應用程式設計極速上手

邁向jQuery達人的階梯

網頁程式設計的16堂課

2017年5月4日 星期四

php 獲取完整網址

假如網址列是http://www.kimo.com.tw/test.php?id=20&link=123456

$_SERVER['PHP_SELF']; 是取得 /test.php
$_SERVER['QUERY_STRING']; 是取得 ?id=20&link=123456
$_SERVER['HTTP_HOST']; 是取得 www.kimo.com.tw
$_SERVER["REQUEST_URI"] 會給檔名 + 參數 (如 /tw/show/rating?userID=tata3055)

$_SERVER的參數和用法說明
$_SERVER['PHP_SELF'] #當前正在執行腳本的文件名,與 document root相關。
$_SERVER['argv'] #傳遞給該腳本的參數。
$_SERVER['argc'] #包含傳遞給程序的命令行參數的個數(如果運行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE'] #服務器使用的 CGI 規範的版本。例如,「CGI/1.1」。
$_SERVER['SERVER_NAME'] #當前運行腳本所在服務器主機的名稱。
$_SERVER['SERVER_SOFTWARE'] #服務器標識的字串,在響應請求時的頭部中給出。
$_SERVER['SERVER_PROTOCOL'] #請求頁面時通信協議的名稱和版本。例如,「HTTP/1.0」。
$_SERVER['REQUEST_METHOD'] #訪問頁面時的請求方法。例如:「GET」、「HEAD」,「POST」,「PUT」。
$_SERVER['QUERY_STRING'] #查詢(query)的字符串。
$_SERVER['DOCUMENT_ROOT'] #當前運行腳本所在的文檔根目錄。在服務器配置文件中定義。
$_SERVER['HTTP_ACCEPT'] #當前請求的 Accept: 頭部的內容。
$_SERVER['HTTP_ACCEPT_CHARSET'] #當前請求的 Accept-Charset: 頭部的內容。例如:「iso-8859-1,*,utf-8」。
$_SERVER['HTTP_ACCEPT_ENCODING'] #當前請求的 Accept-Encoding: 頭部的內容。例如:「gzip」。
$_SERVER['HTTP_ACCEPT_LANGUAGE']#當前請求的 Accept-Language: 頭部的內容。例如:「en」。
$_SERVER['HTTP_CONNECTION'] #當前請求的 Connection: 頭部的內容。例如:「Keep-Alive」。
$_SERVER['HTTP_HOST'] #當前請求的 Host: 頭部的內容。
$_SERVER['HTTP_REFERER'] #鏈接到當前頁面的前一頁面的 URL 地址。
$_SERVER['HTTP_USER_AGENT'] #當前請求的 User_Agent: 頭部的內容。

$_SERVER['REMOTE_ADDR'] #正在瀏覽當前頁面用戶的 IP 地址。
$_SERVER['REMOTE_HOST'] #正在瀏覽當前頁面用戶的主機名。
$_SERVER['REMOTE_PORT'] #用戶連接到服務器時所使用的端口。
$_SERVER['SCRIPT_FILENAME'] #當前執行腳本的絕對路徑名。
$_SERVER['SERVER_ADMIN'] #管理員信息
$_SERVER['SERVER_PORT'] #服務器所使用的端口
$_SERVER['SERVER_SIGNATURE'] #包含服務器版本和虛擬主機名的字符串。
$_SERVER['PATH_TRANSLATED'] #當前腳本所在文件系統(不是文檔根目錄)的基本路徑。
$_SERVER['SCRIPT_NAME'] #包含當前腳本的路徑。這在頁面需要指向自己時非常有用。
$_SERVER['REQUEST_URI'] #訪問此頁面所需的 URI。例如,「/index.html」。
$_SERVER['PHP_AUTH_USER'] #當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的用戶名。
$_SERVER['PHP_AUTH_PW'] #當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是用戶輸入的密碼。
$_SERVER['AUTH_TYPE'] #當 PHP 運行在 Apache 模塊方式下,並且正在使用 HTTP 認證功能,這個變量便是認證的類型。

$_SERVER['PHP_SELF'] #當前正在執行腳本的文件名,與 document root相關。
---------------------------------------------------------------------------------------------------------
$_SERVER['HTTP_HOST'] 
$_SERVER['REQUEST_URI'] 
$_SERVER['PHP_SELF'] 
$_SERVER['QUERY_STRING'] 

假設我們的網址是 http://www.wibibi.com/test.php?tid=333 

則以上 $_SERVER 分別顯示結果會是 

echo $_SERVER['HTTP_HOST']; //顯示 www.wibibi.com 
echo $_SERVER['REQUEST_URI']; //顯示 /test.php?tid=222 
echo $_SERVER['PHP_SELF']; //顯示 /test.php 
echo $_SERVER['QUERY_STRING']; //顯示 tid=222 

透過這幾個 $_SERVER,我們已經取得了網址的各個部分,接著就是把網址給組合起來
$URL='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo $URL;
這樣就可以順利取得現在的網址囉!這只是個簡單的範例而已,如果網址結構較為複雜,可以調用更多的 $_SERVER 來取得詳細的部分,請參考 php.net 的 $_SERVER 介紹。
PHP:$_SERVER - Manual 
---------------------------------------------------------------------------------------------------------
#測試網址:     http://localhost/blog/testurl.php?id=5

//獲取域名或主機地址 
echo $_SERVER['HTTP_HOST']."<br>"; #localhost

//獲取網頁地址 
echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php

//獲取網址參數 
echo $_SERVER["QUERY_STRING"]."<br>"; #id=5

//獲取用戶代理 
echo $_SERVER['HTTP_REFERER']."<br>"; 

//獲取完整的url
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
#http://localhost/blog/testurl.php?id=5

//包含端口號的完整url
echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
#http://localhost:80/blog/testurl.php?id=5

//只取路徑
$url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; 
echo dirname($url);
#http://localhost/blog
---------------------------------------------------------------------------------------------------------
function full_url() {
        
        // https ??
        $s = '';
        if (!empty($_SERVER['HTTPS'])) {
            if ($_SERVER['HTTPS'] == 'on') {
                $s = 's';
            }
        }

        $index = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), '/');
        $protocol = substr(strtolower($_SERVER['SERVER_PROTOCOL']), 0, $index) . $s;

        // port
        $port = '';
        if ($_SERVER['SERVER_PORT'] != '80') {
            $port = sprintf(':%s', $_SERVER['SERVER_PORT']);
        }
        
        $res = $protocol.'://' . $_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI'];

        return $res;
    }

2017年5月3日 星期三

(codeIgniter)筆記

網頁緩衝 >>

寫在 controller

$this­>output­>cache(5);

-----------------------------------------------------------------------
路由 >>

$route['test/([a-zA-Z]+)/\\1'] = 'test_2/classTest';

url(test/a/a) => 'test_2/classTest';


$route['test/\w+/\w+/(.*)'] = 'test_2/classTest/$1';  ($1區塊為收到的參數)

test1/5/6/..... => 'test_2/classTest/$1'

$route['test/\w+/\w+/(:any)'] = 'test_2/classTest/$1'; ($1區塊為收到的參數)

test1/5/6/..... => 'test_2/classTest/$1'