jQuery/JavaScript - event.target.id on Firefox



我写了一个简短的脚本,它在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没有定义。

我做错了什么?

在收到一些评论后,我意识到我对jQuery的总体看法是错误的。我不希望每次更新句子时都调用$(document).ready。用这些知识清理功能,我最终得到了:

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

这仍然正确地更新了Chrome中的句子,但target在Firefox中仍然没有定义。我需要做些什么才能让它在Firefox中运行?我还在jQuery中做一些根本错误的事情吗?

此外,为了回答评论中的问题,我要查找的事件是触发updateSentence()onchange事件。当选择/文本字段发生更改时,应调用此命令。

(我对jQuery和JavaScript还是个新手,我确信我只是犯了一个简单的错误。)


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

是的,非常好。如果你重新思考你是如何做到这一点的,那就更有意义了。把你的束缚和你的功能分开,这是你正在做的事情的一半。

$(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引用它。

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

  • 获取触发事件的元素的ID

  • JavaScript-点击获取点击按钮的ID

我确信我在这个解释中仍然说了一些错误的地方,但我很快就会了解更多。

最新更新