ใช้ปุ่ม HTML เพื่อเรียกใช้ฟังก์ชัน JavaScript


229

ฉันพยายามใช้ปุ่ม HTML เพื่อเรียกใช้ฟังก์ชัน JavaScript

นี่คือรหัส:

<input type="button" value="Capacity Chart" onclick="CapacityChart();">

ดูเหมือนว่าจะทำงานไม่ถูกต้อง มีวิธีที่ดีกว่าในการทำเช่นนี้?

นี่คือลิงค์: http : //projectpath.ideape Citite.com/bendel/toolscalculators.htmlคลิกที่แท็บความจุในส่วนล่างซ้าย ปุ่มควรสร้างการแจ้งเตือนหากค่าไม่เปลี่ยนแปลงและควรสร้างแผนภูมิหากคุณป้อนค่า


6
โปรดกำหนด "ดูเหมือนว่าจะทำงานไม่ถูกต้อง" คุณได้รับข้อผิดพลาดอะไรเมื่อคุณคลิก
ใครบางคนเพียง

ปุ่มการทำงานใน IE8 แต่ไม่ FF 3.5 เนื่องจากข้อผิดพลาด JavaScript (ดูคำตอบของเจฟฟ์)
คริสตะโกน

1
ใช่กลายเป็น document.all เป็นสิ่งที่ไม่เป็นมาตรฐาน IE; อัปเดตคำตอบของฉันด้วยทางเลือกที่แนะนำ
Jeff

@ paper1337, @Jeff: ฟังก์ชั่นยังไม่บรรลุผลตามที่ต้องการใน IE8 ดังนั้นแม้แต่การเปลี่ยน document.all สำหรับ document.getElementById จะไม่แก้ไข
Andy E

คำตอบ:


356

มีสองสามวิธีในการจัดการเหตุการณ์ด้วย HTML / DOM ไม่มีวิธีที่ถูกหรือผิดจริง แต่วิธีต่าง ๆ มีประโยชน์ในสถานการณ์ที่แตกต่าง

1: มีการกำหนดไว้ใน HTML:

<input id="clickMe" type="button" value="clickme" onclick="doFunction();" />

2: มีการเพิ่มลงในคุณสมบัติ DOM สำหรับเหตุการณ์ใน Javascript:

//- Using a function pointer:
document.getElementById("clickMe").onclick = doFunction;

//- Using an anonymous function:
document.getElementById("clickMe").onclick = function () { alert('hello!'); };

3: และมีการแนบฟังก์ชันกับตัวจัดการเหตุการณ์โดยใช้ Javascript:

var el = document.getElementById("clickMe");
if (el.addEventListener)
    el.addEventListener("click", doFunction, false);
else if (el.attachEvent)
    el.attachEvent('onclick', doFunction);

ทั้งวิธีที่สองและที่สามอนุญาตให้มีฟังก์ชั่นอินไลน์ / ไม่ระบุชื่อและทั้งสองจะต้องประกาศหลังจากองค์ประกอบได้รับการแยกวิเคราะห์จากเอกสาร วิธีแรกไม่ถูกต้อง XHTML เนื่องจากแอตทริบิวต์ onclick ไม่ได้อยู่ในข้อกำหนด XHTML

วิธีที่ 1 และ 2 เป็นวิธีที่ไม่เกิดร่วมกันซึ่งหมายความว่าการใช้วิธีหนึ่ง (วิธีที่สอง) จะแทนที่วิธีอื่น ๆ (วิธีที่หนึ่ง) วิธีที่ 3 จะช่วยให้คุณสามารถแนบฟังก์ชั่นได้มากเท่าที่คุณต้องการกับตัวจัดการเหตุการณ์เดียวกันแม้ว่าจะใช้วิธีที่ 1 หรือ 2 ก็ตาม

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

CapacityWindow.document.write(s);

ลองทำสิ่งต่อไปนี้แทน:

