Nano Hash - криптовалюты, майнинг, программирование

События Live jQuery не запускаются для динамического элемента

Почему ни одно из действующих (или мертвых) событий, которые я привязываю к динамическому элементу, не срабатывает?

(function ($) {
    $.fn.myPlugin = function () {

    var $filterBox = $("<input type='text'>").live("click", function () {
        alert("Clicked");
    });
    this.before($filterBox); // insert into DOM before current element
    return this; // keep chain
    };
})(jQuery);

Я вызываю myPlugin для нескольких элементов <select>. Я думал, что это будет работать без плагина Live, если я свяжу его перед добавлением элемента в DOM, но даже живые события не запускаются. Это потому, что у моего элемента нет идентификатора?


Изменить: следующее также не работает:

var $filterBox = $("<input type='text'>").bind("click", function () {
        alert("Clicked");
});
21.12.2010

  • Не уверен, почему я не работаю. Но live следует вызывать только один раз для нужного селектора. В вашем коде click() должно быть достаточно. 21.12.2010
  • RE: Ваша редакция. Это должно работать нормально. На самом деле это работает в моей (и Ника) jsfiddle. Итак, у вас есть какие-либо ошибки на странице? Можете ли вы открыть Firebug? 21.12.2010
  • На скольких элементах вы вызываете плагин? 21.12.2010

Ответы:


1

.live() работает с селектором (поскольку он сверяет цель с селектором в момент возникновения события), вы не можете прикрепить его непосредственно к элементу... вы должны просто использовать .click() в этих случаях:

(function ($) {
    $.fn.myPlugin = function () {

    var $filterBox = $("<input type='text'>").click(function () {
        alert("Clicked");
    });
    this.before($filterBox); // insert into DOM before current element
    return this; // keep chain
    };
})(jQuery);

Вы можете попробовать это здесь или немного короче с .insertBefore():

(function ($) {
  $.fn.myPlugin = function () {    
    $("<input type='text'>").click(function () {
        alert("Clicked");
    }).insertBefore(this);
    return this;
  };
})(jQuery);

Вы можете проверить это здесь.

21.12.2010
  • @FreshCode — да, проверьте здесь: jsfiddle.net/nick_craver/DnSgn Мой думаю, у вас есть что-то еще за пределами плагина, который все испортил. 21.12.2010
  • Да, я подозреваю, что что-то еще на странице портит мои события, но я не могу понять, что именно. Других живых событий, влияющих на элементы ввода или выбора, нет. 21.12.2010
  • @FreshCode - например, другой обработчик событий возвращает false? 21.12.2010
  • Ага! Я вызывал его на двух селекторах. Сокращение до одного (:first) работает. Теперь мне нужно выяснить, почему это работает только на одном — очевидно, что в нем больше кода. 21.12.2010
  • Хорошо, изолированно мой код работает с одним списком выбора, а не с двумя. jsfiddle.net/vgXPh/1 Почему? 21.12.2010
  • Решено здесь: stackoverflow.com/questions/4500298/ 21.12.2010
  • @FreshCode — вот обновленная/исправленная версия: jsfiddle.net/nick_craver/vgXPh/6 ... извините, занят работой в банкомате :) 21.12.2010
  • @Ник, спасибо. Я обнаружил каждое (...) решение с другим вопросом :) 21.12.2010

  • 2

    Метод live работает с селекторами, а не с отсоединенными элементами.
    Вы можете обрабатывать обычное (не live) событие click, и оно должно работать нормально.

    21.12.2010

    3

    Почему бы просто не связать? http://jsfiddle.net/9WvpA/

    21.12.2010

    4

    Может ли это быть просто потому, что "<input type='text'>" не является допустимым HTML? Вы не закрыли свой тег. Однако я не уверен, что jQuery не может закрыть его для вас.

    21.12.2010
  • Хотя я ненавижу смотреть на недопустимые элементы в моем коде, jQuery исправляет это без проблем. 21.12.2010

  • 5

    Решено, не используя глобальные переменные, которые заменяли друг друга, и перебирая каждый рассматриваемый элемент с помощью this.each(...):

    (function ($) {
        $.fn.myPlugin = function () {
            return this.each(function () {
                // do stuff
            });
        };
    })(jQuery);
    
    03.01.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..