จะเรียกฟังก์ชั่น JavaScript หลายฟังก์ชั่นในกิจกรรม onclick ได้อย่างไร?


241

มีวิธีใดบ้างที่จะใช้onclickแอตทริบิวต์ html เพื่อเรียกใช้ฟังก์ชัน JavaScript มากกว่าหนึ่งฟังก์ชัน


คำตอบ:


390
onclick="doSomething();doSomethingElse();"

แต่จริงๆแล้วคุณดีกว่าไม่ใช้onclickเลยและแนบตัวจัดการเหตุการณ์กับโหนด DOM ผ่านโค้ด Javascript ของคุณ นี้เป็นที่รู้จักกันจาวาสคริปต์ไม่สร้างความรำคาญ


1
ขอบคุณสำหรับการอ้างอิงถึง JS ที่ไม่สร้างความรำคาญฉันเคยเจอเรื่องนี้มาก่อนและฉันควรละเว้นจากการเขียน JS ที่น่ารังเกียจเพราะฉันขี้เกียจ! xD
Qcom

9
ไม่มีปัญหา ... ฉันขอแนะนำ jQuery ซึ่งจะช่วยให้คุณบรรลุเป้าหมายที่ไม่เป็นการรบกวน คุณสามารถแนบตัวจัดการเหตุการณ์เข้ากับองค์ประกอบ DOM ได้อย่างง่ายดายและทำได้มากกว่าทั้งหมดโดยไม่ส่งเสียงรบกวน ฉันใช้มันมา 2 ปีแล้วและไม่เคยหันกลับมามอง
แบรด

4
หากมีใครเรียกการกระทำใน onclick ล้มเหลวสิ่งทั้งปวงก็เหมือนโซ่โดมิโนและ onclick ไม่ทำงาน
Fiasco Labs

8
แอตทริบิวต์ html นี้เป็นจริงไม่ได้onclick="" onClick=""มันเป็นความผิดพลาดทั่วไป
DrewT

2
@ShubhamChopra สิ่งที่คุณกำลังพูดถึงjsxไม่ได้htmlและคำถามนี้ยังไม่ได้ติดแท็กด้วยjsx
DrewT

75

ลิงค์ที่มีการกำหนด 1 ฟังก์ชัน

<a href="#" onclick="someFunc()">Click me To fire some functions</a>

การยิงหลายฟังก์ชั่นจาก someFunc()

function someFunc() {
    showAlert();
    validate();
    anotherFunction();
    YetAnotherFunction();
}

5
IMHO นี่คือแนวทางของโปรแกรมเมอร์ที่แท้จริง
b1nary.atr0phy

2
@ b1nary.atr0phy ไม่ วิธีการเขียนโปรแกรมคือการเพิ่มคุณสมบัติ href = "" เมื่อผู้ใช้ไม่มีจาวาสคริปต์ จากนั้นด้วย javascript (เพื่อให้คุณรู้ว่าผู้ใช้รองรับ) คุณลบ href และเพิ่มผู้ฟังเหตุการณ์ไปยังเหตุการณ์ ด้วยวิธีนี้หากโมดูลอื่นของโค้ดของคุณจะรับฟังการคลิกเดียวกันมันจะไม่ถูกเขียนทับหรือเขียนทับโค้ดของคุณ อ่าน: developer.mozilla.org/en-US/docs/Web/API/Event
gcb

3
สิ่งนี้อาจทำงานได้ไม่ดีหากคุณมีข้อโต้แย้งใด ๆ ที่ส่งผ่านไปยังฟังก์ชั่นโดยเฉพาะอย่างยิ่งถ้าคุณสร้างข้อโต้แย้งเหล่านั้นจากภาษาฝั่งเซิร์ฟเวอร์ มันจะง่ายต่อการสร้าง / รักษารหัสโดยการผนวกฟังก์ชั่น (กับข้อโต้แย้งใด ๆ ) ภายในภาษาฝั่งเซิร์ฟเวอร์มากกว่าการทดสอบการทำซ้ำที่เป็นไปได้ทั้งหมดบนเซิร์ฟเวอร์และไคลเอนต์
กาลักน้ำ

นี่คือสิ่งที่สวยงามและสง่างาม
Tessaracter

38

นี่เป็นรหัสที่จำเป็นถ้าคุณใช้ JavaScript เท่านั้นไม่ใช่ jQuery

var el = document.getElementById("id");
el.addEventListener("click", function(){alert("click1 triggered")}, false);
el.addEventListener("click", function(){alert("click2 triggered")}, false);

7
นี่ควรเป็นคำตอบที่ถูกต้องและวิธีการที่ถูกต้อง
ฟิวชั่น

11

ฉันจะใช้element.addEventListenerวิธีการเชื่อมโยงไปยังฟังก์ชั่น จากฟังก์ชั่นนั้นคุณสามารถเรียกใช้หลายฟังก์ชั่นได้

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


9

แน่นอนว่าต้องผูกมัดผู้ฟังหลายคน

Short cutting with jQuery

