ผลของการเพิ่ม 'return false' ให้กับฟังเหตุการณ์คลิกคืออะไร


359

หลายครั้งที่ฉันเห็นลิงก์เช่นนี้ในหน้า HTML:

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

ผลของสิ่งที่return falseอยู่ในนั้น?

นอกจากนี้ฉันมักจะไม่เห็นปุ่ม

สิ่งนี้ระบุไว้ที่ไหนหรือไม่? ในสเป็คบางอย่างใน w3.org?


5
และปัญหาที่เกิดขึ้นจริงในตัวอย่างของลีโอเนลคือถ้าหน้าปัจจุบันถูกเลื่อนลงมาอย่างใดอย่างหนึ่งมันจะกระโดดขึ้นไปข้างบนโดยไม่ส่งคืนเท็จ
roenving

IntelliJ ของฉันบ่นว่า "return false;" ด้วย "นิยามฟังก์ชันนอก" ข้อความ
SES

คำตอบ:


310

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

ฉันไม่เชื่อว่ามีข้อกำหนดของ W3C สำหรับสิ่งนี้ อินเตอร์เฟส JavaScript โบราณทั้งหมดเช่นนี้ได้รับฉายา "DOM 0" และส่วนใหญ่ไม่ได้ระบุ คุณอาจโชคดีที่อ่านเอกสารเก่าของ Netscape 2

วิธีที่ทันสมัยของการบรรลุผลนี้คือการโทรevent.preventDefault()และนี่คือที่ระบุไว้ในสเปค DOM 2 เหตุการณ์


41
event.preventDefault ? event.preventDefault() : event.returnValue = false;จะทำงานใน IE ด้วย

3
เบราว์เซอร์ทุกตัวยกเว้น Chrome ทำงานด้วยreturn falseวิธีนี้ แต่ฉันต้องการevent.preventDefaultChrome
DOOManiac

3
Chrome ทำงานร่วมกับreturn falseวิธีนี้ได้แล้ว มันจะหยุดติดตามลิงก์ในเหตุการณ์ onclick ขององค์ประกอบ img
Bao

ในแบบฟอร์ม JS ธรรมดาส่ง handler คืนเท็จไม่ทำงาน (อย่างน้อยใน Chrome) ดังนั้นฉันใช้ e.preventDefault () ตามความเห็นของ @ 2astalavista ด้านบน e.preventDefault ล้มเหลวใน IE ดังนั้นใช้วิธีการของเขา: event.preventDefault? event.preventDefault (): event.returnValue = false;
luigi7up

162

คุณสามารถเห็นความแตกต่างด้วยตัวอย่างต่อไปนี้:

<a href="http://www.google.co.uk/" onclick="return (confirm('Follow this link?'))">Google</a>

การคลิก "ตกลง" จะส่งคืนจริงและมีการติดตามลิงก์ การคลิก "ยกเลิก" จะส่งคืนค่าเท็จและไม่ได้ติดตามลิงก์ หากปิดการใช้งานจาวาสคริปต์ลิงค์จะถูกติดตามตามปกติ


7
ว่าสิ่งที่ฉันกำลังมองหางานยังสมบูรณ์แบบในปุ่มส่ง! <button type="submit" onclick="return confirm('Do you really want to delete this?');">Delete</button>
ArendE

27

ต่อไปนี้เป็นขั้นตอนที่มีประสิทธิภาพมากขึ้นในการยกเลิกพฤติกรรมเริ่มต้นและเหตุการณ์เดือดปุด ๆ ในเบราว์เซอร์ทั้งหมด:

// Prevents event bubble up or any usage after this is called.
eventCancel = function (e)
{
    if (!e)
        if (window.event) e = window.event;
    else return;
    if (e.cancelBubble != null) e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    if (e.preventDefault) e.preventDefault();
    if (window.event) e.returnValue = false;
    if (e.cancel != null) e.cancel = true;
}

ตัวอย่างของวิธีการนี้จะใช้ในตัวจัดการเหตุการณ์:

// Handles the click event for each tab
Tabstrip.tabstripLinkElement_click = function (evt, context) 
{
    // Find the tabStrip element (we know it's the parent element of this link)
    var tabstripElement = this.parentNode;
    Tabstrip.showTabByLink(tabstripElement, this);
    return eventCancel(evt);
}

ชิมเป็นสิ่งที่ดี แต่สิ่งที่ได้เปรียบในทางปฏิบัติมากกว่าreturn false;? คำตอบของ kameshเกี่ยวข้องกับสิ่งนี้เพียงเล็กน้อย แต่เนื่องจากมีโอกาสที่คุณจะชิมอย่างใดอย่างหนึ่งผลลัพธ์ที่แยกต่างหากเหล่านั้นจะทำการtabstripLinkElement_clickเปลี่ยนแปลงจากเบราว์เซอร์ไปยังเบราว์เซอร์อย่างไร หากไม่มีความแตกต่างในการปฏิบัติงานทำไม (ในทางปฏิบัติ) ก็รบกวน (แม้ว่าในทางทฤษฎีแล้วนี่คือสิ่งที่ถูกต้องที่ควรทำ)? ขอบคุณและ AIA สำหรับคำถามคำตอบซอมบี้
ruffin

