【问题标题】:JavaScript; How to add arguments to events?JavaScript;如何为事件添加参数?
【发布时间】:2014-09-05 09:38:33
【问题描述】:

我有一个使用纯 JavaScript(无 JQuery)的网站,我想在文本框中捕获事件。 文本框在一个表格中,页面上可能有多个表格(具有自己的 ID)。 文本框由 Javascript 动态创建,并在 HTML 表格传送到浏览器后添加到表格中。

我正在尝试捕获 onkeyup 事件,并且知道包含触发该事件的文本框的表。

附加到 onkeyup 事件的函数被调用一个参数,即事件本身,它提供有关刚刚按下的键的信息。太好了,我能搞定,而且我知道关键,一切都好。

textbox.onkeyup = my.namespace.textboxAge;

my.namespace.textboxAge = function (event) { 
    console.log("I got the event:" + event.ToString()); };

我需要做的是在函数调用中附加附加信息,以便我获得原始事件以及表或表 ID。

当我将处理程序附加到 onkeyup 事件时,我考虑过一个闭包以捕获表引用,类似于...

var table = document.getElementByID("table5");
textbox.onkeyup = function (event,table) { 
    console.log("I got event:" + event.ToString() + " on table " + table.id); }

但这不起作用,附加闭包函数时未设置事件,因此在 onkeyup 触发时它仍然为空。

我现在已经解决了这个问题,但我对如何向事件添加信息感到困惑,并且想知道是否可能以及如何做到这一点。

【问题讨论】:

    标签: javascript events arguments onkeyup


    【解决方案1】:

    从您的事件函数中删除参数。在您的代码中,table 变量在事件函数调用中被覆盖。如果从参数列表中省略它,则具有原始值:

    var table = document.getElementByID("table5");
    textbox.onkeyup = function (event) { 
        console.log("I got event:" + event.ToString() + " on table " + table.id); }
    

    【讨论】:

    • 是的,但我想要表变量,这就是重点。我如何获得活动以及桌子?感谢您的尝试。
    • 得到表变量,这就是闭包的全部意义所在。我输入的不是你想要的代码到底是什么?
    • 啊,也许我理解错了。当您说“关闭的表变量被覆盖”时,我假设我不会收到表变量。我得试试看。感谢您的帮助。
    • 是的,很抱歉模棱两可。我的意思是,在 your 中,原始代码 table 被覆盖 - 在我的代码中,它不是。
    • 哦,我明白了,我道歉。周末会看看这个并回复你,非常感谢。
    【解决方案2】:

    除了关于按下哪个键的信息外,原始事件将包含一个指向触发事件的 DOM 元素的指针。 .srcElement,或各种浏览器中的任何内容。这将是对触发事件的文本框的引用。您不能通过循环到 .parentNode 来跟踪该元素的 DOM 树,然后查看您点击了哪些表吗?

    编辑:

    好的,话虽如此,查看上面的代码,您可以向处理程序本身添加额外的信息。这是一种方法,也许是最“正确”的:

     textbox.onkeyup = function (extra1, extra2) {
       alert(extra1);
       alert(extra2);
       alert(event);
     }.bind(null, 'foo','bar');
    

    这是一个小提琴:http://jsfiddle.net/it_turns_out/u0cnzpwd/2/

    【讨论】:

    • 好点。我已通过解决此问题并使用表引用覆盖事件来解决此问题。不过,我并不是真的在寻找解决方法,我正在寻找一种方法来发送任意附加数据以及未来的事件,但这可能是不可能的。感谢您的回复,这是完全有效的,如果没有任何具体的回复,它是一个很好的候选答案。
    • 好的,现在编辑,我认为你正在寻找的内容
    • 这看起来很有趣,我之前没有使用过bind。我会设置它并尝试一下,然后再回复它。我最迟会在周末尝试这样做,非常感谢,非常感谢。
    • 很有意思,以后会用这个方法。在这种方法中,我可以在某处定义一个函数,然后稍后使用绑定执行闭包部分。这使得代码更简洁,这正是我所寻找的。它的小提琴就在这里...jsfiddle.net/hiblet/0nehxqum
    • 不得不给出另一个答复作为答案,因为它指出了我所做的只是覆盖了一个变量。该网站不允许两个有效答案共享积分,这似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多