Wednesday, February 5, 2014

Tab & Untab

Fungsi ini memungkinkan Anda untuk melakukan perintah indentasi atau outdentasi pada lebih dari satu baris teks sekaligus di dalam elemen <textarea>:

(function() {

    var tabCharacter = '    '; // Use `\t` or multiple space character

    var select = function(start, end, target) {
        target.focus();
        target.setSelectionRange(start, end);
    };

    window._tab = function(target) {

        var start = target.selectionStart,
            end = target.selectionEnd,
            value = target.value,
            selections = value.substring(start, end).split('\n');

        for (var i = 0, len = selections.length; i < len; ++i) {
            selections[i] = tabCharacter + selections[i];
        }

        target.value = value.substring(0, start) + selections.join('\n') + value.substring(end);

        // re-select text after tabbing
        var selectEnd = (end + (tabCharacter.length * selections.length));
        if (start == end) {
            select(selectEnd, selectEnd, target);
        } else {
            select(start, selectEnd, target);
        }

    };

    window._untab = function(target) {

        var start = target.selectionStart,
            end = target.selectionEnd,
            value = target.value,
            pattern = new RegExp("^" + tabCharacter),
            edits = 0;

        if (start == end) { // single line

            while (start > 0) {
                if(value.charAt(start) == '\n') {
                    start++;
                    break;
                }
                start--;
            }

            var portion = value.substring(start, end),
                matches = portion.match(pattern);

            if (matches) {
                target.value = value.substring(0, start) + portion.replace(pattern, "") + value.substring(end);
                end--;
            }

            // set caret position after tabbing
            var selectEnd = end <= start ? end : end - tabCharacter.length + 1;
            select(selectEnd, selectEnd, target);

        } else { // multiline

            var selections = value.substring(start, end).split('\n');

            for (var i = 0, len = selections.length; i < len; ++i) {
                if (selections[i].match(pattern)) {
                    edits++;
                    selections[i] = selections[i].replace(pattern, "");
                }
            }

            target.value = value.substring(0, start) + selections.join('\n') + value.substring(end);

            // re-select text after tabbing
            select(start, (edits > 0 ? end - (tabCharacter.length * edits) : end), target);

        }

    };

})();

Penggunaan

Dengan tombol:

<button onclick="_tab(document.getElementById('ID-TEXTAREA'));">Tab</button>
<button onclick="_untab(document.getElementById('ID-TEXTAREA'));">Untab</button>

Lihat Demo

Dengan tombol Tab

dan

Shift

+

Tab

pada papan kunci:

document.getElementById('ID-TEXTAREA').onkeydown = function(e) {
    // Shift + Tab ditekan
    if (e.shiftKey && e.keyCode == 9) {
        _untab(this);
        return false;
    }
    // Tab ditekan
    if (e.keyCode == 9) {
        _tab(this);
        return false;
    }
};

Lihat Demo

Terkait: Daftar Snippet untuk Implementasi DOM Range API

Labels: ,

10 Comments:

At Wednesday, February 5, 2014 at 9:53:00 PM GMT+7, Blogger Unknown said...

wah ini kang, saya pelajari dulu yah :) :-bd

#salam damai

 
At Wednesday, February 5, 2014 at 10:08:00 PM GMT+7, Blogger budkalon said...

Wew, lagi-lagi hubungannya dengan elemen formulir :D

 
At Wednesday, February 5, 2014 at 11:57:00 PM GMT+7, Blogger Rizky Kurniawan said...

kalau sudah tab lalu penghapusannya juga sebagai tab bagaimana mas taufik...?

penjelasan : penghapusannya seimbang dengan banyaknya spasi yang dibuat.

 
At Thursday, February 6, 2014 at 7:24:00 AM GMT+7, Blogger IRIL SAGITA said...

Wau, ternya bisa ya di manipulasi tab seperti di Office, ijin mempelajari dulu kak !

 
At Thursday, February 6, 2014 at 1:59:00 PM GMT+7, Blogger Alwan said...

Gunanya Untuk Apa :p

 
At Friday, February 7, 2014 at 7:07:00 PM GMT+7, Blogger Unknown said...

itu kode javascriptnya buatan mas sendiri ya?, ini berfungsinya untuk apa ya?, mampir juga ke blogku ya Terselubung 8

 
At Saturday, February 8, 2014 at 9:21:00 AM GMT+7, Blogger Taufik Nurrohman said...

Seperti biasa: Kurang paham dengan pertanyaanmu.

 
At Saturday, February 8, 2014 at 9:23:00 AM GMT+7, Blogger Taufik Nurrohman said...

Tidak bisa dibilang begitu juga si. Ini hasil pengembangan dari plugin Zepto editor.js → https://github.com/anchorcms/anchor-cms/blob/master/anchor/views/assets/js/editor.js#L33&L99

 
At Sunday, February 9, 2014 at 10:41:00 AM GMT+7, Blogger Taufik Nurrohman said...

Ralat: Penyederhanaan (bukan pengembangan).

 
At Thursday, February 20, 2014 at 11:45:00 PM GMT+7, Blogger Beben Koben said...

mungkin begini, ketika membuat tab sebanyak 2x, terus menghapusnya langsung 2x langsung tanpa harus 2x langkah spt membuat tab (kale itu juga) :D

 

Post a Comment

<< Home