7
elseบล็อกรหัสแรกที่มีต่อท้าย รูปแบบการเข้ารหัสที่น่ากลัว เพิ่มในวงเล็บปีกกาบางอย่างเพื่อให้มันไม่ชัดเจน
mbomb007

23

อะไร"กลับเท็จ"เป็นจริงทำ?

return false เป็นการทำสามสิ่งที่แยกจากกันมากเมื่อคุณเรียกมันว่า:

  1. event.preventDefault ();
  2. event.stopPropagation ();
  3. หยุดการเรียกกลับและส่งคืนทันทีเมื่อถูกเรียก

ดูjquery-events-stop-misusing-return-falseสำหรับข้อมูลเพิ่มเติม

ตัวอย่างเช่น :

ในขณะที่คลิกที่ลิงค์นี้กลับเท็จจะยกเลิกการทำงานเริ่มต้นของเบราว์เซอร์

<a href='#' onclick='someFunc(3.1415926); return false;'>Click here !</a>

7
onclick = "return false" ไม่เหมือนกับการส่งคืน false จากตัวจัดการเหตุการณ์การคลิก jQuery เบราว์เซอร์ป้องกันตัวจัดการเริ่มต้นเท่านั้น (เช่นe.preventDefault()) แต่ไม่หยุดการเผยแพร่ ดู: jsfiddle.net/18yq1783
Jamie Treworgy

1
Fwiw ลิงก์ไปยังบล็อกนั้นใช้งานไม่ได้ เก็บอยู่ที่นี่
ruffin

16

การดึงข้อมูลเท็จจากเหตุการณ์ JavaScript มักจะยกเลิกพฤติกรรม "เริ่มต้น" - ในกรณีของลิงก์ลิงก์จะบอกเบราว์เซอร์ว่าจะไม่ติดตามลิงก์


5
"มักจะ"? ดังนั้นไม่เสมอไปหรือ
Maria Ines Parnisari

12

ฉันเชื่อว่ามันทำให้เหตุการณ์มาตรฐานไม่เกิดขึ้น

ในตัวอย่างของคุณเบราว์เซอร์จะไม่พยายามไปที่ #


12

Return false จะหยุดการเชื่อมโยงหลายมิติที่ถูกติดตามหลังจากรันจาวาสคริปต์แล้ว สิ่งนี้มีประโยชน์สำหรับจาวาสคริปต์ที่ไม่สร้างความรำคาญซึ่งลดระดับลงอย่างงดงาม - ตัวอย่างเช่นคุณอาจมีภาพขนาดย่อที่ใช้จาวาสคริปต์เพื่อเปิดป๊อปอัปของภาพขนาดเต็ม เมื่อปิดจาวาสคริปต์หรือภาพถูกคลิกกลาง (เปิดในแท็บใหม่) สิ่งนี้จะไม่สนใจเหตุการณ์ onClick และเพิ่งเปิดภาพเป็นภาพขนาดเต็มตามปกติ

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


7

การใช้ return false ในเหตุการณ์ onclick หยุดเบราว์เซอร์ไม่ให้ประมวลผลสแต็กการประมวลผลที่เหลือซึ่งรวมถึงการติดตามลิงก์ในแอ็ตทริบิวต์ href

กล่าวอีกนัยหนึ่งการเพิ่ม return return จะหยุดการทำงานของ href ในตัวอย่างของคุณนี่คือสิ่งที่คุณต้องการ

ในปุ่มมันไม่จำเป็นเพราะ onclick คือทั้งหมดที่มันจะเคยดำเนินการ - ไม่มี href ในการประมวลผลและไปที่


6

ผลตอบแทนที่เท็จคือการบอกว่าจะไม่ดำเนินการเริ่มต้นซึ่งในกรณีของการที่<a href>จะไปตามลิงค์ เมื่อคุณกลับเท็จเป็น onclick href จะถูกละเว้น



3

กลับเท็จจะป้องกันการนำทาง มิฉะนั้นตำแหน่งจะกลายเป็นค่าตอบแทนของ someFunc


ไม่สถานที่จะกลายเป็นเนื้อหาของแอตทริบิวต์ href
Chris Marasti-Georg

ตำแหน่งจะกลายเป็นค่าส่งคืนของ someFunc เท่านั้นหากเป็น href = "javascript: someFunc ()" นี่ไม่ใช่กรณีสำหรับตัวจัดการเหตุการณ์
Jim

3

การreturn falseป้องกันไม่ให้เพจถูกเลื่อนและเลื่อนหน้าต่างที่ไม่ต้องการไปด้านบนหรือด้านล่าง

