้กฏ็คบๅ…ทๆœ‰ JavaScript ๆจ™็ฑค็š„ๆ–‡็ซ 。 ้กฏ็คบๆ‰€ๆœ‰ๆ–‡็ซ 
้กฏ็คบๅ…ทๆœ‰ JavaScript ๆจ™็ฑค็š„ๆ–‡็ซ 。 ้กฏ็คบๆ‰€ๆœ‰ๆ–‡็ซ 

2022/07/12

multiple checkbox filter for datatables

ๆœ€่ฟ‘ๅœจ็ทด็ฟ’ datatables ้€™ๅ€‹ๅฅฝ็”จ็š„ๅทฅๅ…ท,ไป–ๅฏไปฅๆญ้… jQuery ่ทŸ Bootstrap ่ฎ“ไฝ ๅฏไปฅๅพˆๅฟซ็š„ๅปบ็ซ‹ๆœ‰ RWD ็š„่กจๆ ผ,ไป–ๆœ‰้žๅธธ่ฑๅฏŒ็š„ API ๅฏไปฅๅฎข่ฃฝๅ…งๅฎน,ไปŠๅคฉ็คบ็ฏ„ไธ€ไธ‹ๆ€Ž้บผไฝฟ็”จ checkbox ๅŽป filter ๅ‡บ็ฌฆๅˆ็š„ๅ…งๅฎน。

ไฝฟ็”จๆญฃ่ฆๅผ

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet"
          href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/jquery.dataTables.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script>
    <script>
        $(function() {
            let data = [
                [
                    "Chan",
                    "basketball"
                ],
                [
                    "Phoebe",
                    "volleyball"
                ],
                [
                    "Lucas",
                    "tennis"
                ],
                [
                    "LBJ",
                    "basketball"
                ],
            ];
            let table = $('#data_table').DataTable({
                data: data
            });

            $(':checkbox').on('click', function() {
                let options = $(':checkbox:checked').map(function() {
                    return $(this).val()
                }).get();

                if (options.length === 0) {
                    table.columns(1).search('').draw();
                } else {
                    let regex = options.join('|');

                    table.columns(1).search(regex, true, false).draw();
                }
            });
        });
    </script>
</head>
<body>
<div>
    <label> basketball
        <input type="checkbox" value="basketball">
    </label>
    <label> volleyball
        <input type="checkbox" value="volleyball">
    </label>
    <label> tennis
        <input type="checkbox" value="tennis">
    </label>
</div>
<table id="data_table">
    <thead>
    <tr>
        <th>name</th>
        <th>hobby</th>
    </tr>
    </thead>
    <tbody></tbody>
</table>
</body>
</html>

ไฝฟ็”จ extension

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet"
          href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/jquery.dataTables.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script>
    <script>
        $(function() {
            let data = [
                [
                    "Chan",
                    "basketball"
                ],
                [
                    "Phoebe",
                    "volleyball"
                ],
                [
                    "Lucas",
                    "tennis"
                ],
                [
                    "LBJ",
                    "basketball"
                ],
            ];
            let table = $('#data_table').DataTable({
                data: data
            });

            $.fn.dataTable.ext.search.push(function(settings, data) {
                let options = $(':checkbox:checked').map(function() {
                    return $(this).val()
                }).get();

                if (options.length === 0) {
                    return true;
                }

                return options.indexOf(data[1]) !== -1;
            });

            $(':checkbox').on('click', function() {
                table.draw();
            });
        });
    </script>
</head>
<body>
<div>
    <label> basketball
        <input type="checkbox" value="basketball">
    </label>
    <label> volleyball
        <input type="checkbox" value="volleyball">
    </label>
    <label> tennis
        <input type="checkbox" value="tennis">
    </label>
</div>
<table id="data_table">
    <thead>
    <tr>
        <th>name</th>
        <th>hobby</th>
    </tr>
    </thead>
    <tbody></tbody>
</table>
</body>
</html>

ไธŠ้ขไฝฟ็”จไบค้›†็š„ๆ–นๆณ•็ฏฉ้ธ,็จๅพฎๆ”นๅฏซไธ€ไธ‹ๅฐฑๅฏไปฅ่ฎŠ่ฏ้›†ไบ†。

2022/07/04

JsRender Sample

