OnClick与OnClientClick的asp:CheckBox吗?


83

有谁知道为什么asp:CheckBox的客户端javascript处理程序需要像asp:Button那样是OnClick =“”属性而不是OnClientClick =“”属性?

例如,这有效:

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

并且没有(没有错误):

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

但这有效:

<asp:Button runat="server" OnClientClick="alert('Hi');" />

这不会(编译时错误):

<asp:Button runat="server" OnClick="alert('hi');" />

(我知道Button.OnClick的用途;我想知道为什么CheckBox不能以相同的方式工作...)

Answers:


106

那太奇怪了。我检查了CheckBox文档页面,该页面显示

<asp:CheckBox id="CheckBox1" 
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>

如您所见,没有定义OnClick或OnClientClick属性。

请记住这一点,我认为这是正在发生的事情。

当您这样做时

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

ASP.NET不会修改OnClick属性,而是将其呈现在浏览器上。它将呈现为:

  <input type="checkbox" OnClick="alert(this.checked);" />

显然,浏览器可以理解“ OnClick”并发出警报。

在这种情况下

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

同样,ASP.NET不会更改OnClientClick属性,而是将其呈现为

<input type="checkbox" OnClientClick="alert(this.checked);" />

由于浏览器无法理解OnClientClick,因此不会发生任何事情。它也不会引发任何错误,因为它只是另一个属性。

您可以通过查看呈现的HTML在上面进行确认。

是的,这一点都不直观。


好决定。我只是检查了生成的html,实际上是将它无法理解的属性放入复选框输入的范围内,但是否则您是对的……
Stobor

那是另一回事,我不喜欢asp:checkbox不必要地呈现附加跨度的事实。
SolutionYogi

1
好吧,其中一些。它将onclick放入输入本身,但将onClientClick放入跨度。奇怪的!
Stobor

哇。自从我使用Web控件以来已经有一段时间了,所以我的记忆正在逐渐消失。我更喜欢使用HTML控件,因为我想控制渲染的HTML的外观。
SolutionYogi

2
该文档实际上来自.Net 1.1。据我所知,ASP .Net尚没有CheckBox的OnClick服务器端事件,因此,当您编写OnClick或OnClientClick时,由于它不知道,它会准确地呈现您编写的内容,这是它的默认行为(如果我没记错的话)
Sergio Rosas

9

因为它们是两种不同的控件...

您会看到,您的Web浏览器不了解服务器端编程。它只知道它自己的DOM及其使用的事件模型...以及渲染给它的对象的单击事件。您应该检查最终从ASP.Net发送到浏览器的最终标记,以了解自己的不同之处。

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

呈现给

<input type="check" OnClick="alert(this.checked);" />

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

呈现给

<input type="check" OnClientClick="alert(this.checked);" />

现在,据我所知,在任何地方都没有浏览器在其DOM中支持“ OnClientClick”事件。

如有疑问,请始终在将输出发送到浏览器时查看其输出源……您可以看到很多调试信息。




1

我正在清理警告和消息,并看到VS确实对此进行了警告:验证(ASP.Net):属性'OnClick'不是元素'CheckBox'的有效属性。使用html输入控件来指定客户端处理程序,然后您将不会获得多余的span标签和这两个元素。


有趣的是...那是我接手了一段时间的项目,并且警告太多,看不到其中有用的信息...如果我没记错的话,使用HTML控件的不利之处在于你不能做服务器侧操纵...
Stobor

1

Asp.net CheckBox不支持方法OnClientClick。
如果要向asp:CheckBox添加一些javascript事件,则必须在服务器代码中的“ Pre_Render”或“ Page_Load”事件上添加相关属性:

C#:

    private void Page_Load(object sender, EventArgs e)
    {
        SomeCheckBoxId.Attributes["onclick"] = "MyJavaScriptMethod(this);";
    }

注意:确保没有在页眉中设置AutoEventWireup =“ false”。

VB:

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SomeCheckBoxId.Attributes("onclick") = "MyJavaScriptMethod(this);"
    End Sub

0

您可以像这样进行标记:

<asp:CheckBox runat="server" ID="ckRouteNow" Text="Send Now" OnClick="checkchanged(this)" />

调用的JavaScript中的.checked属性将是正确的...复选框的当前状态:

  function checkchanged(obj) {
      alert(obj.checked)
  }

-2

一种解决方案是使用JQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);

Seconf函数}丢失
Mahdi jokar,2016年
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.