試しに
#!shebang.jp : prototype.js をちゃんと使ってみる。 ここのeditable.jsをちょっといじってみました。画面表示時に事前に保存したデータを表示する機能を追加してみました。まあ、大したことをしてる訳ではないですけどね^^;
変更点は、initializeの中にデータロードを行うソースを付け加えただけです。
この変更より、cgi作るのに手間取ったのはナイショ。cgiがヘッダーを返さないとonSuccessハンドラが実行されないようです。cgi側のソースは割愛と。
var Editable = Class.create(); Editable.prototype = { initialize: function(text, url) { this.view = $(text); this.url = url; Element.show(this.view); this.editor = document.createElement('input'); this.editor.type = "text"; Element.hide(this.editor); this.view.parentNode.appendChild(this.editor); Event.observe(this.view, 'dblclick', this.showEditor.bindAsEventListener(this), false); Event.observe(this.editor, 'blur', this.editDone.bindAsEventListener(this), false); var parameters = encodeURIComponent(this.view.id) new Ajax.Request(this.url, { method: 'post', asynchronous: true, parameters: parameters, onLoading: function() { this.view.innerHTML = "now loading..."; }.bind(this), onComplete: function(originalRequest) { this.view.innerHTML = originalRequest.responseText; }.bind(this) }); }, showEditor: function() { Position.clone(this.view, this.editor); this.editor.value = this.view.innerHTML; Element.toggle(this.view, this.editor); Field.focus(this.editor); }, editDone: function() { Element.toggle(this.view, this.editor); var parameters = encodeURIComponent(this.view.id) + "=" + encodeURIComponent(this.editor.value); new Ajax.Request(this.url, { method: 'post', asynchronous: true, parameters: parameters, onLoading: function() { this.view.innerHTML = "saving..."; }.bind(this), onSuccess: function() { this.view.innerHTML = this.editor.value; }.bind(this) }); } };