จะใช้ลิงค์เพื่อโทรหา JavaScript ได้อย่างไร?


คำตอบ:


192
<a onclick="jsfunction()" href="#">

หรือ

<a onclick="jsfunction()" href="javascript:void(0);">

แก้ไข:

คำตอบข้างต้นนั้นไม่ใช่ทางออกที่ดีจริงๆหลังจากเรียนรู้มากเกี่ยวกับ JS ตั้งแต่ฉันโพสต์ครั้งแรก ดูคำตอบของ EndangeredMassaด้านล่างสำหรับวิธีการที่ดีกว่าในการแก้ปัญหานี้


11
ฉันจะแนะนำอันที่สองเนื่องจากอันแรกเลื่อนคุณไปที่ด้านบนของหน้า
Matt Grande

7
ใช่มันจะแน่นอนเว้นแต่คุณจะเพิ่ม "คืนเท็จ" หลังจากฟังก์ชั่นของคุณ
Chelsea

26
นี่คือรหัส 1998 ใช้หนึ่งในโซลูชันที่ไม่เป็นการรบกวน กรุณา.
Andrew Hedges

7
ไม่ใช้เลย! ลิงค์ใช้สำหรับเชื่อมโยงพวกเขาไม่ใช่องค์ประกอบหลอกตาที่จะเรียกจาวาสคริปต์
I.devries

4
หากคุณต้องการวางจาวาสคริปต์แบบอินไลน์ให้ทำเช่นนี้: <a onclick="jsfunction;return false" href="linkasnormal">
Fire Crow

201

JavaScript ไม่สร้างความรำคาญไม่มีการพึ่งพาไลบรารี:

<html>
<head>
    <script type="text/javascript">

        // Wait for the page to load first
        window.onload = function() {

          //Get a reference to the link on the page
          // with an id of "mylink"
          var a = document.getElementById("mylink");

          //Set code to run when the link is clicked
          // by assigning a function to "onclick"
          a.onclick = function() {

            // Your code here...

            //If you don't want the link to actually 
            // redirect the browser to another page,
            // "google.com" in our example here, then
            // return false at the end of this block.
            // Note that this also prevents event bubbling,
            // which is probably what we want here, but won't 
            // always be the case.
            return false;
          }
        }
    </script>
</head>
<body>
    <a id="mylink" href="http://www.google.com">linky</a>        
</body>
</html>

26
คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้ถึงดีกว่าคำตอบที่ได้รับการยอมรับในปัจจุบันและสคริปต์ควรเข้าไปที่หน้าไหน (เพราะนี่เป็นคำถามระดับเริ่มต้นที่ชัดเจน)
Bill Lizard

8
แน่นอนค่ะ Updated
EndangeredMassa

6
ดังนั้นฉันจะใส่อะไรhrefถ้าฉันไม่ต้องการเปลี่ยนเส้นทางผู้ใช้และเพียงแค่ต้องการเรียกใช้รหัสบางอย่าง? แก้ไข: href=""ฉันเห็นว่ามันสามารถมีช่องว่างด้านซ้าย:
SabreWolfy

6
เหตุใดจึงเป็นการดีกว่าที่จะเพิ่มonclickกิจกรรมผ่านwindow.onloadแทนที่จะใส่onclickโดยตรงใน<a>แท็ก?
นาธานรีด

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

47
<a href="javascript:alert('Hello!');">Clicky</a>

แก้ไขหลายปีต่อมา:ไม่! ไม่เคยทำเช่นนี้! ฉันยังเด็กและโง่!

แก้ไขอีกครั้ง:มีคนถามว่าทำไมคุณไม่ควรทำเช่นนี้ มีสองเหตุผล:

  1. การนำเสนอ: HTML ควรเน้นที่การนำเสนอ การวาง JS ไว้ใน HREF หมายความว่า HTML ของคุณเป็นแบบนี้แล้วจัดการกับตรรกะทางธุรกิจ

  2. การรักษาความปลอดภัย:จาวาสคริปต์ใน HTML ของคุณเช่นที่ละเมิดนโยบายความปลอดภัยของเนื้อหา (CSP) Content Security Policy (CSP) เป็นเลเยอร์ความปลอดภัยที่เพิ่มขึ้นซึ่งช่วยในการตรวจจับและลดการโจมตีบางประเภทรวมถึง Cross-Site Scripting (XSS) และการโจมตีการฉีดข้อมูล การโจมตีเหล่านี้ใช้สำหรับทุกสิ่งตั้งแต่การขโมยข้อมูลไปจนถึงการกำหนดไซต์หรือแจกจ่ายมัลแวร์ อ่านเพิ่มเติมได้ที่นี่

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


