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


119

ฉันมีลิงค์ดังนี้:

<a href="#" onclick="myfunc({a:1, b:'hi'})" />click</a>
<a href="#" onclick="myfunc({a:3, b:'jo'})" />click</a>

และฉันต้องการที่จะทำpreventDefault()ภายในmyfunc()เพราะ#จะถูกเพิ่มในแถบที่อยู่เมื่อคลิกที่ลิงค์ (โดยไม่ต้องทำreturn false;หรือhref='javascript:void(0);')

เป็นไปได้หรือไม่ ฉันขอเข้าร่วมกิจกรรมได้ไหมmyfunc()


6
return false มีอะไรผิดปกติ?
Alex

5
มันหยุดการขยายพันธุ์ด้วย
Omu

4
return falseหยุดการแพร่กระจายภายใน jQuery เท่านั้น
cruzanmo

คำตอบ:


157

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

ตัวอย่างสั้น

function sayHi(e) {
   e.preventDefault();
   alert("hi");
}
<a href="http://google.co.uk" onclick="sayHi(event);">Click to say Hi</a>

  1. เรียกใช้ตามที่เป็นอยู่และสังเกตว่าลิงก์ไม่เปลี่ยนเส้นทางไปยัง Google หลังจากการแจ้งเตือน
  2. จากนั้นเปลี่ยนการeventส่งผ่านไปยังonclickตัวจัดการเป็นอย่างอื่นเช่นeคลิกรันจากนั้นสังเกตว่าการเปลี่ยนเส้นทางเกิดขึ้นหลังจากการแจ้งเตือน (บานหน้าต่างผลลัพธ์จะเป็นสีขาวแสดงถึงการเปลี่ยนเส้นทาง)

5
ตกลงฉันเห็นสิ่งที่ฉันต้องทำคือใส่พารามิเตอร์ของฉันเป็นอันดับสองmyfunc(event, {a:123, b:"asdas"})
Omu

1
@Omu อาร์กิวเมนต์ที่ส่งผ่านเหตุการณ์สามารถอยู่ในที่ใดก็ได้ไม่จำเป็นต้องเป็นอาร์กิวเมนต์แรกตราบใดที่อยู่ในตำแหน่งที่ถูกต้องของรายการพารามิเตอร์ที่กำหนดสำหรับฟังก์ชัน ยกตัวอย่างเช่นนั้นก็สามารถเรียกว่าเป็นfunction myfunc(o, e) {...} myfunc({a:1, b:'hi'}, event)
cateyes

2
ฉันคิดว่าคุณไม่จำเป็นต้องผ่านและจับวัตถุเหตุการณ์อย่างชัดเจน คุณสามารถอ้างถึงได้ในฟังก์ชัน ใครช่วยยืนยันหน่อยได้ไหม ฉันหมายความว่ารหัสนี้ที่ไม่มีเหตุการณ์ควรใช้งานได้เช่นกัน:function sayHi() { event.preventDefault(); alert("hi"); }
K Vij

111

ทางออกที่ง่ายที่สุดคือ:

<a href="#" onclick="event.preventDefault(); myfunc({a:1, b:'hi'});" />click</a>

เป็นวิธีที่ดีในการทำแคชสำหรับเอกสารที่มีทางเลือกสำรองสำหรับเบราว์เซอร์ที่ไม่เปิดใช้งาน JS (ไม่มีการป้องกันแคชหากไม่มี JS)

<a onclick="
if(event.preventDefault) event.preventDefault(); else event.returnValue = false;
window.location = 'http://www.domain.com/docs/thingy.pdf?cachebuster=' + 
Math.round(new Date().getTime() / 1000);" 
href="http://www.domain.com/docs/thingy.pdf">

หากเปิดใช้งาน JavaScript จะเปิด PDF ด้วยสตริงข้อความค้นหาที่ป้องกันแคชหากไม่ใช่เพียงแค่เปิด PDF


สามารถใช้เทคโนโลยีฝั่งเซิร์ฟเวอร์เพื่อเขียนลิงก์นั้นอีกครั้งหากการป้องกันแคชเป็นสิ่งที่คุณต้องการ
mpen

มันจะดีกว่า แต่ฉันไม่มีสิทธิ์เข้าถึงรหัสฝั่งเซิร์ฟเวอร์ ทำงานกับสิ่งที่ฉันมี
JuLo

11

ลองสิ่งนี้:

<script>
    $("a").click(function(event) {
        event.preventDefault(); 
    });
</script>

