Membuat HTML Editor dengan Javascript Dilengkapi Instant Preview

3 min read

Membuat HTML Editor dengan Javascript
Photo by Safar Safarov on Unsplash

TeknoCerdas.com – Salam cerdas untuk kita semua. Ketika membuat sebuah halaman HTML pengembang akan sangat terbantu dengan adanya instant preview dari kode HTML yang diketik. Dengan adanya instant preview proses prototyping akan lebih mudah. Dan membuat sebuah HTML editor dengan fitur instant preview ternyata tidak sulit dilakukan. Tulisan ini akan membantu anda membuat HTML editor dengan Javascript yang dilengkapi instant preview dengan mudah.

Kita mulai dulu dengan tampilan HTML editor yang dibuat. Kita akan membagi halaman menjadi dua bagian sama lebar. Yaitu bagian untuk HTML editor dan untuk preview.

Buat sebuah direktori baru misalnya html-editor yang didalamnya buat sebuah file HTML bernama index.html. Buka file index.html dengan teks editor lalu masukkan kode HTML dan CSS berikut.

Baca Juga
GitHub Comments untuk Static Website

<!DOCTYPE html>
<html>
<head>
<title>HTML Editor with instant preview demo</title>
<meta name="google" content="notranslate">
<meta charset="utf-8">
<style>
html {
    height: 100%;
}
* {
    margin: 0;
    padding: 0;
}
body {
    font-family: "Georgia", "Arial", "Serif";
    width: 100%;
    position: relative;
    min-height: 100%;
    box-sizing: border-box;
    height: 100%;
    color: #999;
    background-color: #272822;
}
h2.title {
    display: block;
    width: 100%;
    padding: 0.5em 0.5em 0.5em 1em;
    font-size: 1.2em;
    font-weight: normal;
    box-sizing: border-box;
}
.text-center {
    text-align: center;
}
.hide {
    display: none;
}
.border-bottom {
    border-bottom: 1px solid #333;
}
.editor, .preview {
    height: 100%;
    width: 100%;
    position: relative;
    box-sizing: border-box;
}
.editor #code-editor {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
    background-color: #f1f1f1;
    font-family: monospace;
    font-size: 18px;
}
.preview #preview-frame {
    height: 100%;
    width: 100%;
    border: none;
    background-color: #fff;
}
@media screen and (min-width: 720px) {
    .editor {
        width: 50%;
        float: left;
        padding-bottom: 0;
    }
    .menu {
        width: 300px;
        border-right: 1px dotted #999;
        border-bottom: 1px dotted #999;
    }
    .preview {
        width: 50%;
        float: left;
    }
    .full-width {
        width: 100%;
        float: initial;
    }
}
</style>
</head>
<body>
<!-- EDITOR WINDOW -->
<div class="editor">
    <h2 class="title text-center border-bottom">HTML Editor</h2>
    <textarea id="code-editor"></textarea>
</div>

<!-- PREVIEW WINDOW -->
<div class="preview">
    <h2 class="title text-center border-bottom">Preview</h2>
    <iframe id="preview-frame"></iframe>
</div>
</body>
</html>

Kode diatas cukup sederhana hanya membagi halaman dengan komponen utama yaitu editor dan preview. Dimana pembagian lebar masing-masing komponen adalah separuh lebar halaman.

Pada bagian editor digunakan komponen textarea untuk mengetikkan kode HTML yang akan diproses. Sedangkan pada bagian preview digunakan komponen iframe.

Baik, sekarang coba buka file index.html tersebut dengan browser untuk melihat hasilnya.

Tampilan HTML Editor dengan preview
Tampilan HTML Editor dengan preview

Tampilan sudah sesuai dengan keinginan. Langkah berikutnya adalah menambahkan kode Javascript agar setiap perubahan yang ada pada HTML editor otomatis hasilnya akan ditampilkan pada panel preview.

Lakukan perubahan pada file index.html dengan menambahkan blok Javascript. Letakkan kode ini sebelum </body>.

<script>
var $ = function(el) {
    return document.querySelector(el);
};

function updatePreview(html)
{
    $('#preview-frame').contentWindow.document.open();
    $('#preview-frame').contentWindow.document.write(html);
    $('#preview-frame').contentWindow.document.close();
}

$('#code-editor').addEventListener('input', function(e) {
    updatePreview(this.value);
});

