Javascript vs. jQuery

取得 JSON 資料 (GET)


  • 假定使用的 JSON 資料內容與 html code
[
    {
        "subject":"math",
        "score":"100",
        "term":"final"
    },
    {
        "subject":"physics",
        "score":"100",
        "term":"final"
    }
]

目的將取得的 JSON 資料加入 menu 中,

<ul id="menu">
    <li>Ori</li>
</ul>

最後的呈現結果如下;

* Ori
* 0->math
* 0->100
* 0->final
* 1->physics
* 1->100
* 1->final
  • jQuery : 透過 $.getJSON 方式

底下為使用方法

<script type="text/javascript">
$.getJSON('data.json', 
function(data) {
    for(var collection in data) {
        for(var element in data[collection]) {
            $("#menu").append("<li>" + collection + "->" + data[collection][element] + "</li>");
        }
    }
});
</script>
  • jQuery : 透過 $.ajax 方式
<script type="text/javascript">
// success 與 error 為 callback function
$.ajax({
    type: "GET",
    dataType: "json",
    url: 'data.json',
    async: false,
    success: function(data) {
        for(var collection in data) {
            for(var element in data[collection]) {
                $("#menu").append("<li>" + collection + "->" + data[collection][element] + "</li>");
            }
        }
    }
    //error: callback
});
</script>
  • 非 jQuery : 透過 XMLHttpRequest 實作出 ajax,此方法能配合 web worker 來多執行緒取得 json data
<script type="text/javascript">
// 自定義的 ajax
var ajax = function(url, data, callback, type) {
    var data_array, data_string, idx, req, value;
    if (data == null) {
        data = {};
    }
    if (callback == null) {
        callback = function() {};
    }
    if (type == null) {
        //default to a GET request
        type = 'GET';
    }
    data_array = [];
    for (idx in data) {
        value = data[idx];
        data_array.push("" + idx + "=" + value);
    }
    data_string = data_array.join("&");
    req = new XMLHttpRequest();
    req.open(type, url, false);
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.onreadystatechange = function() {
        if (req.readyState === 4 && req.status === 200) {
          return callback(req.responseText);
        }
    };
    req.send(data_string);
    return req;
};

ajax('data.json',null,function(data){
    // 可以透過 json.parse 將資料型態為 string 的 json 內容轉換成 json object
    // 此 json.parse 需要 jQuery library
    var jsonData = JSON.parse(data);

    for(var collection in jsonData) {
        for(var element in jsonData[collection]) {
            $("#menu").append("<li>" + collection + "->" + jsonData[collection][element] + "</li>");
        }
    }
},'GET');
</script>

傳送與接收 JSON 資料 (POST)


  • 一般而言,透過 jQuery library 中 $.ajax 能夠簡單的將資料 POST 到 web method 的服務中,然後取得回傳的 JSON 資料,如下;
// 檔名為 native-ajax-post.js
$.ajax({
    type: "POST",
    url: "webmethod or api url (router)",
    data: "{key-1: 'value-2', key-2: 'value-2'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        // get the data after sending data by "POST"
        dealWith(data);
    },
    beforeSend: function () {
        $('#waiting-logo').show();
    },
    complete: function () {
        $('#waiting-logo').hide();
    },
    error: function (xhr, ajaxOptions, thrownError) {
        alert(xhr.status);
        alert(thrownError);
    }
});
  • 但在一些不支援的環境下,如 worker 執行緒等不支援 window 物件 (即 jQuery 無法使用下),就必須透過 native 的 XMLHttpRequest() 方式達成這件事,如下;
// define XMLHttpRequest() function
function postJsonAjax(url, sentdata, success) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url);
    xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
    xhr.onload = function () {
        if (xhr.status === 200) {
            return success(xhr.responseText);
        }
    }
    xhr.send(JSON.stringify(sentdata));
}
  • 在可以用 window 物件 (即可使用 jQuery 下),使用 native post method
var sentData = { key-1: 'value-2', key-2: 'value-2' };
var getData = null;

postJsonAjax("webmethod or api url (router)", sentData, function (data) {
        getData = JSON.parse(data);
});
  • shared worker 使用 native post method,需要注意的是在 shared worker 中使用全域變數需要透過 self 來存取。
var sentData = { key-1: 'value-2', key-2: 'value-2' };
var getData = null;

onmessage = function (e) {
    // 確認來自 top (或稱 parent) 的變數是否與目前參數値相同
    // 不同進行 ajax 取得 json 資料;若相同則回傳相同內容即可
    if (e.data[0] != self.sentData.key-1 || e.data[1] != self.sentData.key-2) {
        self.sentData.key-1 = e.data[0];
        self.sentData.key-2 = e.data[1];

        postJsonAjax("webmethod or api url (router)", self.sentData, function (data) {
            self.getData = JSON.parse(data);
            self.postMessage(self.getData);
        });
    } else {
        self.postMessage(self.getData);
    }
}

而在 top (或 parent) 頁面,可以透過下列方式與 shared worker 溝通;

<script type="text/javascript">
var fetchData = null;

if (window.Worker) {
    var nativePostWorker = new SharedWorker('Scripts/webworker/native-ajax-post.js');

    // send JSON object to the shared worker for "POST"
    nativePostWorker.port.postMessage(['value-1','value-2']);

    // get JSON data from shared worker
    nativePostWorker.port.onmessage = function (e) {
        fetchData = JSON.parse(e.data);
    }
}

// do something ...
</script>

results matching ""

    No results matching ""