ฉันจะปิดใช้งาน HREF ได้อย่างไรหากดำเนินการ onclick


98

ฉันมีจุดยึดพร้อมทั้ง HREFและONCLICKแอตทริบิวต์ที่ตั้งไว้ หากการคลิกและจาวาสคริปต์ที่เปิดใช้งานฉันต้องการให้เพียงดำเนินการและไม่สนใจONCLICK HREFในทำนองเดียวกันถ้า Javascript ถูกปิดใช้งานหรือไม่สนับสนุนผมอยากให้มันเป็นไปตามHREFURL ONCLICKและไม่สนใจ ด้านล่างนี้เป็นตัวอย่างของสิ่งที่ฉันกำลังทำซึ่งจะเรียกใช้ JS และไปตามลิงค์พร้อมกัน (โดยปกติ JS จะถูกเรียกใช้งานจากนั้นหน้าจะเปลี่ยนไป):

<A HREF="http://example.com/no-js-login" ONCLICK="yes_js_login()">Log in</A>

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

ฉันหวังว่าจะได้คำตอบ Javascript แต่ฉันจะยอมรับวิธีการใดก็ได้ตราบเท่าที่มันใช้งานได้โดยเฉพาะอย่างยิ่งหากสามารถทำได้ด้วย PHP ฉันได้อ่าน " ลิงก์ href ดำเนินการและเปลี่ยนเส้นทางหน้าก่อนที่ฟังก์ชัน javascript onclick จะสามารถดำเนินการให้เสร็จสิ้น " แล้ว แต่จะมีเพียงความล่าช้าHREFแต่ไม่ได้ปิดใช้งานอย่างสมบูรณ์ ฉันยังมองหาสิ่งที่ง่ายกว่านี้


4
ฉันจะใช้เพื่อยึดหนึ่งอันด้วย href และอีกอันที่ไม่มี ในการโหลดหน้าให้ตรวจสอบว่าจาวาสคริปต์เปิดใช้งานอยู่หรือไม่หากแสดงจุดยึดที่ถูกต้องอีกแสดงอีก
ewein

1
@ewein ทำไม? ฟังดูเหมือนมาร์กอัปที่แย่มากสำหรับคุณสมบัติง่ายๆ
Supuhstar

คำตอบ:


61

คุณสามารถใช้โซลูชันแรกที่ไม่ได้แก้ไขหากคุณใส่ผลตอบแทนเป็นอันดับแรกในonclickแอตทริบิวต์:

<a href="https://example.com/no-js-login" onclick="return yes_js_login();">Log in</a>

yes_js_login = function() {
     // Your code here
     return false;
}

ตัวอย่าง: https://jsfiddle.net/FXkgV/289/


1
ฉันชอบความสะอาด! อย่างไรก็ตามโซลูชันที่ได้รับการยอมรับทำให้ฉันควบคุมได้มากขึ้นว่า HREF ถูกละเว้นหรือไม่
Supuhstar

สองสามปีที่ผ่านมาฉันเปลี่ยนใจ นี่คือทางออกที่ดีกว่า
Supuhstar

บริสุทธ์ขนาดไหน!
DrunkDevKek

แต่สิ่งนี้ใช้ไม่ได้กับปฏิกิริยา JSX จะได้ผลหรือไม่
Coder

1
ซึ่งช่วยประหยัดเวลาได้มาก
Mark Lozano

61
    yes_js_login = function() {
         // Your code here
         return false;
    }

หากคุณส่งคืนเท็จควรป้องกันการกระทำเริ่มต้น (ไปที่ href)

แก้ไข:ขออภัยที่ดูเหมือนจะไม่ได้ผลคุณสามารถดำเนินการต่อไปนี้แทน:

<a href="http://example.com/no-js-login" onclick="yes_js_login(); return false;">Link</a>

1
คำตอบที่แก้ไขไม่ตอบคำถามเนื่องจากจะลบลิงก์จริงออกไป
Itai Bar-Haim

12
หรือใช้onclick="return yes_js_login();"กับการyes_js_loginส่งคืนfalse
Uwe Kleine-König

1
@cgogolin ดูคำตอบของฉัน
Gabe Rogan

สำหรับใครที่ยังติดขัดสามารถเพิ่มบรรทัดนี้event.stopImmediatePropagation()
didxga

35

เพียงปิดการทำงานของเบราว์เซอร์เริ่มต้นโดยใช้preventDefaultและส่งผ่านeventภายใน HTML ของคุณ

<a href=/foo onclick= yes_js_login(event)>Lorem ipsum</a>

yes_js_login = function(e) {
  e.preventDefault();
}

1
return false ไม่ทำงานในโพลีเมอร์ ... วิธีแก้ปัญหาข้างต้นใช้งานได้ ... ขอบคุณ
Paras Sachapara

16
<a href="http://www.google.com" class="ignore-click">Test</a>

ด้วย jQuery:

<script>
    $(".ignore-click").click(function(){
        return false;
    })
</script>

ด้วย JavaScript

<script>
        for (var i = 0; i < document.getElementsByClassName("ignore-click").length; i++) {
            document.getElementsByClassName("ignore-click")[i].addEventListener('click', function (event) {
                event.preventDefault();
                return false;
            });
        }
</script>

คุณกำหนดชั้นเรียน.ignore-clickให้กับองค์ประกอบต่างๆที่คุณต้องการและการคลิกองค์ประกอบเหล่านั้นจะถูกละเว้น


