2012-12-13 [長年日記]

ほかのフィールドに対応してない → フィールド名を固定値でなく変数に

type=radio なカスタムフィールドを定義すると、クエリページでは検索条件をチェックボックスで選択できるようになるのだが、いまの enabler.js ではこんな感じで status 固定値を埋め込んである:

jQuery(document).ready(function() {
    jQuery('#label_0_status').dblclick(function() {
        jQuery('input[name="0_status"]').each(function() {
            checked = $(this).attr("checked")
            $(this).attr("checked",!checked)
        })
    })
});
とりあえずリテラルを変数化する:
参考:query.html
070: <th scope="row"><label id="label_${n_field_name}">${fields[field_name].label}</label></th>
104: <input type="checkbox" id="_${n_field_name}_$option" name="${n_field_name}"
jQuery(document).ready(function() {
    field = '0_status';
    jQuery('#label_' + field).dblclick(function() {
        jQuery('input[name="' + field + '"]').each(function() {
            checked = $(this).attr("checked")
            $(this).attr("checked",!checked)
        })
    })
});
で、たとえば vote という type=radio なカスタムフィールドを定義すると、こんな感じにすれば動作するはず:
jQuery(document).ready(function() {
    fields = ['0_status', '0_vote'];
    for (i in fields) {
        field = fields[i];
        jQuery('#label_' + field).dblclick(function() {
            jQuery('input[name="' + field + '"]').each(function() {
                checked = $(this).attr("checked")
                $(this).attr("checked",!checked)
            })
        })
    }
});
/query?status=!closed&vote=a というURLにアクセスして、やってみると……。あぅ。だめだー。期待どおりには動作しない。status と vote 両方あるとき、statusラベルをダブルクリックすると、vote のチェック状態が反転する。いみわかんない。

ブレークポイントを張ってみると、status 側のダブルクリックハンドラなのに、i=0 であってほしいところ、i=1 になってる。失敗。

やりなおし。

ちょっと形をかえて、event から field名を取り出すことにする:

jQuery(document).ready(function() {
    handler = function(event) {
        field = this.id.slice(6)
        jQuery('input[name="' + field + '"]').each(function() {
            checked = $(this).attr("checked")
            $(this).attr("checked",!checked)
        })
    }
    fields = ['0_status', '0_vote'];
    for (i in fields) {
        field = fields[i];
        jQuery('#label_' + field).dblclick(handler)
    }
});

試すと、期待通り、status をクリックするとステータスのチェックボックス状態が、vote をクリックするとvoteのチェックボックス状態が変化した。OK。

まだリテラルがある。

fields = ['0_status', '0_vote'];
これをどうにかしたい。こうやってとってやろう:
jQuery(document).ready(function() {
    handler = function(event) {
        field = this.id.slice(6)
        $('input[name="' + field + '"]').each(function() {
            checked = jQuery(this).attr("checked")
            jQuery(this).attr("checked", !checked)
        })
    }
    checkboxes = jQuery("#filters input[type='checkbox']");
    fields = []
    for (i in checkboxes) {
        fields[checkboxes[i].name] = true;
    }
    for (field in fields) {
        jQuery('#label_' + field).dblclick(handler)
    }
});

できた。できた。


«前の日記(2012-12-12) 最新 次の日記(2012-12-14)»