�� / �� / �ǿ�

swk's log - form �����Ƥ��ǥե�����ͤ����Ѥ�ä��鿧���Ѥ��� JavaScript ������

2006-12-23

* form �����Ƥ��ǥե�����ͤ����Ѥ�ä��鿧���Ѥ��� JavaScript ������ [mform] 103 users

���줬�������Ȥ���������Ϥ����ָ¤��ƤϤ���Τ����ɡ�ʸ�������Ϥ����ꡤ�����å��ܥå����򲡤����ꤷ�ƥǥե���Ȥξ��֤����Ѳ�����ȡ������ο����Ѥ���褦�� JavaScript �Υ����ɤ�񤤤Ƥߤ���

�Ȥ��äƤ�狼��ˤ����Ȼפ��ΤǤޤ��ǥ�:

Ŭ�Ѥ������ڡ����ǡ������ JavaScript �����ɤ�����ɤ��ޤ���

(function(){

var color_modified = '#ffff88';
var reset_when_reloaded = 1;

init();

function init() {
    var fs = document.forms;

    for (var i = 0; i < fs.length; i++) {
        if (reset_when_reloaded) {
            fs[i].reset();
        }
        var es = fs[i].elements;
        add_event(fs[i], ['reset'],
                  mkhandler(fs[i].elements,
                            function(e) { set_color(e, false); }));
        for (var j = 0; j < es.length; j++) {
            var prop = get_property_watched(es[j]);
            es[j].saved_default = es[j][prop];
            es[j].orig_color = es[j].style.backgroundColor;

            if (es[j].type == 'radio') { /* XXX: inefficient */
                add_event(es[j], ['keyup', 'change', 'click'],
                          mkhandler(es, watch_property));
            } else {
                add_event(es[j], ['keyup', 'change', 'click'],
                          mkhandler([es[j]], watch_property));
            }
        }
    }
    
    var ls = document.getElementsByTagName('label');
    for (var i = 0; i < ls.length; i++) {
        var labeled_elm;
        if (ls[i].htmlFor
            && (labeled_elm = document.getElementById(ls[i].htmlFor))) {
            if (!labeled_elm.assoc_labels) {
                labeled_elm.assoc_labels = [];
            }
            labeled_elm.assoc_labels.push(ls[i]);
            /* XXX: implicitly labeled controls not considered */
            ls[i].orig_color = ls[i].style.backgroundColor;
        }
    }
    function mkhandler(es, func) {
        return function() {
            for (var i = 0; i < es.length; i++) {
                func(es[i]);
            }
        };
    }
}

function add_event(elm, evtypes, func) {
    for (var i = 0; i < evtypes.length; i++) {
        if (elm.attachEvent) {
            elm.attachEvent('on' + evtypes[i], func);
        } else if (elm.addEventListener) {
            elm.addEventListener(evtypes[i], func, false);
        } else {
            elm['on' + evtypes[i]] = func;
        }
    }
}

function get_property_watched(elm) {
    var property_watched = { checkbox: 'checked', radio: 'checked',
                             _default: 'value' };
    return property_watched[elm.type] || property_watched['_default'];
}

function watch_property(elm) {
    var prop = get_property_watched(elm);
    set_color(elm, elm[prop] != elm.saved_default);
}

function set_color(elm, hilight) {
    elm.style.backgroundColor = hilight? color_modified: elm.orig_color;
    if (!elm.assoc_labels) {
        return;
    }
    for (var i = 0; i < elm.assoc_labels.length; i++) {
        set_color(elm.assoc_labels[i], hilight);
    }
}

})();

�ɤ�ʤȤ��˻Ȥ��Τ��Ȥ����ȡ�������¦����¸���Ƥ���ǡ������Խ�����褦�ʥե������Ŭ�Ѥ��뤳�Ȥ����ꤷ�Ƥޤ����Խ�����ȿ����Ѥ�뤫�� submit ���ʤ��ƤϤ����ʤ��Ȥ狼�롥�����Ѥ�äƤ��ʤ��ʤ�� Ctrl-W �ǥ�����ɥ������Ĥ�����äƤ褤�Ȥ狼�롥

�ǡ�submit ���ɽ������ڡ������Խ��ڡ�����Ʊ����Τˤ��Ƥ����С� submit ����save�פߤ����ˤʤ롥����Ū�ˤϥ��ǥ����äݤ����󥿥ե������ˤʤ�ޤ�����ξ��ϡ���ʬ�ѤΥ����֥���åԥ� CGI �˻ȤäƤޤ����Ȥ����������Ѥ˽񤤤���

HTML �˼�������ɬ�פϤʤ��Τǡ�bookmarklet �Ȥ� Greasemonkey �Ȥ��ˤ�Ǥ���Ϥ������������������������Ф���褦�ʥե������Ŭ�Ѥ����㤦�Ȥ櫓�狼���Ȼפ��Τǡ����ޤ����Ȥ��ɤ������ʤ��Τ��������

�������������Ȥ��Ƥϡ�

  • reload ����ȡ����λ����Υե���������Ƥ��ǥե�����ͤˤʤä���äƺ���Τǡ�����Ū�� reset() ����褦�ˤ��Ƥ��롥������ѿ� reset_when_reloaded ������Ǥ��롥
  • �礭�����ϥڡ������ȡ����̳��ˤ���ե�����ο����Ѥ�äƤ��뤫�ɤ������狼��ʤ���document.body �ο����Ѥ���Ȥ���title �˺ٹ�����Ȥ��������狼��䤹�������������
  • ���������ȹͤ���٤����ɤ���ʬ����ʤ����ɡ�Firefox ���ȥ����å��ܥå�����饸���ܥ���� style.backgroundColor ���Ѥ��Ƥⲿ���Ѳ����ʤ����Ȥꤢ���� label ���б�����褦�ˤ��Ƥߤ���
  • ������ implicit �� label �ˤ�̤�б���for °��������Ū�˻��ꤷ�Ƥ��ʤ���Ϣư���ޤ���

(�ɵ�) �Ǹ�Ρ�})();�פ򤦤ä���ä�����äƤ��Τǽ�����

�ǽ���������: 2009-01-04 15:31


Shingo W. Kagami - swk(at)kagami.org