ฉันจะยกเลิกการส่งแบบฟอร์มในปุ่มส่งในเหตุการณ์คลิกได้อย่างไร


99

ฉันกำลังทำงานกับเว็บแอปพลิเคชัน ASP.net

ฉันมีแบบฟอร์มที่มีปุ่มส่ง รหัสสำหรับปุ่มส่งมีลักษณะ<input type='submit' value='submit request' onclick='btnClick();'>ดังนี้

ฉันต้องการเขียนสิ่งต่อไปนี้:

function btnClick() {
    if (!validData())
        cancelFormSubmission();
}

ฉันต้องทำอย่างไร


อุ๊ยนี่ทำให้หัวฉันเจ็บ ฉันมีsubmitอินพุตที่แตกต่างกันหลายอย่าง ฉันคิดว่าจะลองใช้การควบคุมฝั่งเซิร์ฟเวอร์ในหน้านี้
Vivian River

คำตอบ:


184

คุณทำดีกว่า ...

<form onsubmit="return isValidForm()" />

หากisValidForm()ส่งคืนfalseแบบฟอร์มของคุณจะไม่ส่ง

นอกจากนี้คุณควรย้ายตัวจัดการเหตุการณ์จากอินไลน์

document.getElementById('my-form').onsubmit = function() {
    return isValidForm();
};

ดี แต่ดูเหมือนว่าจะไม่สามารถonsubmitทำงานได้ทุกครั้งที่ใช้ ASP.net เพราะ asp.net รวบรวมทุกอย่างในรูปแบบของมันเอง ...
Vivian River

6
คุณสามารถใช้คำแนะนำที่สองของเขาได้ จาวาสคริปต์แบบอินไลน์เป็นปีศาจอยู่ดี
Stephen

3
หากคุณกำลังใช้เว็บฟอร์ม ASP.NET (คำใบ้: อย่า) อย่าพยายามรวมแบบฟอร์มอื่น ๆ พวกเขาเข้ากันไม่ได้ ฉันได้ยินว่า ASP.NET MVC ช่วยให้คุณสร้างเว็บแอปโดยใช้มาร์กอัปสำนวน
Quentin

@David ถ้าการใช้แบบฟอร์มอื่นเข้ากันไม่ได้กับเว็บฟอร์ม ASP.net ฉันควรใช้การควบคุมฝั่งเซิร์ฟเวอร์เท่านั้นหรือไม่
Vivian River

2
คนอื่นมีคำตอบเหมือนคุณstackoverflow.com/a/23604664/1639385 ฉันคิดว่ามันเป็นเรื่องบังเอิญมากเกินไป
Ulysses Alves

43

เปลี่ยนข้อมูลของคุณเป็นสิ่งนี้:

<input type='submit' value='submit request' onclick='return btnClick();'>

และคืนค่าเท็จในฟังก์ชันของคุณ

function btnClick() {
    if (!validData())
        return false;
}

13

คุณจำเป็นต้องเปลี่ยน

onclick='btnClick();'

ถึง

onclick='return btnClick();'

และ

cancelFormSubmission();

ถึง

return false;

ที่กล่าวว่าฉันพยายามหลีกเลี่ยงแอตทริบิวต์เหตุการณ์ที่อยู่ภายในเพื่อสนับสนุนJS ที่ไม่สร้างความรำคาญกับไลบรารี (เช่น YUI หรือ jQuery) ที่มี API การจัดการเหตุการณ์ที่ดีและเชื่อมโยงกับเหตุการณ์ที่สำคัญจริงๆ (เช่นส่งเหตุการณ์ของแบบฟอร์มแทน ของเหตุการณ์การคลิกของปุ่ม)


2
การใช้ onclick จะช่วยให้ผู้ใช้กด Enter และข้ามเช็คได้
Cfreak

7

บางครั้งonsubmitก็ใช้ไม่ได้กับ asp.net

ฉันแก้ไขมันด้วยวิธีที่ง่ายมาก

หากเรามีแบบฟอร์มดังกล่าว

<form method="post" name="setting-form" >
   <input type="text" id="UserName" name="UserName" value="" 
      placeholder="user name" >
   <input type="password" id="Password" name="password" value="" placeholder="password" >
   <div id="remember" class="checkbox">
    <label>remember me</label>
    <asp:CheckBox ID="RememberMe" runat="server" />
   </div>
   <input type="submit" value="login" id="login-btn"/>
</form>

ตอนนี้คุณสามารถรับเหตุการณ์นั้นก่อนโพสต์แบ็คแบบฟอร์มและหยุดไม่ให้โพสต์แบ็คและทำอาแจ็กซ์ทั้งหมดที่คุณต้องการโดยใช้ jquery นี้

