ป้องกันการรีเฟรชหน้าเมื่อปุ่มภายในฟอร์มคลิก


149

ฉันประสบปัญหาขณะใช้งานปุ่มต่าง ๆ ภายในแบบฟอร์ม ฉันต้องการปุ่มนั้นเพื่อเรียกใช้ฟังก์ชัน มันทำ แต่ด้วยผลลัพธ์ที่ไม่พึงประสงค์ที่จะรีเฟรชหน้า

รหัสง่าย ๆ ของฉันจะเป็นแบบนี้

<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

เมื่อคลิกปุ่มฟังก์ชั่นจะได้รับการเรียกด้วยการรีเฟรชหน้าซึ่งรีเซ็ตคำขอก่อนหน้าของฉันทั้งหมดซึ่งมีผลต่อหน้าปัจจุบันซึ่งเป็นผลมาจากการร้องขอก่อนหน้า

ฉันควรทำอย่างไรเพื่อป้องกันการรีเฟรชหน้า?


คุณต้องระบุพารามิเตอร์หากคุณใช้ window.location = window.location.href อย่างง่าย มันจะรีเฟรชทั้งหน้า & จะรีเซ็ตคำขอก่อนหน้าทั้งหมดของคุณ โปรดตรวจสอบสิ่งนี้: stackoverflow.com/questions/133925/…
linguini


@bunkdeath: คำตอบที่เป็นที่ยอมรับควรได้รับการยอมรับ
Jad Chahine

@ JadChahine ขออภัยฉันไม่ได้ตระหนักว่าฉันยังไม่ได้รับคำตอบขอบคุณสำหรับการชี้ให้เห็นนี้ ฉันเป็นผู้เริ่มต้นและไม่รู้ว่าฉันทำอะไรหรือไม่ได้ย้อนกลับไปตอนนั้น แต่ผมเคยชินจะยอมรับคำตอบที่คุณกล่าวถึงค่อนข้างฉันจะยอมรับการหนึ่งที่ช่วยให้ฉันเวลานั้น :)
bunkdeath

คำตอบ:


67

ให้getData()กลับเท็จ สิ่งนี้จะแก้ไข

<form method="POST">
    <button name="data" onclick="return getData()">Click</button>
</form>

1
จริง ฟังก์ชั่นที่มีการกลับเท็จไม่onclick getData
Quentin

1
นั่นคือสิ่งที่ฉันพูด แต่ไม่เป็นไรแก้ไขคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
JNDPNT

5
คุณไม่จำเป็นต้องเปลี่ยนฟังก์ชั่น - คุณสามารถใช้ onclick = "getData (); return false;"

2
type="button"เป็นสิ่งที่จับได้จริงๆ
deepcell

340

เพิ่มtype="button"ไปที่ปุ่ม

<button name="data" type="button" onclick="getData()">Click</button>

ค่าเริ่มต้นของtypeปุ่มคือsubmitซึ่งตัวเองโพสต์แบบฟอร์มในกรณีของคุณและทำให้มันดูเหมือนรีเฟรช


8
คำตอบที่สมบูรณ์ให้ที่นี่
timberlake

2
ยกเว้นสิ่งนี้จะป้องกันการตรวจสอบแบบฟอร์ม HTML5 (เช่นสำหรับการป้อน type = "อีเมล")
2540625

2
นอกจากนี้คุณยังสามารถเพิ่มลงreturn false;ใน onclick:onclick="getData(); return false;"
JBaczuk

1
นี่คือตัวเลือกที่ดีที่สุด ในขณะที่ "return false" อาจทำงานแบบอินไลน์ไม่มีตัวเลือกดังกล่าวที่ฉันรู้เมื่อเพิ่มผู้ฟังเหตุการณ์ การระบุ type = "button" จะช่วยให้ประหยัดได้ทั้งวัน
Noob ตลอดกาล

1
นี่เป็นวิธีแก้ปัญหา "เป็นทางการ" สำหรับปัญหาประเภทนี้ การคืนค่าเท็จอาจทำงานได้เช่นกัน แต่ปุ่มชนิดจะไม่ล้มเหลว
student0495

18

สิ่งที่คุณต้องทำคือใส่แท็กประเภทและทำให้ปุ่มประเภท

<button id="btnId" type="button">Hide/Show</button>

ที่ช่วยแก้ปัญหา


2
คุณสามารถอธิบายรายละเอียดและอธิบายสาเหตุได้อย่างไร
mjk

พฤติกรรมเริ่มต้นของปุ่มเป็นประเภทส่งเมื่ออยู่ในรูปแบบเมื่อเปลี่ยนเป็นปุ่มประเภทโพสต์สามารถหลีกเลี่ยงได้
Ganesh Kodiganti

16

ปัญหาคือมันก่อให้เกิดการส่งแบบฟอร์ม ถ้าคุณสร้างgetDataฟังก์ชั่นreturn falseมันก็ควรจะหยุดฟอร์มจากการส่ง

