3

Tomcat7でJSF2.0アプリケーションを実行しています。フォームの検証にJavaScriptを使用したいと思います。これが私の問題の単純化されたバージョンです:

2つのjsfファイルindex.xhtmlとresult.xhtmlと、javascriptコードを含む1つのファイルがあります。両方のxhtmlファイルはアプリのルートフォルダーにあります。
index.xhtmlの場合:

<h:head>  
    <h:outputScript name="script.js" library="js" />  
</h:head>  
<h:body>  
    <h:form>  
        <h:inputSecret id="password" />  
        <h:inputSecret id="confirm" />  
        <h:commandButton 
                type="button" 
                value="go" 
                action="result"  
                onclick="checkPassword(this.form)" />  
    </h:form>  
</h:body>  

script.js:

function checkPassword(form){  
    var password = form[form.id+":password"].value;  
    var confirm = form[form.id+":confirm"].value;  
    alert(password + " " + confirm);  
    if(password == confirm){  
        form.submit();  
    }else{  
        alert("Password doesn't match");  
    }  
}

result.xhtmlの内容は重要ではありません。このindex.xhtmlを実行すると、期待どおりの結果が得られます。テキストボックスに同じ値を入力してボタンをクリックすると、checkPassword関数がトリガーされますが、ブラウザーはindex.xhtmlのままであり、result.xhtmlに転送します。私は何が間違っているのですか?ウォークアラウンドだけでなく、それが機能しない理由にも興味があります。手伝って頂けますか?

4

1 に答える 1

1

ナビゲーションは、フォームを単独で送信するのではなく、コマンドボタンのアクションを実行することによって実行されます。基本的に、を呼び出すことでボタンのデフォルトのアクションを抑制していますform.submit()。このように、JSFは、フォームの送信中に押されたコマンドボタンを見つけることができません。代わりに、検証結果を返すtrueか、それに応じて返す必要があります。falseに戻るtrueと、ボタンのデフォルトのアクションが通常どおり続行されます。

onclickハンドラーをに変更します

onclick="return checkPassword(form)"

とあなたのJSコードを

function checkPassword(form) {
    var password = form[form.id + ":password"].value;
    var confirm = form[form.id + ":confirm"].value;

    if (password == confirm) {
        return true;
    } else {
        alert("Password doesn't match");
        return false;
    } 
}

具体的な問題とは関係なく、これは入力を検証するための最良の方法ではありません。JavaScriptはクライアント側で完全に実行されるため、エンドユーザーはそのプロセスを完全に制御できます。エンドユーザーは、JavaScriptを完全に無効にしたり、コードを操作/バイパスしたりすることができます。

むしろ、通常のJSFを使用して、サーバー側で完全に検証を行いますValidator。を使用<f:ajax>して即座に検証し、ユーザーエクスペリエンスを向上させることができます。JSアラートの表示も90年代です。むしろ、JSF独自の<h:message>機能を使用して、ページ自体にメッセージを表示します。

于 2012-06-21T13:02:59.077 に答える