็พๅœจๅ‰็ซฏ framework ็™พๅฎถ็ˆญ้ณด,ไธ้Žๅ’ŒๅพŒ็ซฏ framework
้‡ๅˆฐไธ€ๆจฃ็š„ๅ•้กŒ,็‰ˆๆœฌๆ›ดๅ‹•่ถ…ๅฟซๅฏซๆณ•ไธ็›ธๅฎน,ไปŠๆ—ฅ็š„็•ถ็ด…็‚ธๅญๆฉŸ็›ธ้š”ไธ€ๅนดๅพŒๆถˆๅคฑ็š„็„กๅฝฑ็„ก่นคๆ™‚ๆœ‰ๆ‰€่ž,ๅพŒ็ซฏๆฏ”่ผƒๆฒ’ๆœ‰่ฟ…้€Ÿ้š•่ฝ็š„ๅ•้กŒ,็•ข็ซŸไป–็š„้–‹็™ผ้–€ๆชป้‚„ๆ˜ฏ็จ้ซ˜ไธ€ไบ›,ไนŸๅ› ๆญค้™คไบ†ๆœ‰็Žฉไธ€ไธ‹ vuejs ไปฅๅค–ๅฐ
front-end framework ็œŸ็š„ๆฒ’ๆœ‰ๅคช้ซ˜็š„่ˆˆ่ถฃ,ๅณไพฟๆˆ‘่ถ…ๆ„›ๅฏซ JavaScript,ไธ้Žๅฐˆๆกˆ่ฃก้ข้‚„ๆปฟๅธธ็”จๅˆฐ js render template ้€™ไปถไบ‹ๆƒ…,ๆ‰€ไปฅๆˆ‘้‚„ๆ˜ฏๆœ‰ไฝฟ็”จไธ€ไบ› plugin
ไพ†ๅฏฆ็พ้€™ไปถไบ‹ๆƒ…,ไปŠๅคฉๅฐฑไพ†ไป‹็ดน JsRender ้€™ๅ€‹ plugin

ๅŸบ็คŽๅŠŸ่ƒฝ

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JsRender</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jsrender/0.9.88/jsrender.min.js"></script>
    <script>
        $(function() {
            var data = {name: 'chan'};
            var html = $.templates('<strong>{{:name}}</strong>').render(data);
            $('#app').append(html);
        });
    </script>
</head>
<body>
<div id="app"></div>
</body>
</html>

JsRender ๅ‚ณ้€ฒๅŽป็š„่ณ‡ๆ–™็‚บ JSON,ไธŠ้ข็š„ๅ…งๅฎนๆœƒๅพ—ๅˆฐ:

<div id="app"><strong>chan</strong></div>

ๅฆ‚ๆžœๆ˜ฏ่ค‡ๆ•ธ็š„ๅ…งๅฎน,JsRender ๆœƒ่‡ชๅ‹•ๅนซไฝ ๅš repeat。

script
$(function() {
    let data = [
        {name: 'chan'},
        {name: 'phoebe'}
    ];
    let html = $.templates('<strong>{{:name}}</strong>').render(data);
    $('#app').append(html);
});
output

<div id="app"><strong>chan</strong><strong>phoebe</strong></div>

ๆจฃๆฟ

ๅฆ‚ๆžœๅฐ‡ๆจฃๆฟๅฏซๅœจ script ่ฃก้ข,ๅพ€ๅพ€ๆœƒ่ฎŠๅพ—ๅพˆ้›ฃ็ถญ่ญท,ๅญ—ไธฒไนŸ่ถ…้•ท,ๆ‰€ไปฅ JsRender ๆœ‰ไธ€ๅ€‹ๆŠŠๆจฃๆฟ้š”้›ขๅ‡บไพ†็š„ๅฅ—็”จๆ–นๅผ。

script
$(function() {
    let data = [
        {name: 'chan'},
        {name: 'phoebe'}
    ];
    let html = $.templates('#info').render(data);

    $('#app').append(html);
});
html
<script id="info" type="text/html">
    <strong>{{:name}}</strong>
</script>
output
<div id="app">
    <strong>chan</strong>
    <strong>phoebe</strong>
</div>

ๅ…งๅปบๅ‡ฝๅผ

{{> …}} (HTML-encode)

ๅฐ‡่ผธๅ‡บ็š„้ƒจไปฝๅŠ ไธŠ > ็š„่ฉฑๆœƒๅฐ‡็จ‹ๅผ็ขผ encode。