สิ่งนี้ต้องใช้แท็ก <script> สำหรับทุกเหตุการณ์การคลิกทำให้โค้ดซับซ้อนขึ้น
somid3

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

ไม่เห็นด้วยที่นี่การแยกวิเคราะห์อย่างง่ายไปยังฟังก์ชันอินไลน์นั้นมีประสิทธิภาพมากกว่าและโค้ดน้อยกว่า
Shannon Hochkins

1
@ somid3 ขณะ jQuery ไม่จำเป็น$("body").on("click","a",function(e) { e.preventDefault() });ถ้าคุณกำลังกังวลเกี่ยวกับประสิทธิภาพการทำงานคุณสามารถใช้ตัวจัดการเหตุการณ์เดียวที่ได้รับมอบหมายเพื่อให้คุณเพียงแนบเป็นผู้ฟังที่เดียวสำหรับแองเคอทั้งหมดในหน้าเช่นนี้: ไม่ว่าในกรณีใดโซลูชันทั้งสองจะไม่ส่งผลกระทบต่อประสิทธิภาพอย่างมีนัยสำคัญ
KyleMit

7
<script type="text/javascript">
$('a').click(function(){
   return false;
});
<script>

2
สิ่งนี้ใช้ได้กับทุกจุดยึดและจะทำลายลิงก์ทั้งหมดและต้องใช้จาวาสคริปต์เพื่อแทรกบนหน้าเช่นเดียวกับ jQuery
Shannon Hochkins

นอกจากนี้เมื่อใช้ jQuery return falseไม่แนะนำให้ใช้เนื่องจากจะป้องกันไม่ให้ตัวจัดการเหตุการณ์อื่น ๆ ทั้งหมดในองค์ประกอบนั้นทำงานและหยุดเหตุการณ์ไม่ให้เดือดไปยังองค์ประกอบที่สูงกว่า
Stijn de Witt

6

เพิ่มคลาสที่ไม่ซ้ำกันให้กับลิงก์และจาวาสคริปต์ที่ป้องกันไม่ให้ค่าเริ่มต้นของลิงก์กับคลาสนี้:

<a href="#" class="prevent-default" 
   onclick="$('.comment .hidden').toggle();">Show comments</a>

<script>
  $(document).ready(function(){

    $("a.prevent-default").click(function(event) {
         event.preventDefault(); 
          });
  });
</script>

แนวทางที่น่าสนใจสำหรับโซลูชันระดับโลก
อาฟเตอร์

5

คุณไม่เพียง แต่ลบแอตทริบิวต์ href จากแท็กไม่ได้หรือ


1
ใช่นั่นเป็นตัวเลือกเช่นกันแม้ว่าโดยค่าเริ่มต้นลิงก์จะไม่มีขีดเส้นใต้และหากปิดจาวาสคริปต์จะไม่มี href ไปที่
Omu

4

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

$("a[onClick]").on("click", function(e) {
  return e.preventDefault();
});


2

คุณสามารถเข้าถึงเหตุการณ์ได้จาก onclick ดังนี้:

<button onclick="yourFunc(event);">go</button>

และที่ฟังก์ชัน javascript ของคุณคำแนะนำของฉันคือการเพิ่มคำสั่งบรรทัดแรกเป็น:

function yourFunc(e) {
    e = e ? e : event;
}

จากนั้นใช้ทุกที่ e เป็นตัวแปรเหตุการณ์


0

e.preventDefault (); จากhttps://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault

หรือมีผลตอบแทนเท็จจากวิธีการของคุณ


1
คำตอบของคุณแตกต่างจากคำตอบที่ให้ไว้แล้วอย่างไร
Dimitar Spasovski

ฉันได้รับ URL เพื่อความชัดเจนยิ่งขึ้นสำหรับคำถามที่ถาม
rahul singh Chauhan

0

ไม่มีไลบรารี JS หรือ jQuery เพื่อเปิดหน้าต่างป๊อปอัปที่ดีถ้าเป็นไปได้ ไม่สามารถเปิดลิงก์ปกติได้อย่างปลอดภัย

<a href="https://acme.com/" onclick="onclick="openNewWindow(event, this.href);">...</a>

และฟังก์ชันตัวช่วย:

function openNewWindow(event, location) {
  if (event.preventDefault && event.stopImmediatePropagation) { 
    event.preventDefault(); 
    event.stopImmediatePropagation(); 
  } else {
    event.returnValue = false; 
  }
  window.open(location, 'targetWindow', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=800,height=450');
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.