prototype.jsのサンプル

なんかいいアイディア出ないかなーと思ってむやみにprototype.js(1.4.0)を使ってサンプルコードを書いてみた。テーブルの中のセル(ただのspanでもいいんだけど)をクリックすると、中身を編集できるようになるというもの。半年くらい前に誰かのブログで見た気がするけど、見つかんなかったし、練習になるかと思って書いてみた。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Test loading a local HTML Document</title>
<script language="JavaScript" type="text/javascript" src="../js/lib/prototype.js"></script>
<script language="JavaScript" type="text/javascript"><!--


Editable = Class.create();
Object.extend(Editable, {
    registerByClass: function( className ) {
        var targets = document.getElementsByClassName( className );
        targets.each( function( element ) {
            new Editable(element);
        });
    },
    
    textFieldMargins: {x:6, y:8}
} );
Editable.prototype = {
    initialize: function( element ) {
        this.clickLister = this.doclick.bindAsEventListener(this);
        this.blurLister = this.doblur.bindAsEventListener(this);
        
        Event.observe(element, "click", this.clickLister, false);
    },
    
    doclick: function( event ) {
        var element = Event.element(event);
        Event.stopObserving(element, "click", this.clickLister, false);
        var text = element.textContent || element.innerText;
        var elementSize = { 
            width: element.clientWidth - Editable.textFieldMargins.x,
            height: element.clientHeight - Editable.textFieldMargins.y
        };
        element.innerHTML = "";
        var textField = document.createElement("input");
        textField.type = "text";
        textField.value = text;
        textField.style.width = elementSize.width + "px";
        textField.style.height = elementSize.height + "px";
        element.appendChild(textField);
        Event.observe(textField, "blur", this.blurLister, false);
        textField.focus();
    },
    
    doblur: function( event ) {
        var element = Event.element(event);
        Event.stopObserving(element, "blur", this.blurLister, false);
        var container = element.parentNode;
        container.innerHTML = element.value;
        Event.observe(container, "click", this.clickLister, false);
    }
}

Event.observe( window, "load", function() {
    Editable.registerByClass( "editable" );
} );


--></script>
</head>
<body>

<table>
    <tr>
        <th>aaaaaaaaaa</th>
        <th>bbbbbbbbbb</th>
        <th>cccccccccc</th>
    </tr>
    <tr>
        <td class="editable">aaaa1111</td>
        <td class="editable">bbbbbb222222</td>
        <td class="editable">ccccccccccc333333</td>
    </tr>
    <tr>
        <td class="editable">aaaaaaa111222222211</td>
        <td class="editable">bbbbbb222222</td>
        <td class="editable">cccccc333111111111333</td>
    </tr>
    <tr>
        <td class="editable">aaaaaaa133333333331111</td>
        <td class="editable">bbbbbb2222222222</td>
        <td class="editable">cccccc333333</td>
    </tr>
</table>


</body>
</html>