CapacityWindow.document.open("text/html");
CapacityWindow.document.write(s);
CapacityWindow.document.close();

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


6
ใช้ jQuery ก็มี: $("#clickMe").bind('click', function () { alert('hello!'); };)
โรมัน

32

ฉันจะบอกว่าจะเป็นการดีกว่าถ้าจะเพิ่มจาวาสคริปต์ในลักษณะที่ไม่ล่วงล้ำ ...

หากใช้ jQuery คุณสามารถทำสิ่งต่อไปนี้:

<script>
  $(document).ready(function(){
    $('#MyButton').click(function(){
       CapacityChart();
    });
  });
</script>

<input type="button" value="Capacity Chart" id="MyButton" >

4
ตกลง ในหลาย ๆ กรณี jQuery และเฟรมเวิร์กอื่น ๆ มีค่าเกินจริงสำหรับจาวาสคริปต์จำนวนเล็กน้อยและไม่ใช่จาวาสคริปต์ที่จำเป็นต้องมีรหัสข้ามเบราว์เซอร์
Andy E

2
ยุติธรรมพอ .. จุดที่ฉันพยายามทำคือ "วิธีที่ดีกว่าในการทำสิ่งนี้" ไม่เป็นการรบกวน ... โดยไม่มี jQuery สิ่งที่ต้องการ: var btn = document.getElementById ('MyButton'); btn.onclick = function () {CapacityChart ();}
Paul

1
คนเหล่านี้ที่ใช้ jQuery นั้นถูกตั้งค่าให้ใช้กับมันสำหรับทุก ๆ เว็บ วิธีการเกี่ยวกับการใช้ JavaScript flat สำหรับหนึ่ง? ดีจัง jQuery เริ่มเข้ามามีส่วนร่วมกับความรู้สึกของฉันแล้ว ฮ่า ๆ! ฉันจะเรียกมันว่าคนขี้เกียจในการสร้างเว็บเพราะฉันคิดว่านั่นคือทั้งหมดที่เป็นจริง
DoctorLouie

@DrLouie: ฉันไม่มีอะไรกับ jQuery มันเป็นทางออกที่ดีสำหรับปัญหามากมาย แต่เมื่อมันไม่ได้ติดแท็กหรือถามโดย OP ใด ๆ ที่กล่าวถึงของ jQuery ควรได้รับการช่วยเหลือโดยวิธีการที่ไม่ใช่ jQuery เช่นกัน ของ a) ทำให้ผู้ถามสับสน - เขาอาจไม่รู้ว่า jQuery คืออะไรหรือข) ทำให้ผู้ถามรำคาญใจโดยบอกให้เขาใช้ jQuery สำหรับรหัส javascript สองสามบรรทัด @ Paul - ฉันต้องบอกว่าไม่ได้อ่านที่ดี ...
แอนดี้ E

1
ขออภัย ... โพสต์ลิงก์ผิด - หมายถึงโพสต์สแต็คโฟลว์หนึ่งรายการ stackoverflow.com/questions/1588374/…
Paul

8

HTML ของคุณและวิธีการที่คุณเรียกใช้ฟังก์ชันจากปุ่มนั้นถูกต้อง

ปัญหาดูเหมือนจะอยู่ในCapacityCountฟังก์ชั่น ฉันได้รับข้อผิดพลาดนี้ในคอนโซลของฉันบน Firefox 3.5: "document.all is undefined" ที่บรรทัด 759 ของ bendelcorp.js

แก้ไข:

ดูเหมือนว่าdocument.allเป็นสิ่งเดียวที่ IE และเป็นวิธีที่ไม่เป็นมาตรฐานในการเข้าถึง DOM ถ้าคุณใช้document.getElementById()มันก็น่าจะใช้ได้ ตัวอย่าง: document.getElementById("RUnits").valueแทนdocument.all.Capacity.RUnits.value