script
$(function() {
    let data = {link: '<a href="http://www.google.com">google</a>'};
    let html = $.templates('#info').render(data);

    $('#app').append(html);
});
html
<script id="info" type="text/html">
    {{>link}}
</script>
output
&lt;a href&#61;&#34;http://www.google.com&#34;&gt;google&lt;/a&gt;

{{if …}}

ๅˆคๆ–ทๅผ。

script
$(function() {
    let data = [
        {name: 'chan', age: 37},
        {name: 'phoebe', age: 38},
        {name: 'lucas', age: 2}
    ];
    let html = $.templates('#info').render(data);

    $('#app').append(html);
});
html
<script id="info" type="text/html">
    {{:name}} is {{if age > 10}}adult{{else}}children{{/if}}<br>
</script>
output
<div id="app">
    chan is adult<br>
    phoebe is adult<br>
    lucas is children<br>
</div>

{{for …}}

่ฟดๅœˆ。

script
$(function() {
    let data = [{
        name: 'chan',
        likes: [{
            name: 'music'
        }, {
            name: 'movie'
        }]
    }, {
        name: 'phoebe'
    }, {
        name: 'lucas',
        likes: [{
            name: 'cartoon'
        }]
    }];
    let html = $.templates('#info').render(data);

    $('#app').append(html);
});
html
<script id="info" type="text/html">
    <div>
        {{:#index}}: {{:name}}
        {{if likes}}
        <ul>
            {{for likes}}
            <li>{{:#index + 1}}: {{:name}}</li>
            {{/for}}
        </ul>
        {{else}}
        <div>no likes</div>
        {{/if}}
    </div>
</script>
output
<div id="app">
    <div>
        0: chan
        <ul>
            <li>1: music</li>
            <li>2: movie</li>
        </ul>
    </div>
    <div>
        1: phoebe
        <div>no likes</div>
    </div>
    <div>
        2: lucas
        <ul>
            <li>1: cartoon</li>
        </ul>
    </div>
</div>

{{include …}}

ๅผ•ๅ…ฅๅ…ถไป–็š„ๆจฃๆฟ。

script
$(function() {
    let data = {
        name: 'test',
        data: [
            {
                name: 'chan',
                age: 42
            },
            {
                name: 'phoebe',
                age: 42
            }
        ]
    };

    console.log($('#main').render(data));
});

html
<script id="main" type="text/html">
    <h3>{{:name}}</h3>
    {{include tmpl="#sub"/}}
</script>
<script id="sub" type="text/html">
    <ol>
        {{for data}}
        <li>{{:name}}: {{:age}}</li>
        {{/for}}
    </ol>
</script>

output
<h3>test</h3>
<ol>
    <li>chan: 42</li>
    <li>phoebe: 42</li>
</ol>

{{props …}}

key value ๅผ็š„่ฟดๅœˆ。

script
$(function() {
    var data = [
        {
            name: 'Chan',
            likes: {
                name: 'a1',
                age: 33
            }
        },
        {
            name: 'Phoebe',
            likes: {
                food: 'steak',
                drink: 'juice'
            }
        }
    ]
    var html = $.templates('#info').render(data);

    $('#app').html(html);
});
html
<script id="info" type="text/html">
    <div>
        {{:name}}
        <ul>
            {{props likes}}
            <li>{{:key}}: {{:prop}}</li>
            {{/props}}
        </ul>
    </div>
</script>
output
<div id="app">
    <div>
        Chan
        <ul>
            <li>name: a1</li>
            <li>age: 33</li>
        </ul>
    </div>
    <div>
        Phoebe
        <ul>
            <li>food: steak</li>
            <li>drink: juice</li>
        </ul>
    </div>
</div>

helper

helper ไนŸๆ˜ฏไธ€็จฎ JSON ๆ ผๅผ,ๅฏไปฅๆ˜ฏๆ–‡ๅญ—ๆˆ–่€…ๆ˜ฏ function。

script
$(function() {
    var helpers = {
        prefix: function(val) {
            return val + ' is cool';
        },
        version: '1.1'
    };
    var data = {
        name: 'chan'
    };
    var html = $.templates('#info').render(data, helpers);

    $('#app').append(html);
});
html

<script id="info" type="text/html">
    version: {{:~version}} name: {{:~prefix(name)}}
</script>
output
<div id="app">
    version: 1.1 name: chan is cool
</div>

helper ้‚„ๆœ‰ๅฆไธ€็จฎ global ็š„ๅ‚ณๅ…ฅๆ–นๅผ。

script
$(function() {
    let helpers = {
        prefix: function(val) {
            return val + ' is cool';
        },
        version: '1.1'
    };
    $.views.helpers(helpers);
    let data = {
        name: 'chan'
    };
    let html = $.templates('#info').render(data);

    $('#app').append(html);
});

ไปฅไธŠๆ˜ฏๆœ€ๅŸบๆœฌ็š„็ฏ„ไพ‹,ไธ้Žๆ‡‰่ฉฒๅฏไปฅๆ‡‰ไป˜ๅคง้ƒจๅˆ†็š„ๆƒ…ๆณไบ†,่‹ฅ่ฆไฝฟ็”จๅ…ถไป–ๆ›ด่ฉณ็›ก็š„ๅŠŸ่ƒฝๅฏไปฅๅ‰ๅพ€ไป–็š„ๅฎ˜็ถฒ https://www.jsviews.com/

2021/12/08

Imitate Jetbrains Moving Radial Gradient Effect

ไปŠๅคฉๅœจ้€› Jetbrains ๆ–ฐ็”ขๅ“ fleet ็š„็ถฒ้ ๆ™‚,็œ‹ๅˆฐไธ€ๅ€‹ๅœ“ๅฝขๆผธๅฑคๆœƒ่ทŸ่‘—ๆป‘้ผ ็งปๅ‹•็š„็‰นๆ•ˆ,่ฆบๅพ—ๅพˆๆœ‰ๆ„ๆ€。

ๆ‰‹็™ขไพ†ๅˆปไธ€ๅ€‹้กžไผผ็š„。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Glow Cursor</title>
    <style>
        .box {
            width: 300px;
            height: 300px;
            border: 2px solid blue;
        }
    </style>
</head>
<body>
<div class="box"></div>
<script>
    var box = document.querySelector('.box');

    box.addEventListener('mousemove', function (e) {
        var rect = e.target.getBoundingClientRect();
        var x = e.clientX - rect.left;
        var y = e.clientY - rect.top;

        box.style.background = `radial-gradient(circle at ${x}px ${y}px, rgba(138, 189, 61, 1) 0%, rgba(255, 255, 255, 1) 150px`;
    });

    box.addEventListener('mouseleave', function () {
        box.style.background = null;
    });
</script>
</body>
</html>

ๆ•ˆๆžœๅคงๆฆ‚ๆ˜ฏ้€™ๆจฃ Demo

2021/06/16

Compare two arrays is equal in JavaScript

ๅœจ PHP ไธญ,ๅฏไปฅ็ฐกๅ–ฎไฝฟ็”จๆฏ”่ผƒ้‹็ฎ—ๅญๆฏ”ๅฐๅ…ฉๅ€‹้™ฃๅˆ—。

$a = ['a', 'b', 'c'];
$b = ['a', 'b', 'c'];

var_dump($a === $b); // true

็”š่‡ณๆŽ’ๅบไธไธ€ๆจฃ้€้Ž sort ไนŸๅฏไปฅ่งฃๆฑบ。

$a = ['a', 'b', 'c'];
$b = ['a', 'c', 'b'];

var_dump(sort($a) === sort($b)); // true

ไฝ†ๅœจ js ็š„ไธ–็•Œไธ่กŒ。

const a = [
    'a',
    'b',
    'c'
];
const b = [
    'a',
    'b',
    'c'
];

console.log(a == b); // false
console.log(a === b); // false

ๅœจ็ถฒ่ทฏไธŠ็œ‹ๅˆฐไธ€ๅ€‹่งฃๆณ•ๆŒบๅฅฝ็š„,่จ˜้Œ„ไธ€ไธ‹。

const a = [
    'a',
    'b',
    'c'
];
const b = [
    'a',
    'b',
    'c'
];
const result = a.sort().every((value, index) => {
    return value === b.sort()[index];
});

console.log(result); // true

ๅฏซๆˆ prototype ๅฐฑๆ˜ฏ。

const a = [
    'a',
    'b',
    'c'
];
const b = [
    'a',
    'b',
    'c'
];

Array.prototype.equals = function (array) {
    return this.sort().every((value, index) => {
        return value === array.sort()[index];
    });
}

console.log(a.equals(b)); // true