有没有一种方法可以在不将事件处理程序添加到标记或使用addEvent的情况下用JavaScript编写事件处理程序?

有没有一种方法可以在不将事件处理程序添加到标记或使用addEvent的情况下用JavaScript编写事件处理程序?,javascript,javascript-events,Javascript,Javascript Events,有没有一种方法可以只通过JavaScript中的ID向元素添加事件侦听器,而不使用addEventListener或click=eventHandler?我模模糊糊地记得一种使用元素id的方法 例如,有两种方法可以为我不感兴趣的按钮添加事件侦听器: <input id="myButton" type="button" onclick="doSomething()" /> 目前我对上述两种方法不感兴趣。我要找的是: function myButton_clickHandler(eve

有没有一种方法可以只通过JavaScript中的ID向元素添加事件侦听器,而不使用addEventListener或click=eventHandler?我模模糊糊地记得一种使用元素id的方法

例如,有两种方法可以为我不感兴趣的按钮添加事件侦听器:

<input id="myButton" type="button" onclick="doSomething()" />
目前我对上述两种方法不感兴趣。我要找的是:

function myButton_clickHandler(event) {
   alert("hello world");
}
在上面的代码中,浏览器知道事件是针对myButton的

我想弄明白这一点的原因是为了研究。我记得在IE中做过类似的事情

更新

我做了更多的研究,发现它可能是微软独有的一种功能集,在他们的整个文档中都以隐式事件处理程序、基于签名的处理程序和AutoEventWireup的名称引用。这些示例适用于ASP.NET

第一个例子:

为页面事件创建处理程序的步骤

在代码编辑器中,创建一个名为Page_event的方法

例如,要为页面的Load事件创建处理程序,请创建一个名为page_Load的方法

注: 页面事件处理程序不需要像其他控件事件处理程序那样接受参数

ASP.NET页面会自动将页面事件绑定到名为page_event的方法。此自动绑定由@Page指令中的AutoEventWireup属性配置,默认设置为true。如果将AutoEventWireup设置为false,则页面不会自动搜索使用page_事件命名约定的方法

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then
        Response.Write("<br>Page has been posted back.")
    End If 
End Sub

来源:

为了回应您的评论,我编写了以下代码。对于存在下划线的每个函数,该函数将查找其ID与下划线之前的函数名部分匹配的DOM元素,并将该函数作为onclick处理程序提供给它


其中myButton是按钮的ID。这只有在ID唯一的情况下才能正常工作。

针对您的评论,我编写了以下代码。对于存在下划线的每个函数,该函数将查找其ID与下划线之前的函数名部分匹配的DOM元素,并将该函数作为onclick处理程序提供给它


其中myButton是按钮的ID。只有当ID是唯一的时,这才能正常工作。

要扩展Elliot的代码,这里有一个建议:

(function() {
    var prop, match, elem;
    for(prop in window) {
        if( typeof window[prop] !== "function") continue;
        if( match = prop.match(/^(.*)_([a-z]*)Handler$/)) {
            if( e = document.getElementById(match[1])) {
                if( "on"+match[2] in e) {
                    e["on"+match[2]] = window[prop];
                }
            }
        }
    }
})();

有了这段代码,您可以像Elliot的回答中那样使用myButton\u clickHandler函数,但您也可以附加其他事件,例如用于onfocus的myButton\u focusHandler或某些Input\u changeHandler。更重要的是,它不会干扰您可能拥有的任何碰巧带有下划线的函数。它将只查找名称包含下划线且名称末尾有处理程序的函数。。。即使如此,也只有在支持事件类型的情况下。

要扩展Elliot的代码,这里有一个建议:

(function() {
    var prop, match, elem;
    for(prop in window) {
        if( typeof window[prop] !== "function") continue;
        if( match = prop.match(/^(.*)_([a-z]*)Handler$/)) {
            if( e = document.getElementById(match[1])) {
                if( "on"+match[2] in e) {
                    e["on"+match[2]] = window[prop];
                }
            }
        }
    }
})();

有了这段代码,您可以像Elliot的回答中那样使用myButton\u clickHandler函数,但您也可以附加其他事件,例如用于onfocus的myButton\u focusHandler或某些Input\u changeHandler。更重要的是,它不会干扰您可能拥有的任何碰巧带有下划线的函数。它将只查找名称包含下划线且名称末尾有处理程序的函数。。。即使这样,也只有在支持事件类型的情况下才可以使用。

我从未听说过IE有这种情况,在IE中,函数名本身就允许这样做,尽管您可以将函数分配给将被调用的属性。不管怎样,这只是对现有方法的研究还是一个研究网站可能是前者,但只是检查一下?我同意@Qantas94Heavy-我从来没有听说过这样的事情。确定你没有想到AS3?很确定这不存在。也许是附件?或者只是myButton.onclick=functionevent{…}?我不确定。但我记得我觉得很奇怪,我不必添加事件侦听器。我没有想到AS3。回到Internet Explorer 4天时。@DoorknobofSnow-我用正确的方法名更新了代码示例。我从来没有听说过IE的这种情况,在IE中,函数名本身就允许这样做,尽管您可以将函数分配给将被调用的属性。不管怎样,这只是对现有方法的研究还是一个研究网站可能是前者,但只是检查一下?我同意@Qantas94Heavy-我从来没有听说过这样的事情。确定你没有想到AS3?很确定这不存在。也许是附件?或者只是myButton.onclick=functionevent{…}?我不确定。但我记得我觉得很奇怪,我不必添加事件侦听器。我没有想到AS3。它是在Internet Explorer中运行了4天。@DoorknobofSnow-我用正确的方法名更新了代码示例。这可能会有所改进。。。你介意我发封邮件吗
发誓要在这件事上做得更进一步?不特别。我想看看你能想出什么办法。我也还没把它精炼好,伙计们。如果没有我认为可能存在的浏览器支持,这些将可以实现我想要的。这可能会得到改进。。。你介意我发布一个关于这个问题的答案吗?不太介意。我想看看你能想出什么办法。我也还没把它精炼好,伙计们。如果没有我认为可能存在的浏览器支持,这些功能将实现我想要的功能。
(function() {
    var e, prop;
    for(prop in window) {
        if(prop.indexOf("_") < 0 || typeof window[prop] !== "function") continue;
        e = document.getElementById(prop.split("_")[0]);
        if(typeof e !== "undefined") {
            e.onclick = window[prop];
        }
    }
})();
function myButton_clickHandler(event) {
    alert("hello world");
}
(function() {
    var prop, match, elem;
    for(prop in window) {
        if( typeof window[prop] !== "function") continue;
        if( match = prop.match(/^(.*)_([a-z]*)Handler$/)) {
            if( e = document.getElementById(match[1])) {
                if( "on"+match[2] in e) {
                    e["on"+match[2]] = window[prop];
                }
            }
        }
    }
})();