นั่นไม่ใช่ปัญหาที่เกิดขึ้นกับฟังก์ชั่นโดยเฉพาะซึ่งไม่ทำให้เกิดข้อผิดพลาดใน IE
Andy E

4

สิ่งนี้ดูถูกต้อง ฉันเดาว่าคุณนิยามฟังก์ชันของคุณด้วยชื่ออื่นหรือในบริบทที่ปุ่มไม่ปรากฏ กรุณาเพิ่มรหัส


3

คุณรู้ได้อย่างไรเครื่องหมายอัฒภาค ( ; ) ไม่ควรอยู่ในปุ่มเมื่อคุณเรียกใช้ฟังก์ชัน

ดังนั้นควรมีลักษณะเช่นนี้: onclick="CapacityChart()"

แล้วมันก็ควรจะทำงาน :)


2

ปัญหาสำคัญอย่างหนึ่งที่คุณมีคือการใช้เบราว์เซอร์ในการดมกลิ่นโดยไม่มีเหตุผล:

if(navigator.appName == 'Netscape')
    {
      vesdiameter  = document.forms['Volume'].elements['VesDiameter'].value;
      // more stuff snipped
    }
    else
    {
      vesdiameter  = eval(document.all.Volume.VesDiameter.value);
      // more stuff snipped
    }

ฉันบน Chrome เพื่อจะไม่เป็นnavigator.appName NetscapeChrome รองรับdocument.allหรือไม่ อาจจะ แต่ แต่อาจจะไม่ได้อีกครั้ง แล้วเบราว์เซอร์อื่น ๆ ล่ะ?

รุ่นของรหัสในNetscapeสาขาควรทำงานกับเบราว์เซอร์ใด ๆ ได้ตั้งแต่ทางกลับไปที่ Netscape Navigator 2 ตั้งแต่ปี 1996 ดังนั้นคุณน่าจะติดกับที่ ... ยกเว้นว่ามันจะไม่ทำงาน (หรือไม่รับประกันว่าจะทำงาน ) เนื่องจากคุณไม่ได้ระบุnameแอตทริบิวต์ในinputองค์ประกอบดังนั้นจะไม่ถูกเพิ่มลงในelementsอาร์เรย์ของฟอร์มเป็นองค์ประกอบที่มีชื่อ:

<input type="text" id="VesDiameter" value="0" size="10" onKeyUp="CalcVolume();">

ให้ชื่อและใช้elementsอาร์เรย์หรือใช้ (ดีกว่า)

var vesdiameter = document.getElementById("VesDiameter").value;

ซึ่งจะทำงานกับเบราว์เซอร์สมัยใหม่ทั้งหมด - ไม่จำเป็นต้องแยกสาขา เพียงเพื่อให้อยู่ในด้านที่ปลอดภัยแทนที่การดมกลิ่นสำหรับรุ่นเบราว์เซอร์ที่มากกว่าหรือเท่ากับ 4 ด้วยการตรวจสอบการgetElementByIdสนับสนุน:

if (document.getElementById) { // NB: no brackets; we're testing for existence of the method, not executing it
    // do stuff...
}

คุณอาจต้องการตรวจสอบข้อมูลที่คุณป้อนเช่นกัน สิ่งที่ต้องการ

var vesdiameter = parseFloat(document.getElementById("VesDiameter").value);
if (isNaN(vesdiameter)) {
    alert("Diameter should be numeric");
    return;
}

จะช่วย


สวัสดี NickFitz หนึ่งในความท้าทายของฉันที่นี่คือสคริปต์นี้ถูกเขียนขึ้นครั้งแรกในปี 1993 - ดังนั้นการอ้างอิงถึง Netscape 4 ฉันได้รับความช่วยเหลือในการอัปเดตและทำงานได้จนกว่าฉันจะใส่ไว้ในหน้ากำหนด
Forrest