16
บางทีคำอธิบายบางส่วนของปัญหาด้วยวิธีนี้? นี่คือเลวร้ายยิ่งกว่าhref='#'และalert()ในonclick?
โทมัส Ahle

3
ฉันยังใหม่กับ javascript และไม่เข้าใจว่ามีอะไรผิดปกติกับสิ่งนี้ .. คำอธิบายใด ๆ ที่จะดี
nilanjanaLodh

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

43

และทำไมไม่สร้างความรำคาญกับ jQuery:

  $(function() {
    $("#unobtrusive").click(function(e) {
      e.preventDefault(); // if desired...
      // other methods to call...
    });
  });

HTML

<a id="unobtrusive" href="http://jquery.com">jquery</a>

2
การทำงานกับ SEO เช่นนี้ซอฟต์แวร์รวบรวมข้อมูลจะค้นหาลิงก์และติดตามได้หรือไม่
Ahi Tuna

11
เพราะไม่ใช่ทุกคนที่ใช้ jquery
สตู

1
@GregMiernicki ใช่และไม่ขึ้นอยู่กับความหมายของลิงก์ ดูที่ HTML Webcrawler หรือไคลเอนต์ใด ๆ ที่ปิดการใช้งานจาวาสคริปต์จะไปที่ HREF ที่กำหนด Javascript ที่เปิดใช้งานไคลเอนต์จะเรียกใช้การคลิกและจากนั้นไปตามลิงก์หากฟังก์ชันนั้นไม่ส่งคืนค่าเท็จหรือโทร PreventDefault ในกรณีนี้ href เป็นทางเลือกดังนั้นทำไมจึงเรียกว่า "ไม่เป็นการรบกวน"
Evan Langlois

12

Javascript ที่ไม่เป็นการรบกวนมีข้อดีหลายประการนี่คือขั้นตอนที่ใช้และทำไมจึงใช้งานได้ดี

  1. ลิงก์โหลดตามปกติ:

    <a id="DaLink" href="http://host/toAnewPage.html"> คลิกที่นี่ </a>

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

  1. จาวาสคริปต์ทำงานในการโหลดหน้า:

     window.onload = function(){
            document.getElementById("DaLink").onclick = function(){
                   if(funcitonToCall()){
                       // most important step in this whole process
                       return false;
                   }
            }
     }
  2. หากจาวาสคริปต์ทำงานได้สำเร็จอาจโหลดเนื้อหาในหน้าปัจจุบันด้วยจาวาสคริปต์การส่งคืนเท็จจะยกเลิกการใช้ลิงค์ กล่าวอีกนัยหนึ่งการใส่ return return มีผลต่อการปิดการใช้งานลิงค์หาก javascript ทำงานได้สำเร็จ ในขณะที่ปล่อยให้มันทำงานหากจาวาสคริปต์ไม่ทำสำรองข้อมูลที่ดีเพื่อให้เนื้อหาของคุณได้รับการแสดงอย่างใดอย่างหนึ่งสำหรับเครื่องมือค้นหาและถ้ารหัสของคุณแตกหรือดูในระบบที่ไม่ใช่จาวาสคริปต์

หนังสือที่ดีที่สุดในเรื่องคือ "Dom Scription" โดย Jeremy Keith


9

หรือถ้าคุณใช้PrototypeJS

<script type="text/javascript>
  Event.observe( $('thelink'), 'click', function(event) {
      //do stuff

      Event.stop(event);
  }
</script>

<a href="#" id="thelink">This is the link</a>

1
ฉันชอบที่จะไม่ใส่ฟังก์ชั่นการจัดการเหตุการณ์ในสาย
Mark Biek

1
มันเป็นวิธีเดียวที่จะไป โปรดลงคะแนนคำตอบแบบอินไลน์ มันเป็นวิธีปฏิบัติที่ไม่มีข้อแก้ตัวในสมัยนี้
Andrew Hedges

5
@Andrew: กรุณาแสดงความคิดเห็นพร้อมกับ downvote ของคุณอธิบายว่าทำไมคำตอบแบบอินไลน์ไม่ดี
Bill the Lizard


0

ตาม @mister_lucky คำตอบที่ใช้กับ jquery:

$('#unobtrusive').on('click',function (e) {
    e.preventDefault(); //optional
    //some code
});

รหัส Html:

<a id="unobtrusive" href="http://jquery.com">jquery</a>

-2

เพียงใช้ javascript: ---- exemplale

javascript:var JFL_81371678974472 = new JotformFeedback({ formId: '81371678974472', base: 'https://form.jotform.me/', windowTitle: 'Photobook Series', background: '#e44c2a', fontColor: '#FFFFFF', type: 'false', height: 700, width: 500, openOnLoad: true })
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.