$(document).ready(function () {
            $("#login-btn").click(function (event) {
                event.preventDefault();
                alert("do what ever you want");
            });
 });

5

คุณควรเปลี่ยนประเภทจากsubmitเป็นbutton:

<input type='button' value='submit request'>

แทน

<input type='submit' value='submit request'>

จากนั้นคุณจะได้รับชื่อปุ่มของคุณในจาวาสคริปต์และเชื่อมโยงการกระทำที่คุณต้องการ

var btn = document.forms["frm_name"].elements["btn_name"];
btn.onclick = function(){...};

ทำงานให้ฉันหวังว่ามันจะช่วยได้


4

คุณต้องreturn false;:

<input type='submit' value='submit request' onclick='return btnClick();' />

function btnClick() {
    return validData();
}

1

ทำไมไม่เปลี่ยนปุ่มส่งเป็นปุ่มปกติและในเหตุการณ์การคลิกให้ส่งแบบฟอร์มของคุณหากผ่านการทดสอบการตรวจสอบความถูกต้องของคุณ

เช่น

<input type='button' value='submit request' onclick='btnClick();'>

function btnClick() { 
    if (validData()) 
        document.myform.submit();
} 

1
กด Enter จะข้ามการตรวจสอบ ใช้ onSubmit
Cfreak

จากนั้นจะใช้งานไม่ได้เลยหากไม่มี JavaScript <a href=" icant.co.uk/articles/pragmatic-progressive-enhancement/…ในสิ่งที่ใช้ได้ผล </a>.
Quentin

1

onSubmitคุณจำเป็นต้อง ไม่ได้onClickมิฉะนั้นคนที่สามารถเพียงแค่กดและจะหลีกเลี่ยงการตรวจสอบของคุณ สำหรับการยกเลิก. คุณต้องคืนค่าเท็จ นี่คือรหัส:

<form onSubmit="return btnClick()">
<input type='submit' value='submit request'>

function btnClick() {
    if (!validData()) return false;
}

แก้ไข onSubmit อยู่ในแท็กฟอร์ม


สิ่งนี้จะไม่ทำงาน หากข้อมูลถูกต้องคุณจะไม่ส่งคืนจริง ใส่กลับจริง ในตอนท้ายของฟังก์ชัน btnClick ()
NickSoft

1

ง่ายๆแค่คืนค่าเท็จ

โค้ดด้านล่างจะอยู่ภายในคลิกปุ่มส่งโดยใช้ jquery ..

if(conditionsNotmet)
{
return false;
}


0
function btnClick() {
    return validData();
}

1
จำเป็นต้องทำมากกว่านี้เพื่อให้ได้ผล ฉันได้ลองทำให้ functino กลับมาเป็นจริงหรือเท็จและดูเหมือนจะไม่สร้างความแตกต่างใด ๆ
Vivian River

1
คำตอบของเขาถูกต้อง โหวตแล้ว คุณต้องส่งคืนในแท็กอินพุตด้วย
Cfreak

1
นอกจากนี้ฉันควรใช้ev.preventDefault()หรือev.returnValue = falseยกเลิกพฤติกรรมเริ่มต้น แต่ไม่ป้องกันเหตุการณ์เดือดในกรณีที่ตัวควบคุมอื่นสังเกตเห็นเหตุการณ์เดียวกันในองค์ประกอบเดียวกัน ใช้return falseเฉพาะเมื่อคุณต้องการหยุดเหตุการณ์ไม่ให้เดือดและยกเลิกการกระทำเริ่มต้น ดูบทความนี้
Klemen Slavič

การต้องส่งคืนในตัวจัดการเหตุการณ์นั้นเป็นข้อมูลสำคัญที่ขาดหายไปจากคำตอบ หากไม่มีคำตอบนั้นคำตอบก็จะไม่สมบูรณ์และไม่ช่วยให้คุ้มค่ากับการโหวตเพิ่ม
Quentin

0
<input type='button' onclick='buttonClick()' />

<script>
function buttonClick(){
    //Validate Here
    document.getElementsByTagName('form')[0].submit();
}
</script>

2
สำหรับคำตอบที่เป็นประโยชน์ปฏิกิริยานี้จำเป็นต้องขยายออกไป อธิบายว่าเหตุใดจึงเป็นคำตอบสำหรับคำถาม
Jeroen Heier

0

ด้วย JQuery นั้นง่ายกว่าเดิม: ทำงานใน Asp.Net MVC และ Asp.Core

<script>
    $('#btnSubmit').on('click', function () {

        if (ValidData) {
            return true;   //submit the form
        }
        else {
            return false;  //cancel the submit
        }
    });
</script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.