HTML onsubmit событие не вызывает функцию JavaScript

У меня есть две кнопки в моей форме для вызова двух функций JavaScript. Первая кнопка хорошо работает в onclickслучае payroll()успешного вызова функции, но вторая кнопка имеет тип submit и никогда не вызывает send()функцию при отправке формы. Я не знаю, почему эта проблема возникает.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!DOCTYPE html>
<html >
<head>
    <title>hr page</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script type="text/javascript"
    src="/static/js/sijax/sijax.js"></script>
    <script type="text/javascript">
    {{ g.sijax.get_js()|safe }}</script>
    <link rel="stylesheet" href="{{url_for('static', filename='styles/signupcss.css')}}">

    <script type="text/javascript" >
function payroll() {
        var basic=document.forms["salary"]["bsalary"].value;
        var empid=document.forms["salary"]["empid"].value;
       var ta,hra,da,pf,netsalary,grosssalary;
         if (empid == ""||basic == "") {
        alert("Employee ID and Salary details must be filled out");
        return false;
        }
        if(isNaN(basic))
        {alert("Salary must be in Numbers");
        return false;
        }
       hra=basic*40/100;
        da=basic*15/100;
        pf=basic*12/100;
        basic=parseInt(basic);
        hra=parseInt(hra);
        da=parseInt(da);
        grosssalary=basic + hra + da;
        ta=basic*6.2/100;
        netsalary=grosssalary-ta;



        document.getElementById("hra").innerHTML=hra;
        document.getElementById("ta").innerHTML=ta;
        document.getElementById("da").innerHTML=da;
        document.getElementById("netsalary").innerHTML=netsalary;
        document.getElementById("pf").innerHTML=pf;


        document.getElementById("grosssalary").innerHTML=grosssalary;
         window.alert("HI"+grosssalary);
        return true;


    }
     function send()
    {
        var id = document.forms['salary']['empid'].value;
        var basic =  document.forms['salary']['bsalary'].value;
        var hra =  document.forms['salary']['hra'].value;
        var da =  document.forms['salary']['da'].value;
        var ta =  document.forms['salary']['ta'].value;
        var pf =  document.forms['salary']['pf'].value;
        var gross_sal =  document.forms['salary']['grosssalary'].value;
        window.alert("HI"+gross_sal);
        var net_sal =  document.forms['salary']['netsalary'].value;
        Sijax.request('send',[id, basic, hra, ta, da, pf, gross_sal, net_sal]);

    }

</script>
</head>
<body style="font-family:Lato">
    <div style="padding-left:5%;padding-top:0.2%;height:1%;width:100%;background-color:#11557c">
    <h2>Welcome to HR Department</h2><br>
    </div>
<div style="margin-left:15%" >
    <h2>Name</h2>
<form id="salary" name="salary" style="margin-top: 2%" method="post" onsubmit="return send()" >
    <label id = "empid">Employee ID</label><br>
    <input type = "text" name = "empid" placeholder = "Employee ID" /><br><br>
    <label id = "bsalary">Basic Salary</label><br>
    <input type = "text" name = "bsalary" placeholder = "Basic salary" /><br><br>
    <input type="button" value="Calculate" onclick="return payroll()"><br><br>

    <label for ="hra">House Rent Allowance(HRA)</label>
    <p id="hra" name="hra"></p><br>
    <label for ="ta">Travel Allowance(TA)</label>
    <p id="ta" name="ta"></p><br>
    <label for ="da"> Dearness Allowance(DA)</label>
    <p id="da" name="da"></p><br>
    <label for ="netsalary">Net Salary</label>
    <p id="netsalary" name="netsalary"></p><br>
    <label for ="pf">Provident Fund(PF)</label>
    <p id="pf" name ="pf"></p><br>
    <label for ="grosssalary">Gross Salary</label>
    <p id="grosssalary" name="grosssalary"></p><br><br>
    <input type="submit"  value="Upload Salary">
</form>
    </div>




</body>
</html>

