使用HTML按钮调用JavaScript函数


229

我正在尝试使用HTML按钮来调用JavaScript函数。

这是代码:

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

虽然它似乎无法正常工作。有一个更好的方法吗?

这是链接:http : //projectpath.ideapeoplesite.com/bendel/toolscalculators.html单击左下部分的容量选项卡。如果值未更改,该按钮应生成警报,如果输入值,则应生成图表。


6
请定义“似乎无法正常工作”。单击时遇到什么错误?
某人

该按钮在IE8中有效,但由于JavaScript错误而无法在FF 3.5中使用(请参阅Jeff的回答)
Chris Shouts 2009年

1
是的,原来是document.all是非标准的IE;用建议的替代方法更新了我的答案。
Jeff

@ paper1337,@ Jeff:该功能在IE8中仍然无法达到预期的效果,因此即使将document.all换为document.getElementById也无法解决该问题。
安迪E

Answers:


356

有几种使用HTML / DOM处理事件的方法。没有真正的对或错方法,但是在不同情况下使用不同的方法很有用。

1:在HTML中进行定义:

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

2:将其添加到Java事件中的DOM属性中:

//- 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规范中。

第一种和第二种方法是互斥的,这意味着使用一种(第二种)将覆盖另一种(第一种)。第三种方法将允许您将任意数量的函数附加到同一事件处理程序,即使也已使用第一种或第二种方法。

问题很可能出在您的CapacityChart()功能中。访问链接并运行脚本后,CapacityChart()函数将运行并打开两个弹出窗口(根据脚本关闭一个弹出窗口)。您所在的行如下:

CapacityWindow.document.write(s);

请尝试以下操作:

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

编辑
当我看到您的代码时,我以为您是专门为IE编写的。正如其他人所说,你将需要更换引用document.alldocument.getElementById。但是,在此之后,您仍将具有修复脚本的任务,因此,我建议首先使其至少在IE中运行,因为您将代码更改为跨浏览器工作时所犯的任何错误都可能引起更多混乱。在IE中运行后,在更新代码时,将更容易判断它是否在其他浏览器中运行。


6
使用jquery,还可以: $("#clickMe").bind('click', function () { alert('hello!'); };)
2014年

32

我会说最好以一种不引人注目的方式添加javascript ...

如果使用jQuery,则可以执行以下操作:

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

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

4
同意 在许多情况下,jQuery和其他框架对于少量的javascript来说是过大的杀伤力,并且并非所有javascript代码都需要跨浏览器。
Andy E的

2
相当公平..我试图提出的观点是“一种更好的方法”毫不引人注目...如果没有jQuery,类似:var btn = document.getElementById('MyButton'); btn.onclick = function(){CapacityChart();}
Paul

1
这些使用jQuery的人似乎已开始将其用于所有Web。使用扁平JavaScript怎么样?天哪,jQuery现在真的让我感到不安。大声笑!我称其为懒惰的人创建网络的方式,因为我想这就是真正的全部。
DoctorLouie

@DrLouie:我对jQuery一点都不感兴趣,它是解决许多问题的好方法,但是当OP没有对其进行标记或询问时,任何提及jQuery的方法也应使用非jQuery方法来辅助,否则会冒风险a)混淆询问者-他可能不知道jQuery是什么,或者b)告诉他对几行javascript代码使用jQuery来使询问者烦恼。@Paul-我必须说这不是一本好书...
Andy E

1
抱歉...发布了错误的链接-旨在发布一个stackoverflow链接。stackoverflow.com/questions/1588374/…–
保罗

8

您的HTML和从按钮调用函数的方式看起来正确。

问题似乎出在 CapacityCount函数中。我在Firefox 3.5的控制台中收到此错误:bendelcorp.js的第759行上的“ document.all未定义”。

编辑:

看起来document.all是仅IE的事物,并且是访问DOM的非标准方式。如果使用document.getElementById(),它应该可以工作。示例:document.getElementById("RUnits").value代替document.all.Capacity.RUnits.value


这不是该函数的特别问题,该函数不会在IE中引发任何错误
Andy E 2009年

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不会使用Netscape。Chrome是否支持document.all吗?也许吧,但也许再也没有。那其他浏览器呢?

上的代码版本 Netscape从1996年回到Netscape Navigator 2,分支应该可以在任何浏览器上运行,因此您可能应该坚持使用...,除非它不起作用(或不能保证可以工作) ),因为您尚未nameinput元素上指定属性,因此不会将它们elements作为命名元素添加到表单的数组中:

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

给他们起个名字并使用elements数组,或者(更好)使用

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

在所有现代浏览器上都可以使用-无需分支。为了安全起见,请使用getElementById支持检查功能替换大于或等于4的浏览器版本的嗅探:

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;
}

有助于。


嗨,尼克菲茨,我面临的挑战之一是该脚本最初是1993年编写的,因此是对Netscape 4的引用。在对其进行更新之前,我获得了一些帮助,直到将其插入到其指定页面中为止,它一直起作用。
forrest

我怀疑它是在1993年编写的,因为Brendan Eich直到1995年才发明JS。en.wikipedia.org/wiki/Javascript#History ;-)我强烈建议您使用document.getElementById并剥离其他内容。
NickFitz

我认为至少要先在IE中运行它,然后再处理浏览器兼容性,这才是明智的选择,否则他将不知道自己的浏览器兼容性问题是否会得到解决,因为它仍然无法正常工作。
Andy E

最好使用标准的DOM技术使其正常工作,然后再说到没有浏览器兼容性问题:-)
NickFitz

2

您的代码在此行失败:

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

我试图通过萤火虫一步一步,但在那里失败。应该可以帮助您找出问题所在。

你引用了jQuery。您最好在所有这些功能中使用它。它将大大清理您的代码。


不过,在IE浏览器上它并没有失败。
Andy E

因为document.all是IE的东西。他应该只使用$('#RUints')。val()jquery注释b / c他已经包含了jquery。这样可以解决所有浏览器差异,并清理代码。
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();"

您应该阅读有关离散javascript的知识,并使用框架bind方法将回调绑定到dom事件。


@erenon:哦,拜托。这不是他的问题,表示法非常好,没有理由仅为了分配一个onclick事件而进入复杂的绑定和框架。
Pekka

感谢您参加我的防守Pekka。我只希望一个简单的按钮即可正常运行。
forrest

3
事件中javascript:不需要该协议onclick。onclick事件已经是javascript。该javascript:协议用于在链接的href属性中执行javascript。
Web_Designer 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.