Javascript / AJAX - OnSubmit不起作用

时间:2011-03-03 07:09:28

标签: javascript ajax file-upload multipartform-data

这就是我所拥有的:

<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);

}

现在我有两个主要问题: 1)当我点击输入图像(在表单中)时,它转到ValidateTS函数并验证表单,并且没有问题。如果有任何错误,则显示警报。但是它没有在表单中设置“isFormValidated”值...不知道为什么......可能是我可以返回其他内容而不是设置表单值?

2)这比其他一切更让我更加自信。在整个表单中,我有一个“UPLOAD”部分,用户可以上传任何内容。但我只有一个按钮(表单中的图像按钮提交)。因此,当我点击图像时,它首先验证表单,如问题1中所述,然后最终“提交”表单。现在,当我调用javascript submit函数时,我假设它会在表单上执行“ONSUBMIT”函数(这不会执行...并且表单最终会提交给ts.php )。

我想要它,所以当我点击输入图像(提交图像按钮)时,表单得到验证,如果isFormValidated为TRUE,我运行“document.myts.submit()”然后onsubmit =“ return upuInit(this)“执行。 请帮助我花了太多时间在这上面,现在我被卡住了。

2 个答案:

答案 0 :(得分:0)

我可以看到的一些注释:

  1. 您的提醒未引用表单值:
  2. alert('yo iam back. val: '+document.forms['myts'].value);

    应该是:

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

    1. 您需要确保您的AJAX请求是同步进行的(在阻止模式下),而不是使用正常的异步模式,否则警报将在您指定给{的回调函数设置表单之前运行{1}}。

    2. Unfortunatley,当您通过JavaScript提交表单时,onreadystatechange事件实际上并未引发,因此您需要先调用onsubmit函数。因此,您需要更改以下代码:

    3. upuInit()

      要:

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

      希望这有帮助。

答案 1 :(得分: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;
}