4 ответа

  1. хорошо, быстрое исправление, так как вы используете Python flask library Sijax для ajax и, следовательно, jQuery, вы можете изменить свою sendфункцию javascript следующим образом:

    function send(e){
            e.preventDefault(); //it is as good as returning 
                                //false from the function in all cases
    
            var id = document.forms['salary']['empid'].value;
            ...
     }
    

    и измените объявление onsubmitобработчика следующим образом:

    <form id="salary" name="salary" style="margin-top: 2%" method="post" 
              onsubmit="return send(event)" >
    

    обратите внимание, что при остановке распространения цепочки событий необходимо вручную отправить форму.
    Таким образом, вы можете изменить свою функцию отправки, чтобы сделать .preventDefaultна основе ваших пользовательских критериев, в противном случае, пусть форма отправить

  2. Ваш код действительно работает, если вы запускаете этот код как фрагмент здесь в Stack overflow, отправка формы фактически блокируется по умолчанию. Попробуйте запустить код codepen. Я попробовал, и это действительно работает.
    http://codepen.io/jhonix22/pen/VPZagb

  3. Вы не можете действовать с <p>элементами как с элементами формы. Вы можете создать соответствующие <input type="hidden">элементы и заполнить ихpayroll(), или получить значения.innerHtml на параграфах.

    P.S. На самом деле у вас есть исключение TypeError, вызывающее необъявленные элементы формы, такие как document.forms['salary']['grosssalary']и так далее.

  4. Проверить это. Это далеко не идеальное решение, но я думаю, что это помогает. Вы не можете получить доступ к абзацам, как если бы Вы были входные элементы формы. Я не совсем уверен,что Sijax вещь. Я считаю, что это просто обычная вещь AJAX HTTP с какими-то фильтрами безопасности CSRF.

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!DOCTYPE html>
    <html>
    <head>
        <title>hr page</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script type="text/javascript"
                src="/static/js/sijax/sijax.js"></script>
        <script type="text/javascript">
            {
                {
                    g.sijax.get_js() | safe
                }
            }</script>
        <link rel="stylesheet" href="{{url_for('static', filename='styles/signupcss.css')}}">
    
        <script type="text/javascript">
            function payroll() {
                var basic = document.forms["salary"]["bsalary"].value;
                var empid = document.forms["salary"]["empid"].value;
                var ta, hra, da, pf, netsalary, grosssalary;
                if (empid == "" || basic == "") {
                    alert("Employee ID and Salary details must be filled out");
                    return false;
                }
                if (isNaN(basic)) {
                    alert("Salary must be in Numbers");
                    return false;
                }
                hra = basic * 40 / 100;
                da = basic * 15 / 100;
                pf = basic * 12 / 100;
                basic = parseInt(basic);
                hra = parseInt(hra);
                da = parseInt(da);
                grosssalary = basic + hra + da;
                ta = basic * 6.2 / 100;
                netsalary = grosssalary - ta;
    
                document.getElementById("hra").innerHTML = hra;
                document.getElementById("ta").innerHTML = ta;
                document.getElementById("da").innerHTML = da;
                document.getElementById("netsalary").innerHTML = netsalary;
                document.getElementById("pf").innerHTML = pf;
    
                document.getElementById("grosssalary").innerHTML = grosssalary;
                window.alert("HI" + grosssalary);
                return true;
            }
    
            function send() {
                var id = document.forms['salary']['empid'].value;
                var basic = document.forms['salary']['bsalary'].value;
    
                var hra = document.getElementById('hra').innerHTML;
                var da = document.getElementById('da').innerHTML;
                var ta = document.getElementById('ta').innerHTML;
                var pf = document.getElementById('pf').innerHTML;
                var gross_sal = document.getElementById('grosssalary').innerHTML;
                window.alert("HI" + gross_sal);
                var net_sal = document.getElementById('netsalary').innerHTML;
    
                // I think you are missing something here.
                Sijax.request('send', [id, basic, hra, ta, da, pf, gross_sal, net_sal]);
            }
        </script>
    </head>
    <body style="font-family:Lato">
    <div style="padding-left:5%;padding-top:0.2%;height:1%;width:100%;background-color:#11557c">
        <h2>Welcome to HR Department</h2><br>
    </div>
    <div style="margin-left:15%">
        <h2>Name</h2>
        <form id="salary" name="salary" style="margin-top: 2%" method="post" onsubmit="return false">
            <label id="empid">Employee ID</label><br>
            <input type="text" name="empid" placeholder="Employee ID"/><br><br>
            <label id="bsalary">Basic Salary</label><br>
            <input type="text" name="bsalary" placeholder="Basic salary"/><br><br>
            <input type="button" value="Calculate" onclick="return payroll()"><br><br>
    
            <label for="hra">House Rent Allowance(HRA)</label><br>
            <p id="hra" readonly name="hra"></p>
            <label for="ta">Travel Allowance(TA)</label><br>
            <p id="ta" readonly name="ta"></p>
            <label for="da"> Dearness Allowance(DA)</label><br>
            <p id="da" readonly name="da"></p>
            <label for="netsalary">Net Salary</label><br>
            <p id="netsalary" readonly name="netsalary"></p>
            <label for="pf">Provident Fund(PF)</label><br>
            <p id="pf" readonly name="pf"></p>
            <label for="grosssalary">Gross Salary</label><br>
            <p id="grosssalary" readonly name="grosssalary"></p><br>
            <input type="button" onclick="send()" value="Upload Salary">
        </form>
    </div>
    
    
    </body>
    </html>