$("#id").bind("click", function() {
  alert("Event 1");
});
$(".foo").bind("click", function() {
  alert("Foo class");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo" id="id">Click</div>


@hunter: ฉันตัดสั้นด้วย jQuery ฉันจำรหัสฟังเหตุการณ์ดั้งเดิมไม่ได้ คุณสามารถทำสิ่งที่ Marko กล่าวถึง แต่จะดีกว่าถ้าใช้ฟังเหตุการณ์
Josh K

1
อาจไม่ได้ตอบคำถามเดิม แต่เนื่องจากฉันใช้ jQuery มันตอบฉัน
Fiasco Labs

1
มีวิธีใดในการทำเช่นนี้กับ Javascript แบบธรรมดาธรรมดา?
CodyBugstein

4

ปฏิกิริยา ES6

<MenuItem
  onClick={() => {
    this.props.toggleTheme();
    this.handleMenuClose();
  }}
>

2
@ นี่คือ JSX, คำถามนี้ไม่ได้ติดแท็กภายใต้ jsx
Shubham Chopra

2

var btn = document.querySelector('#twofuns');
btn.addEventListener('click',method1);
btn.addEventListener('click',method2);
function method2(){
  console.log("Method 2");
}
function method1(){
  console.log("Method 1");
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Pramod Kharade-Javascript</title>
</head>
<body>
<button id="twofuns">Click Me!</button>
</body>
</html>

คุณสามารถบรรลุ / โทรหนึ่งเหตุการณ์ด้วยวิธีการอย่างน้อยหนึ่งวิธี


1

คุณสามารถเพิ่มได้หลายรหัสเท่านั้นแม้ว่าคุณจะมีonclickแอททริบิวที่สองใน html ที่มันถูกละเว้นและclick2 triggeredไม่เคยถูกพิมพ์ออกมาคุณสามารถเพิ่มหนึ่งในการดำเนินการmousedownแต่นั่นก็เป็นเพียงวิธีแก้ปัญหา

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

var element = document.getElementById("multiple_onclicks");
element.addEventListener("click", function(){console.log("click3 triggered")}, false);
element.addEventListener("click", function(){console.log("click4 triggered")}, false);
<button id="multiple_onclicks" onclick='console.log("click1 triggered");' onclick='console.log("click2 triggered");' onmousedown='console.log("click mousedown triggered");'  > Click me</button>

คุณต้องระวังเนื่องจากเหตุการณ์ต่างๆสามารถเกิดขึ้นได้และหากคุณต้องการเพิ่มหลายเหตุการณ์


1

นอกจากนี้หนึ่งสำหรับ JavaScript ที่บำรุงรักษาได้ใช้ฟังก์ชันชื่อ

นี่คือตัวอย่างของฟังก์ชันนิรนาม:

var el = document.getElementById('id');

// example using an anonymous function (not recommended):
el.addEventListener('click', function() { alert('hello world'); });
el.addEventListener('click', function() { alert('another event') });

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

คุณสามารถใช้ฟังก์ชั่นที่มีชื่อแทน:

var el = document.getElementById('id');

// create named functions:
function alertFirst() { alert('hello world'); };
function alertSecond() { alert('hello world'); };

// assign functions to the event listeners (recommended):
el.addEventListener('click', alertFirst);
el.addEventListener('click', alertSecond);

// then you could remove either one of the functions using:
el.removeEventListener('click', alertFirst);

นอกจากนี้ยังช่วยให้รหัสของคุณง่ายต่อการอ่านและบำรุงรักษา โดยเฉพาะอย่างยิ่งถ้าฟังก์ชั่นของคุณมีขนาดใหญ่


สำหรับข้อมูลเพิ่มเติม "ผู้สอน" Avelx มีวิดีโอที่ดีที่ฉันสามารถแนะนำเกี่ยวกับเรื่องนี้: youtube.com/watch?v=7UstS0hsHgI
Remi

0

คุณสามารถเขียนฟังก์ชั่นทั้งหมดเป็นหนึ่งและเรียกพวกเขาห้องสมุดเช่นRamdajsมีฟังก์ชั่นในการเขียนหลายฟังก์ชั่นเป็นหนึ่ง

<a href="#" onclick="R.compose(fn1,fn2,fn3)()">Click me To fire some functions</a>

หรือคุณสามารถวางองค์ประกอบเป็นฟังก์ชันแยกในไฟล์ js และเรียกมันว่า

const newFunction = R.compose(fn1,fn2,fn3);


<a href="#" onclick="newFunction()">Click me To fire some functions</a>

0

นี่เป็นทางเลือกของbrad anser - คุณสามารถใช้เครื่องหมายจุลภาคดังนี้

onclick="funA(), funB(), ..."

แต่จะดีกว่าถ้าไม่ใช้วิธีนี้ - สำหรับโครงการขนาดเล็กคุณสามารถใช้ onclick เฉพาะในกรณีที่มีการเรียกใช้ฟังก์ชั่นเดียว (เพิ่มเติม: ปรับปรุงจาวาสคริปต์ที่ไม่สร้างความรำคาญ )

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