【问题标题】:jQuery/JavaScript - event.target.id on FirefoxjQuery/JavaScript - Firefox 上的 event.target.id
【发布时间】:2013-06-26 02:16:18
【问题描述】:

我编写了一个简短的脚本,在 Chrome 上运行良好:

function updateSentence(){
    $(document).ready(function() {
        t = event.target.id;
        $("#S"+t).html($("#"+t).val());
    });
}

但是,在 Firefox 事件中没有定义。我发现了一些类似的问题,这些问题表明需要将事件作为参数传递给函数:

function updateSentence(event){
    $(document).ready(function(event) {
        t = event.target.id;
        $("#S"+t).html($("#"+t).val());
    });
}

然而,对我来说,这个解决方案并不能解决 Firefox 的问题,它实际上破坏了它在 Chrome 中的工作方式。在 Chrome 中,最终会说 event.target 在传递这些参数时未定义。

我做错了什么?

在收到几个 cmets 后,我意识到我对 jQuery 的总体看法是错误的。我不想在每次更新句子时都调用$(document).ready。用这些知识清理函数我最终得到了:

function updateSentence(){
    t = event.target.id;
    $("#S"+t).html($("#"+t).val());
}

这仍然可以正确更新 Chrome 中的句子,但 target 在 Firefox 中仍然未定义。我需要做什么才能让它在 Firefox 中工作?我还在 jQuery 中做一些根本错误的事情吗?

另外,要回答 cmets 中的问题,我要查找的事件是触发 updateSentence()onchange 事件。这应该在选择/文本字段更改时调用。

(总的来说,我对jQueryJavaScript 还是新手,我确信我只是犯了一个简单的错误。)


我找到了答案。当网站允许时,我会在几个小时后发布。

【问题讨论】:

  • 您期望的目标是什么? $(document).ready 将 jQuery 本身作为参数发送 - 没有目标元素。
  • 我不认为在另一个函数中运行 (document).ready 是一个好主意。它应该在“就绪”页面上运行一次。如果在该事件之后调用,它将不会按照您的意愿行事。
  • 您使用 'however in Firefox' 表明,在其他浏览器中,您从某个地方获得了结果。你真的不应该。不是那个脚本。
  • 啊,看来我的问题是我对 JQuery 基础知识的理解。我会先看看我的功能是如何设置的。谢谢!
  • @golmschenk - 您能否根据何时以及为何调用它来发布更多代码/html?在您的更新中,您有 event,但没有定义它。这是从哪里来的? updateSentence 是如何被调用的?

标签: javascript jquery events firefox google-chrome


【解决方案1】:

是的,非常好。如果您重新考虑如何做到这一点,那就更有意义了。 将您的绑定与您的功能分开,这就是您正在做的事情的一半。

$(function() { // Equivalent of Document Ready; You only need this once; 
  // BINDINGS HERE
  $('someSelector').on('change keypress', function(event) {
    updateSentence(this);
  });
});

function updateSentence(elem) {
  $('#S' + elem.id).html( elem.value ) ; 
}

此外,这是我建议不要使用辅助功能的情况之一。在某些情况下,您想要做的事情很简单,以至于很难证明有一个函数可以调用,而不是您在绑定上所做的事情。

$(function() { 
  $('someSelector').on('change keypress', function(event) {
    $('#S' + this.id).html( this.value ) ; 
  });
});

您会注意到在这两种情况下都不需要event。但是,即使对于 FF,它也是可用的,因为它将作为 n 参数 (function(event)) 传入。

在 FF 的代码中未定义“目标”的原因是 FF 不会像大多数浏览器一样从空中抓取event。因此,如果您无法设置代码以消除对event 的需求,或者像我的示例中那样将其传递,您可以通过window.event 引用它。

【讨论】:

    【解决方案2】:

    在考虑了上述 cmets 中提到的内容并进一步阅读了我正在做的事情之后,我找到了问题的答案。首先,每次调用该函数时,我都错误地使用了$(document).ready 调用。接下来,我对如何将 ID 传递给函数的理解似乎不正确。似乎它不是自动通过的,而是必须手动完成。因此,我最初对为什么其他评论者对我的问题感到困惑感到困惑。无论如何,知道这些事情后,我结合其他两个已回答的问题找到了答案。它们可以在以下两个 Stack Overflow 问题中找到:

    我确定我在这个解释中仍然说错了,但我很快就会了解更多。

    【讨论】:

    • 不,您似乎并没有真正看到事件是如何传播的。事件冒泡,具有属性,其中之一就是目标。目标可能有一个 id(它可能无法设置/寻址)。但目标是从哪里发出事件。因此,target.id 是您可以找到元素 id 的地方。但是您的问题并没有正确地解决事件(请参阅我的回答:a:您可以忽略引用事件的需要或 b:如果您真的想通过事件通过目标获取 id,则传递事件通过所以FF直接看到它或通过window.event访问事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2011-06-25
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多