iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
自我挑戰組

從爬蟲到架站系列 第 9

Day 8: 從爬蟲到架站-js更改網頁

  • 分享至 

  • xImage
  •  

有了圖表,也要在下面附上文字資料,並且為了之後可能會加上的其他數據,要利用Bootstrap做出點擊開合的功能。

JS更新網頁

JS取得的資料會與圖表的資料相同,所以可以寫在同一個ajax中,但在寫JS之前,必須在Html裡面宣告圖表的位置。

index.html

<p>
    <h2 class="mb-0">
        <button class="btn btn-secondary btn-lg btn-block" type="button" data-toggle="collapse"
            data-target="#basic_table"
            aria-expanded="false" aria-controls="basic_table">
            基本數據(逐月)
        </button>
    </h2>
</p>
<div class="collapse" id="basic_table">
    <table id="stat_table" class="table">
        <thead>

        </thead>
        <tbody></tbody>
    </table>
</div>

上面的Button控制下面的table

而我要更新的位置就是#stat_table這個,接著開始寫JS。

我的table會有head和body兩個,head會放數據的種類(PA、AB等等),body會放實際的數值,所以我必須分開取得兩個元件。

let stat_table_head = $("#stat_table > thead");
let stat_table_body = $("#stat_table > tbody");

取得元件後,首先要做的是清空他原本的內容,如果沒有先清空,表格會無限的增加。

stat_table_head.empty();
stat_table_body.empty();

先處理head

let tr = $("<tr/>").append($("<th/>",{scope: "col",text: "#"}));
for(let i = 0; i < result['attr'].length; i++){
    let th = $("<th/>",{
        scope: "col",
        text: result['attr'][i]
    });
    tr.append(th);
}
stat_table_head.append(tr);

接著增加body的數值。

data_type = ['PA', 'AB', 'RBI', 'H', 'HR', 'AVG', 'OBP', 'SLG'];
for (let k =0; k < data_type.length; k++) {
    let body_tr = $("<tr/>").append($("<th/>",{scope:"col", text: data_type[k]}));
    for(let data in result[data_type[k]]){
        let body_th = $("<th/>", {
            scope: "col",
            text: result[data_type[k]][data]
        });
        body_tr.append(body_th);
    }
    stat_table_body.append(body_tr);
}

月份的數據和圖表都包成一個funcion了,接著利用onchange屬性觸發就好。

<div class="form-group col-6">
    <select name="player" id="player" onchange="get_month(); get_recent(); get_habit();" class="form-control">
    </select>
</div>

下一篇將增加別的數據

完整的function內容

function get_month(){
    let p = $("#player").val();
    let chart = echarts.init(document.getElementById('month_stat'), 'white', { renderer: 'canvas' });
    let chart2 = echarts.init(document.getElementById('month_stat_2'), 'white', { renderer: 'canvas' });
    let stat_table_head = $("#stat_table > thead");
    let stat_table_body = $("#stat_table > tbody");

    if(p!=='選擇球員'){
        $.ajax({
        type: 'POST',
        url: "/getchartinfo",
        data: {"p":p},
        success: function (result) {
            stat_table_head.empty();
            stat_table_body.empty();
            let option = {
                title: {
                    text: result['name']
                },
                legend: {
                    data: ['AVG', 'SLG', 'OBP']
                },
                toolbox: {
                    show: true,
                    orient: 'vertical',
                    left: 'right',
                    top: 'center',
                    feature: {
                        magicType: { show: true, type: ['line', 'bar', 'stack', 'tiled'] },
                        restore: { show: true },
                        saveAsImage: { show: true }
                    }
                },
                dataZoom: [ 
                    {
                        show: true,
                        realtime: true,
                        start: 0,
                        end: 100
                    }
                ],
                tooltip: {
                    trigger: 'axis'
                },
                xAxis: {
                    data: result['attr']
                },
                yAxis: {},
                series: [{
                    name: 'AVG',
                    type: 'bar',
                    data: result['AVG']
                },{
                    name: 'OBP',
                    type: 'bar',
                    data: result['OBP']
                },{
                    name: 'SLG',
                    type: 'bar',
                    data: result['SLG']
                }]
            };
            chart.setOption(option);

            let option_2 = {
                title: {
                    text: '其他數據'
                },
                tooltip: {},
                legend: {
                    data: ['PA', 'AB', 'RBI', 'H', 'HR']
                },
                toolbox: {
                    show: true,
                    orient: 'vertical',
                    left: 'right',
                    top: 'center',
                    feature: {
                        mark: { show: true },
                        dataView: { show: true, readOnly: false },
                        magicType: { show: true, type: ['line', 'bar', 'stack', 'tiled'] },
                        restore: { show: true },
                        saveAsImage: { show: true }
                    }
                },
                dataZoom: [
                    {
                        show: true,
                        realtime: true,
                        start: 0,
                        end: 100
                    }
                ],
                tooltip: {
                    trigger: 'axis'
                },
                xAxis: {
                    data: result['attr']
                },
                yAxis: {},
                series: [{
                    name: 'PA',
                    type: 'bar',
                    data: result['PA']
                }, {
                    name: 'AB',
                    type: 'bar',
                    data: result['AB']
                }, {
                    name: 'H',
                    type: 'bar',
                    data: result['H']
                }, {
                    name: 'RBI',
                    type: 'bar',
                    data: result['RBI']
                }, {
                    name: 'HR',
                    type: 'bar',
                    data: result['HR']
                }]
            };
            chart2.setOption(option_2);
            
            let tr = $("<tr/>").append($("<th/>",{scope: "col",text: "#"}));
            for(let i = 0; i < result['attr'].length; i++){
                let th = $("<th/>",{
                    scope: "col",
                    text: result['attr'][i]
                });
                tr.append(th);
            }
            stat_table_head.append(tr);

            data_type = ['PA', 'AB', 'RBI', 'H', 'HR', 'AVG', 'OBP', 'SLG'];
            for (let k =0; k < data_type.length; k++) {
                let body_tr = $("<tr/>").append($("<th/>",{scope:"col", text: data_type[k]}));
                for(let data in result[data_type[k]]){
                    let body_th = $("<th/>", {
                        scope: "col",
                        text: result[data_type[k]][data]
                    });
                    body_tr.append(body_th);
                }
                stat_table_body.append(body_tr);
            }
        }
    });
    }
}

上一篇
Day 7: 從爬蟲到架站-echart繪圖(2)
下一篇
Day 9: 從爬蟲到架站-增加新功能
系列文
從爬蟲到架站21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言