อีกวิธีหนึ่งคุณสามารถใช้preventDefaultวิธีการของวัตถุเหตุการณ์:

function getData(e) {
    e.preventDefault();
}

เหตุการณ์คลิกที่จะถูกส่งผ่าน
JNDPNT

ยกเว้นว่า (ไม่มีการแก้ไขเพิ่มเติม) วัตถุเหตุการณ์จะไม่ถูกส่งผ่าน
เควนติน

<button name = "data" onclick = "getData ($ event)"> คลิก </button>
RoboMex


3
<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

แทนที่จะใช้แท็กปุ่มใช้แท็กอินพุต แบบนี้,

<form method="POST">
    <input type = "button" name="data" onclick="getData()" value="Click">
</form>

แต่สิ่งนี้ไม่ได้สร้างปุ่มตั้งแต่button type='button'
Pardeep Jain

3

หากปุ่มของคุณเป็นปุ่ม "เริ่มต้น" ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าแอตทริบิวต์ type มิฉะนั้น WebForm จะถือว่าเป็นการส่งเป็นค่าเริ่มต้น

ถ้าคุณใช้ js ทำเช่นนี้

<form method="POST">
   <button name="data"  type="button" id="btnData" onclick="getData()">Click</button>
</form> 

**If you use jquery use like this**


<form method="POST">
   <button name="data"  type="button" id="btnData">Click</button>
</form>




$('#btnData').click(function(e){
   e.preventDefault();
   // Code goes here
getData(); // your onclick function call here

});

2

วิธีการจาวาสคริปต์เพื่อปิดการใช้งานปุ่มเอง

document.getElementById("ID NAME").disabled = true;

เมื่อเขตข้อมูลฟอร์มทั้งหมดเป็นไปตามเกณฑ์ของคุณคุณสามารถเปิดใช้งานปุ่มได้อีกครั้ง

การใช้ Jquery จะเป็นอย่างนี้

$( "#ID NAME" ).prop( "disabled", true);

0

ไม่ว่าด้วยเหตุผลใดก็ตามใน Firefox แม้ว่าฉันจะมีreturn false;และmyform.preventDefault();ในฟังก์ชั่นมันจะรีเฟรชหน้าเว็บหลังจากที่ฟังก์ชั่นทำงาน และฉันไม่รู้ว่านี่เป็นวิธีปฏิบัติที่ดีหรือไม่ แต่มันเหมาะกับฉันฉันใส่javascript:this.preventDefault();ในแอ็ตทริบิวต์การกระทำ

ขณะที่ผมกล่าวว่าฉันพยายามทุกข้อเสนอแนะอื่น ๆ และพวกเขาทำงานได้ดีในเบราว์เซอร์ Firefox แต่ถ้าคุณมีปัญหาเดียวกันลองเพิ่มป้องกันไม่ให้เหตุการณ์ในแอตทริบิวต์การดำเนินการอย่างใดอย่างหนึ่งหรือjavascript:return false; javascript:this.preventDefault();อย่าลองด้วยjavascript:void(0);ซึ่งจะทำลายรหัสของคุณ อย่าถามฉันทำไม :-)

ฉันไม่คิดว่านี่เป็นวิธีที่ยอดเยี่ยมที่จะทำ แต่ในกรณีของฉันฉันไม่มีทางเลือกอื่น

ปรับปรุง:

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

onsubmit="functionToRun(); return false;"

ฉันไม่รู้ว่าทำไมปัญหาทั้งหมดนี้กับ Firefox แต่หวังว่าจะได้ผล


0

ฟังก์ชันส่งคืนไม่ทำงานในทุกกรณี ฉันลองสิ่งนี้:

<button id="Reset" class="Button-class" onclick="return Reset()">Show result</button>

มันใช้งานไม่ได้สำหรับฉัน

ฉันพยายามกลับเท็จภายในฟังก์ชั่นและมันก็ใช้ได้สำหรับฉัน

function Reset()
{
    .
    .
    .
    return false;
}

0

ฉันกำลังเผชิญกับปัญหาเดียวกัน ปัญหาเกิดขึ้นกับonclickฟังก์ชั่น ไม่ควรมีปัญหาใด ๆ getDataกับฟังก์ชั่น มันทำงานโดยการทำให้onclickฟังก์ชั่นกลับเท็จ

<form method="POST">
    <button name="data" onclick="getData(); return false">Click</button>
</form>


-2

คุณสามารถใช้ ajax และ jquery เพื่อแก้ปัญหานี้:

<script>
    function getData() {
        $.ajax({
            url : "/urlpattern",
            type : "post",
            success : function(data) {
                alert("success");
            } 
        });
    }
</script>
<form method="POST">
    <button name="data" type="button" onclick="getData()">Click</button>
</form>

คำตอบนี้ซับซ้อนเกินไปโดยไม่จำเป็นต้องใช้ไลบรารีภายนอกเพื่อป้องกันปัญหาของ OP ที่สามารถใช้วิธีการอื่น ๆ ได้ง่ายขึ้น
Zac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.