onclick="return false"

3

ฉันกำลังประหลาดใจที่ไม่มีใครกล่าวถึงแทนonmousedown onclick

onclick='return false'

ไม่ได้จับพฤติกรรมเริ่มต้นของเบราว์เซอร์ทำให้เกิดการเลือกข้อความ (บางครั้งไม่พึงประสงค์) เกิดขึ้นmousedownแต่

onmousedown='return false'

ทำ.

กล่าวอีกนัยหนึ่งเมื่อฉันคลิกที่ปุ่มบางครั้งข้อความจะถูกเลือกโดยไม่ตั้งใจเปลี่ยนรูปลักษณ์ของปุ่มซึ่งอาจไม่เป็นที่ต้องการ นั่นคือพฤติกรรมเริ่มต้นที่เราพยายามป้องกันที่นี่ อย่างไรก็ตามmousedownมีการลงทะเบียนเหตุการณ์ก่อนหน้าclickนี้ดังนั้นหากคุณป้องกันพฤติกรรมนั้นไว้ในclickตัวจัดการของคุณเท่านั้นเหตุการณ์นั้นจะไม่ส่งผลต่อการเลือกที่ไม่ต้องการที่เกิดขึ้นจากmousedownเหตุการณ์ ดังนั้นข้อความยังคงถูกเลือก อย่างไรก็ตามการป้องกันการเริ่มต้นสำหรับmousedownเหตุการณ์จะทำงาน

ดูเพิ่มเติมที่event.preventDefault () เทียบกับ return false


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

0

ฉันมีลิงค์นี้ในหน้า HTML ของฉัน:

<a href = "" 
onclick = "setBodyHtml ('new content'); return false; "
> click here </a>

ฟังก์ชัน setBodyHtml () ถูกกำหนดเป็น:

function setBodyHtml (s)
{ document.body.innerHTML = s;
}

เมื่อฉันคลิกลิงก์ลิงก์จะหายไปและข้อความที่แสดงในเบราว์เซอร์จะเปลี่ยนเป็น "เนื้อหาใหม่"

แต่ถ้าฉันลบ "false" ออกจากลิงค์ของฉันการคลิกที่ลิงก์จะไม่ทำอะไรเลย ทำไมถึงเป็นอย่างนั้น?

เป็นเพราะถ้าฉันไม่คืนค่าเท็จพฤติกรรมเริ่มต้นของการคลิกลิงค์และแสดงหน้าเป้าหมายที่เกิดขึ้นจะไม่ถูกยกเลิก แต่นี่คือ href ของไฮเปอร์ลิงก์คือ "" ดังนั้นลิงก์จะกลับไปยังหน้าปัจจุบันของ SAME ดังนั้นหน้าจะรีเฟรชอย่างมีประสิทธิภาพและดูเหมือนไม่มีอะไรเกิดขึ้น

ในพื้นหลังฟังก์ชั่น setBodyHtml () ยังคงได้รับการดำเนินการ มันกำหนดอาร์กิวเมนต์ของมันให้กับ body.innerHTML แต่เนื่องจากมีการรีเฟรชหน้า / โหลดเนื้อหาเนื้อหาที่แก้ไขใหม่ทันทีไม่สามารถมองเห็นได้นานกว่าสองสามมิลลิวินาทีดังนั้นฉันจะไม่เห็น

ตัวอย่างนี้แสดงว่าทำไมบางครั้ง USEFUL ถึงใช้ "return false"

ฉันต้องการกำหนด Sref href ให้กับลิงก์เพื่อให้แสดงเป็นลิงก์เป็นข้อความที่ขีดเส้นใต้ แต่ฉันไม่ต้องการให้คลิกที่ลิงค์เพื่อโหลดหน้าเว็บอีกครั้งอย่างมีประสิทธิภาพ ฉันต้องการให้ยกเลิกการนำทางเริ่มต้น = พฤติกรรมและผลข้างเคียงใด ๆ ที่เกิดจากการเรียกใช้ฟังก์ชั่นของฉัน ดังนั้นฉันจะต้อง "กลับเท็จ"

ตัวอย่างข้างต้นเป็นสิ่งที่คุณจะลองใช้ในระหว่างการพัฒนาอย่างรวดเร็ว สำหรับการผลิตคุณมีแนวโน้มที่จะกำหนดตัวจัดการการคลิกใน JavaScript และโทร PreventDefault () แทน แต่สำหรับการลองใช้อย่างรวดเร็วคำสั่ง "return false" ด้านบนจะทำการหลอกลวง


0

เมื่อใช้แบบฟอร์ม, เราสามารถใช้ 'คืนเท็จ' เพื่อป้องกันการส่ง

function checkForm() {
    // return true to submit, return false to prevent submitting
}
<form onsubmit="return checkForm()">
    ...
</form>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.