QA@IT

SAStruts で、JavaScriptによる入力チェックがうまく動作しない。

5691 PV

SAstruts 1.0.4 を使用して、Webアプリケーションを開発しています。
JavaScriptによる入力値チェックを有効にし「@IntegerType」のチェックを追加すると、JavaScriptによるエラーチェックがうまく動作しなくなるのですが、原因・対応方法ご教授ください。
尚、Struts についても Struts 1.2.9 から、Struts 1.3.10 に変更してみましたが、同じ動作でした。

アクションフォームの例1(この場合 Required チェックの JavaScriptでチェックされる)

    public String id = "";

    @Required
    public String empNo = "";

    @Required
    public String empName = "";

    @IntegerType
    public String mgrId = "";

    @DateType(datePattern = "yyyy/MM/dd")
    public String hiredate = "";

アクションフォームの例2(IntegerType のチェックを外すと、DateTypeチェックも JavaScriptでチェックできるようになる)

    public String id = "";

    @Required
    public String empNo = "";

    @Required
    public String empName = "";

    public String mgrId = "";

    @DateType(datePattern = "yyyy/MM/dd")
    public String hiredate = "";

2013/5/16 追加:
以下がFirefoxで実行した際のJavaScriptエラーの内容です。

時刻: 2013/05/16 10:57:48
警告: getAttributeNode() の使用は推奨されません。代わりに getAttribute() メソッドを使用してください。
ソースファイル: xxxxx
行: 101

        /**
         * Retreive the name of the form
         * @param form The form validation is taking place on.
         */
        function retrieveFormName(form) {

            // Please refer to Bugs 31534, 35127, 35294 & 37315
            // for the history of the following code

            if (form.getAttributeNode) {
101->           if (form.getAttributeNode("id") && form.getAttributeNode("id").value) {
                    return form.getAttributeNode("id").value;
                } else {
                    return form.getAttributeNode("name").value;
                }
            } else if (form.getAttribute) {
                if (form.getAttribute("id")) {
                    return form.getAttribute("id");
                } else {
                    form.attributes["name"];
                }
            } else {
                if (form.id) {
                    return form.id;
                } else {
                    return form.name;
                }
            }

        }  

時刻: 2013/05/16 10:57:48
エラー: TypeError: field is undefined
ソースファイル: xxxxx
行: 276

        /*$RCSfile: validateInteger.js,v $ $Rev: 330243 $ $Date: 2005-11-02 12:26:02 +0000 (Wed, 02 Nov 2005) $ */
        /**
         * Check to see if fields are a valid integer.
         * Fields are not checked if they are disabled.
         * <p>
         * @param form The form validation is taking place on.
         */
        function validateInteger(form) {
            var bValid = true;
            var focusField = null;
            var i = 0;
            var fields = new Array();

            oInteger = eval('new ' + retrieveFormName(form) +  '_IntegerValidations()');
            for (x in oInteger) {
                var field = form[oInteger[x][0]];

276->           if ((field.type == 'hidden' ||
                    field.type == 'text' ||
                    field.type == 'textarea' ||
                    field.type == 'select-one' ||
                    field.type == 'radio') &&
                    field.disabled == false) {

以上、よろしくお願いします。

  • ブラウザのjavascriptコンソールなどには何か出てませんか?IEならJSのエラー警告マークがステータスバーにでてたりはしませんか? -
  • 質問内容に、JavaScriptのエラー内容を追加しました。 -
  • form[oInteger[x][0]] で要素が特定されないからでしょうね。環境が書かれていないので何とも言えませんがブラウザとの相性問題の可能性もあります。 -
  • 手修正する類のものではないですが、if ((field != undefined) && (field.type == 'hidden' || とすればエラーは抑止できるでしょう(integerチェックがなされるかは別として、ほかのチェックはされるんじゃないかな) -
  • ありがとうございました、何とか解決できました。 -

回答

何とか対応策が見つかりました。

1.commons_validator 内の、javascript を抜き出して、アプリケーションパッケージ内に配置し、該当の箇所を修正。
2.WEBアプリで設定している、validator-rules.xml を編集。
3.各validator の、jsFunction 属性を、1.で変更した物を参照するように変更。(属性が存在していない場合は、属性を追加)

これで、修正したJavaスクリプトでクライアント側のバリデーションが動くようになりました。
アドバイスありがとうございました。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。