0

これは私が持っているものです:

<form name="myts" method="post" action="ts.php" enctype="multipart/form-data" onsubmit="return upuInit(this)"> 
. 
. 
...bunch of inputs/buttons etc... 
. 
. 
<input type="hidden" id="isFormValidated" name="isFormValidated" value="">
</form>

<input name="image" type="image" src="img/submit.png" border="0" onClick="validateTS(document.forms['myts']);alert('yo iam back. val: '+document.forms['myts'].value);if(document.forms['myts'].isFormValidated.value == 'true') {alert('about to submit');document.forms['myts'].submit();}">

これは、PHP 検証スクリプト (AJAX) を呼び出す「validateTS」javascript です。

function validateTS(oForm) {
var x = GetXmlHttpObject();
var errMsg = "";
var url = "validateTS.php?usr=TEST";
var retVal = false;

// PC Work Hours
var pcWH = getElement("txtpcwk");
var pcTH = getElement("txtpctrv");
var pcTot = parseInt(pcWH.value) + parseInt(pcTH.value);

url += "&pcHrs0="+pcTot;

// Build the URL above and include the "updated" values.
var selectBox = getElement("addlst");
var myOptions = [];
for (var loop=0; loop<selectBox.options.length; loop++) {
    myOptions[loop] = { optText:selectBox.options[loop].text, optValue:selectBox.options[loop].value };
}

for (var loop=0; loop<myOptions.length; loop++) {
    var assWH = getElement("txtasswk_"+myOptions[loop].optValue);
    var assTH = getElement("txtasstrv_"+myOptions[loop].optValue);
    var assWHTotal = parseInt(assWH.value) + parseInt(assTH.value);
    url += "&emp"+loop+"="+assWHTotal;
}

var tsApprover = getElement("txtappr").value;
var tsClientRep = getElement("txtins").value;

url += "&tsApprover="+tsApprover+"&tsClientRep="+tsClientRep;

x.open("GET",url,true);
x.onreadystatechange=function() {
    if(x.readyState == 4 && x.status == 200) {
        var r = x.responseText;
        var myUploadAlerts = "";
        var isUploadFilesValid = false;

        myUploadAlerts = validateUploadForm(oForm);
        r = r.trim();
        myUploadAlerts = myUploadAlerts.trim();
        if (r != "" || myUploadAlerts != "") {
            showMyAlerts("Please correct the following Error(s) before proceeding: <br><br>" + formatAlerts(r) + formatAlerts(myUploadAlerts), 500, block_ui_enabled);
            oForm.isFormValidated.value = "false";
        }
        else {
            oForm.isFormValidated.value = "true";   
        }
    }
};
x.send(null);

}

現在、2 つの大きな問題があります。1) 入力画像 (フォーム内) をクリックすると、ValidateTS 関数に移動し、フォームを検証しますが、問題はありません。エラーがあればアラートを表示します。しかし、フォームに「isFormValidated」値を設定しません...理由がわかりません...フォーム値を設定するのではなく、何か他のものを返すことができるのでしょうか?

2) これは他のすべてよりも私に多くの悲しみを与えています. フォーム全体に、ユーザーが何でもアップロードできる「UPLOAD」部分があります。しかし、ボタンは 1 つしかありません (送信するフォームの画像ボタン)。したがって、画像をクリックすると、問題1で述べたように、最初にフォームが検証され、フォームが「送信」されます。ここで、javascript submit 関数を呼び出すと、フォームで「ONSUBMIT」関数が実行されると想定します (これは実行されません...そして、フォームは ts.php に送信されます)。

入力画像 (画像の送信ボタン) をクリックすると、フォームが検証され、isFormValidated が TRUE の場合は、「document.myts.submit()」を実行してから onsubmit="return upuInit(this)" を実行します。実行されます。助けてください私はこれにあまりにも多くの時間を費やしたばかりで、今は立ち往生しています.

4

2 に答える 2

0

私が見ることができるものからのいくつかのメモ:

  1. アラートはフォームの値を参照していません:

alert('yo iam back. val: '+document.forms['myts'].value);

する必要があります:

alert('yo iam back. val: '+document.forms['myts'].isFormValidated.value);

  1. 通常の非同期モードを使用せずに、AJAXリクエストが同期的に(ブロッキングモードで)行われていることを確認する必要があります。そうしないと、割り当てたコールバック関数によってフォームが設​​定される前にアラートが実行されますonreadystatechange

  2. 残念ながら、 JavaScriptを介してフォームを送信してもイベントは実際には発生しないため、最初に関数onsubmitを呼び出す必要があります。upuInit()したがって、コードを次のように変更する必要があります。

document.forms['myts'].submit();

に:

if(upuInit(document.forms['myts'])) {document.forms['myts'].submit()};

お役に立てれば。

于 2011-03-03T07:39:41.393 に答える
0

他の人がフォローしているのは、私が借りた機能です。私のエディションのいくつかでは、Ajax リクエストを同期的に実行します。

function runSynchronousAjax(url) {
    var AJAX = GetXmlHttpObject();
    if (AJAX) {
        AJAX.open("GET", url, false);
        AJAX.send(null);
        return AJAX.responseText;
    } 
    else {
        return false;  
    }
}

function GetXmlHttpObject() {
    var A = null;
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        A = new XMLHttpRequest();
    }
    else if (window.ActiveXObject) {
        // code for IE6, IE5
        //return new ActiveXObject("Microsoft.XMLHTTP");

        try {
            A = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e) {
            try {
                A = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(err) {
                A = null;
            }
        }
    }
    return A;
}
于 2011-03-03T16:58:12.247 に答える