ฉันสงสัยว่ามันถูกเขียนในปี 1993 เนื่องจาก Brendan Eich ไม่ได้ประดิษฐ์ JS จนกระทั่ง 1995 en.wikipedia.org/wiki/Javascript#History ;-) ฉันขอแนะนำให้ใช้document.getElementByIdและแยกแยะสิ่งอื่น ๆ
NickFitz

ฉันคิดว่าอย่างน้อยก็ควรระมัดระวังที่จะทำให้มันทำงานใน IE ก่อนแล้วจึงทำงานกับเบราว์เซอร์ที่เข้ากันได้มิฉะนั้นเขาจะไม่รู้ว่าปัญหาความเข้ากันได้ของเบราว์เซอร์ของเขาจะได้รับการแก้ไขหรือไม่
Andy E

ดีกว่าที่จะได้รับมันทำงานโดยใช้เทคนิค DOM มาตรฐานแล้วจะไม่มีปัญหาความเข้ากันเบราว์เซอร์ใด ๆ ที่จะพูดถึง :-)
NickFitz

2

รหัสของคุณล้มเหลวในบรรทัดนี้:

var RUnits = Math.abs(document.all.Capacity.RUnits.value);

ฉันพยายามเหยียบถึงมันด้วย firebug และมันก็ล้มเหลว ที่จะช่วยให้คุณเข้าใจปัญหาได้

คุณมีการอ้างอิง jquery คุณอาจใช้มันในฟังก์ชั่นเหล่านี้ทั้งหมด มันจะทำความสะอาดรหัสของคุณอย่างมีนัยสำคัญ


แม้ว่าจะไม่ได้ล้มเหลวใน IE บนบรรทัดนั้น
Andy E

เพราะ document.all เป็นสิ่งที่ IE เขาควรใช้ $ ('# RUints'). val () สัญลักษณ์ jquery b / c เขารวม jquery แล้ว สิ่งนี้จะดูแลความแตกต่างของ Browswer และทำความสะอาดโค้ด
Patricia

2

ฉันมีรหัสปุ่มฟังก์ชั่นสนับสนุนการโทรอัจฉริยะ:

<br>
<p id="demo"></p><h2>Intelligent Button:</h2><i>Note: Try pressing a key after clicking.</i><br>
<button id="button" shiftKey="getElementById('button').innerHTML=('You're pressing shift, aren't you?')" onscroll="getElementById('button').innerHTML=('Don't Leave me!')" onkeydown="getElementById('button').innerHTML=('Why are you pressing keys?')" onmouseout="getElementById('button').innerHTML=('Whatever, it is gone.. maybe')" onmouseover="getElementById('button').innerHTML=('Something Is Hovering Over Me.. again')" onclick="getElementById('button').innerHTML=('I was clicked, I think')">Ahhhh</button>

1

คำตอบง่าย ๆ :

   onclick="functionName(ID.value);

โดยที่ ID คือ ID ของฟิลด์อินพุต


-2

ทางโง่:

onclick="javascript:CapacityChart();"

คุณควรอ่านเกี่ยวกับจาวาสคริปต์ที่ไม่ต่อเนื่องและใช้วิธีการเชื่อมโยงเฟรมเวิร์กในการผูกโทรกลับไปยังเหตุการณ์ Dom


@erenon: โอ้มาเลย นี่ไม่ใช่ปัญหาของเขาสัญกรณ์นั้นสมบูรณ์แบบและไม่มีเหตุผลที่จะเข้าสู่การเชื่อมโยงและโครงร่างที่ซับซ้อนเพียงเพื่อกำหนดเหตุการณ์ onclick หนึ่งเหตุการณ์เท่านั้น
Pekka

ขอบคุณที่มาป้องกันตัว Pekka ของฉัน ฉันแค่ต้องการให้ปุ่มง่าย ๆ ทำงานได้อย่างถูกต้อง
Forrest

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