window.addEventListener('beforeunload', function(e)
{
  if (e) {
    // Cancel the event
    e.preventDefault();
    // Chrome requires returnValue to be set
    e.returnValue = '';
  }

  return 'Are you sure want to exit?';
});
</script>

Hanya seperti itu saja? Ya benar hanya sesederhana itu. Setiap perubahan pada textarea atau panel editor akan dimonitor oleh event listener input. Jika ada perubahan maka panggil fungsi updatePreview yang akan melakukan upadate pada content iframe.

Untuk membuktikannya coba buka atau reload file index.html pada browser kemudian copy-paste kode dibawah ini ke panel editor.

<!DOCTYPE>
<html>
<body>
<form>
  <input id="myinput" type="text"
         placeholder="Input color e.g: red"
         style="font-family: monospace;
         font-size: 24px; display:block; width:100%;">
</form>
<script>
document.getElementById('myinput').addEventListener('keyup',
function(e) {
  document.body.style.background = this.value;
});
</script>
</body>
</html>

Sesaat setelah kode HTML diatas di tempel ke panel HTML editor maka otomatis panel preview akan menampilkan tampilan sesuai dengan kode yang diketikkan.

Pada contoh diatas adalah sebuah halaman dengan satu inputan textbox. Ketika inputan textbox tersebut diisi maka otomatis warna dari background akan berubah. Penasaran coba saja masukkan warna yang didukung oleh HTML misal cyan atau #c60000 untuk merah merah maroon.

Kode HTML dan Javascript otomatis langsung dapat dipreview
Kode HTML dan Javascript otomatis langsung dapat dipreview

Ketika anda mengetikkan sesuatu pada panel HTML editor otomatis langsung terefleksi di panel preview. Ini sangat memudahkan prototyping dan mencoba beberapa kode tanpa perlu membuat file HTML terlebih dahulu.

Jika kodenya pendek mungkin masih enak dibaca, tapi bagaimana jika kodenya sangat panjang? Hal itu akan menyulitkan. Karena itu langkah berikutnya adalah memasang syntax highlighter agar kode yang diketik otomatis memiliki warna seperti Sublime atau VS Code.

Pustaka yang akan digunakan adalah CodeMirror yang dapat didownload di https://codemirror.net/. Perubahan yang dilakukan pun tidak banyak. Hanya memanggil pustaka dan style dari CDN kemudian menggunakannya. Cukup beberapa baris saja. Tambahkan beberapa baris ini sebelum tag </head>.

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/codemirror.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/theme/monokai.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/codemirror.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/mode/xml/xml.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/mode/javascript/javascript.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/mode/css/css.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.59.1/mode/htmlmixed/htmlmixed.min.js"></script>

Kode diatas akan mengambil pustaka CodeMirror yang dibutuhkan untuk melakukan syntax highlighting kode HTML, CSS dan Javascript. Pada kode blok Javascript lakukan perubahan berikut ini untuk memanggil CodeMirror.

<script>
var $ = function(el) {
    return document.querySelector(el);
};

function updatePreview(html)
{
    $('#preview-frame').contentWindow.document.open();
    $('#preview-frame').contentWindow.document.write(html);
    $('#preview-frame').contentWindow.document.close();
}

window.addEventListener('beforeunload', function(e)
{
  if (e) {
    // Cancel the event
    e.preventDefault();
    // Chrome requires returnValue to be set
    e.returnValue = '';
  }

  return 'Are you sure want to exit?';
});

window.addEventListener('DOMContentLoaded', function(e) {
  cm = CodeMirror.fromTextArea($('#code-editor'), {
      lineNumbers: true,
      styleActiveLine: true,
      mode: 'text/html',
      theme: 'monokai'
  });

  cm.on('change', function() {
      updatePreview(cm.getValue());
  });

  updatePreview(cm.getValue());
});
</script>

Kode diatas melakukan inisialisasi CodeMirror menggunakan DOM element dari textarea yang digunakan untuk kode editor. Karena CodeMirror memiliki API untuk memonitor perubahan lewat change, maka kita gunakan API tersebut dan menghapus event listener input dari komponen code-editor.

Untuk melihat perubahan maka reload browser, seharusnya tampilan akan berubah menjadi Monokai theme pada panel HTML Editor.

Tampilan HTML Editor dengan CodeMirror
Tampilan HTML Editor dengan CodeMirror