jQuery / JavaScript - event.target.id в Firefox - PullRequest
6 голосов
/ 27 марта 2012

У меня написан короткий скрипт, который отлично работает на 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?

Кроме того, чтобы ответить на вопрос в комментариях, искомое событие - это событие onchange, которое вызвало updateSentence().Это следует вызывать при изменении текстового поля.

(я все еще новичок в jQuery и JavaScript в целом, и я уверен, что яЯ просто делаю простую ошибку.)

Я нашел свой ответ.Я напишу через пару часов, когда сайт позволит мне.

Ответы [ 2 ]

2 голосов
/ 06 июня 2013

Да, очень хорошо. Если вы переосмыслите, как вы это сделали, это имеет больше смысла. Отделите свою привязку от своей функции, и это - полдела с тем, что вы делаете.

$(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.

1 голос
/ 29 марта 2012

Приняв во внимание то, что было упомянуто в приведенных выше комментариях, и прочитав то, что я делал, я нашел ответ на свой вопрос. Во-первых, я неправильно использовал вызов $(document).ready каждый раз, когда вызывалась функция. Далее мое понимание того, как идентификатор был передан функции, кажется неправильным. Похоже, что оно не передается автоматически, а должно быть сделано вручную. Следовательно, мое первоначальное замешательство относительно того, почему другие комментаторы были смущены моим вопросом. В любом случае, зная эти вещи, я нашел свой ответ в комбинации двух других ответов на вопросы. Их можно найти в двух вопросах о переполнении стека:

Я уверен, что я все еще говорю что-то еще неправильно в этом объяснении, но я узнаю более скоро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...