LimeSurveyで自由回答(数字のみ)を全角でも動作するように修正

LimeSurvey1.92+ Build 120919を使っていて、ちょっと問題発生。

 

自由回答複数(数字のみ)という回答タイプを使って、数字だけ入力してもらう項目を作成しました。

人数を入力してもらおうと思ったのです。

 

この項目で全角を入力すると、入力するたびに消されてしまって表示されません。

おぉ、半角数字じゃないと動かないんだな!!

 

と思ったら、違っていました。

カーソルを別の項目に移動すると、消えたはずの全角入力した結果が項目に表示されています。

 

このままアンケートを確定すると、結果は「0」にナッとる。 全然だめじゃん…orz

 

現象はこんな風になります。

   1. 全角を入力して、Enterキーを押して確定した時は、別の項目に移動しても消えたまま -> これはOK

   2. 全角入力して、Enterキーを押さずに別の項目にカーソルを位置づけると、入力した全角文字が表示される。 -> 0で保存される。

 

全角文字が表示されていても、保存したら結果は0になるとか「コリャだめだろ」という状況。

原因は、日本語変換ですよね。

ソースを見ると、

 

onkeyup="fixnum_checkconditions(this.value, this.name, this.type);"

 

と書いてある。

そもそも、日本語変換前にonkeyupしても、意味無いような…それに、Enterキーを押さないで確定されたらonkeyupは発生しないから、入力した全角文字が表示されちゃうよね。

日本語変換と絡むとブラウザによって挙動も違うらしい。

 

ということで、ここを修正することにしました。

数字項目を入力するときだけ半角に変えるというのは、慣れていないと結構面倒だったりします。

なので、ついでに全角で入力したら半角に変換して数字だけ項目に残るようにしましょう。

 

直したファイルは3つ

/admin/preview.php

/qanda.php

/group.php

 

まず、/admin/preview.phpとgroup.phpにjavascriptの関数fixnum_checkconditions」が書いてあります。

preview.phpの方が設問のプレビュー画面表示なので、こちらで修正して結果が大丈夫だったら、同じようにgroup.phpを修正すればOK。

全角 -> 半角変換は数字だけなので、単純な方法にしました。

赤字が追加した箇所です。


    LEMradix='$radix';
    var numRegex = new RegExp('[^-' + LEMradix + '0-9]','g');
    var intRegex = new RegExp('[^-0-9]','g');
+   var han= '1234567890@-.,:';
+   var zen= '1234567890@-.,:';
    function fixnum_checkconditions(value, name, type, evt_type, intonly)
    {
        newval = new String(value);

+        for(i=0;i<zen.length;i++){
+            var chgRegex = new RegExp(zen[i],"gm");
+            newval = newval.replace(chgRegex,han[i]);
+        }

        if (typeof intonly !=='undefined' && intonly==1) {
            newval = newval.replace(intRegex,'');
        }
        else {
            newval = newval.replace(numRegex,'');
        }

次に、qanda.phpを修正します。

これは項目のタイプによって出力するHTMLのソースが書かれているので、

 

function do_multiplenumeric($ia)

 

の関数内の3212行目辺りにある所を変更します。


- $answer_main .= '" onkeyup="'.$checkconditionFunction.'(this.value, this.name, this.type);" '." {$numbersonly} {$maxlength} />\n\t".$suffix."\n</span>\n\t</li>\n";

+ $answer_main .= '" onblur="'.$checkconditionFunction.'(this.value, this.name, this.type);" '." {$numbersonly} {$maxlength} />\n\t".$suffix."\n</span>\n\t</li>\n";

単純にonkeyuponblurに書き換えてあげるだけ。

こうしてあげると、項目から移動したときに

    確定された文字 -> 全角から半角変換 -> 数字以外は消される

という処理順番になります。

 

IEとFirefoxでは、この方法で数字のみ項目の入力が上手いこと動くようになりました。

 

1バイト圏の人は、変換とか知らないから仕方ないよなぁ。