นี่เป็นทางออกที่ยอดเยี่ยม! ฉันใช้มันสำหรับปุ่มที่ฉันมีเมื่อคลิกคลาสหลอก.btn-loadingจะถูกเพิ่มลงในลิงก์ที่คลิกแล้วหากทำเครื่องหมายถูก (ในข้อผิดพลาด X) จะแทนที่ภาพเคลื่อนไหวการโหลด ฉันไม่ต้องการให้ปุ่มนั้นสามารถคลิกได้อีกในบางกรณี (สำหรับทั้งความสำเร็จและข้อผิดพลาด) การใช้สิ่งนี้ฉันสามารถ$(elemnent).addClass('disabled')บรรลุฟังก์ชันที่ฉันกำลังมองหาได้อย่างง่ายดายและง่ายดาย!
Matthew Mathieson


5

จะง่ายกว่าถ้าคุณส่งพารามิเตอร์เหตุการณ์เช่นนี้:

<a href="#" onclick="yes_js_login(event);">link</a>
function yes_js_login(e) {
    e.stopImmediatePropagation();
}

1
นั่นไม่ได้ผลสำหรับฉัน ฉันต้องใช้ e.preventDefault ()
Milan Simek

2

สิ่งนี้อาจช่วยได้ ไม่จำเป็นต้องใช้ JQuery

<a href="../some-relative-link/file" 
onclick="this.href = 'https://docs.google.com/viewer?url='+this.href; this.onclick = '';" 
target="_blank">

รหัสนี้ทำสิ่งต่อไปนี้: ส่งลิงก์สัมพัทธ์ไปยังGoogle Docs Viewer

  1. รับเวอร์ชันลิงก์เต็มของจุดยึดโดย this.href
  2. เปิดลิงค์หน้าต่างใหม่

ดังนั้นในกรณีของคุณสิ่งนี้อาจใช้ได้:

<a href="../some-relative-link/file" 
onclick="this.href = 'javascript:'+console.log('something has stopped the link'); " 
target="_blank">

1

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

ตัวอย่าง:

<a onclick="http://blahblah" href="http://blahblah" target="_blank">A regular link</a>
<a onclick="javascript:myFunc($(this));return false" href="javascript:myFunc($(this));"  target="_blank">javascript with self reference</a>

แอตทริบิวต์ href และ onClick มีค่าเหมือนกันยกเว้น I ต่อท้าย "return false" บน onClick เมื่อเป็นการเรียกใช้จาวาสคริปต์ การมี "return false" ในฟังก์ชันที่เรียกว่าไม่ทำงาน


ทำไมมีสองคน? ทำไมคุณถึงใส่ JS ลงในHREF?
Supuhstar

Supuhstar รหัสจริงเป็นแบบไดนามิกจาวาสคริปต์และจะสร้างองค์ประกอบ <a> สำหรับรายการหลายร้อยรายการที่กำหนดไว้ภายนอก แต่ละรายการจะระบุที่อยู่ลิงก์แบบคงที่และเป็นที่ที่องค์ประกอบ <a> ที่สร้างขึ้นควรใช้ "พฤติกรรม href" ปกติ หรือระบุการเรียกใช้ฟังก์ชันจาวาสคริปต์สำหรับรายการซึ่งในกรณีนี้จะคำนวณพฤติกรรมขององค์ประกอบ <a> ตามบริบทขององค์ประกอบ และในโค้ดสำหรับเครื่องกำเนิด <a> ฉันแค่ต้องการคัดลอกสิ่งที่ระบุไว้สำหรับแต่ละองค์ประกอบโดยไม่ต้องทดสอบว่าเป็นที่อยู่ลิงก์หรือการเรียกใช้ฟังก์ชันจาวาสคริปต์
Bo Johanson

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

1

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

<a href="" onclick="return false;">Action</a>

1
ขอบคุณสำหรับคำตอบและยินดีต้อนรับสู่ Stack Exchange! น่าเสียดายที่ดูเหมือนจะไม่ได้เพิ่มความรู้ใหม่ ๆ เนื่องจากดูเหมือนว่าคำตอบก่อนหน้านี้จะแนะนำสิ่งนี้ หากคุณเห็นด้วยก็จะเป็นการดีกว่าที่จะโหวตให้คะแนน หากคุณไม่เห็นด้วยโปรดแก้ไขคำตอบของคุณเพื่อให้ความรู้ใหม่ของคุณสว่างขึ้น!
Supuhstar

0

ในกรณีของฉันฉันมีเงื่อนไขเมื่อผู้ใช้คลิกองค์ประกอบ "a" เงื่อนไขคือ:

หากส่วนอื่นมีมากกว่าสิบรายการผู้ใช้ไม่ควรเปลี่ยนเส้นทางไปยังหน้าอื่น

หากส่วนอื่นมีน้อยกว่าสิบรายการผู้ใช้ควรถูกเปลี่ยนเส้นทางไปยังหน้าอื่น

การทำงานขององค์ประกอบ "a" ขึ้นอยู่กับองค์ประกอบอื่น ๆ รหัสภายในเหตุการณ์การคลิกมีดังต่อไปนี้:

var elementsOtherSection = document.querySelectorAll("#vehicle-item").length;
if (elementsOtherSection> 10){
     return true;
}else{
     event.preventDefault();
     return false;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.