при добавлении a моя функция щелчка не работает

#jquery

#jquery

Вопрос:

когда вы нажимаете на мою ссылку #addScnt, появляется новый дочерний элемент. Пока все работает нормально, но я добавляю другой тег, и когда вы нажимаете на него, должно что-то произойти, но, как вы можете догадаться, ничего не происходит…но когда я создаю другую ссылку внутри своей страницы (то есть вне моей функции jquery), моя функция щелчка работает… Так что я не понимаю, что там происходит.

 $(function() {
    var scntDiv = $('#p_scents');
    var i = $('#p_scents p').size()   1;

    $('#addScnt').click(function() {
        $('<p><label for="p_scnts"><input type="file" id="p_scnt" name="p_scnt_'   i  '"></label> <a href="#" id="remScnt">Remove</a></p>').appendTo(scntDiv);
        i  ;
        return false;
    });

    $('#remScnt').click(function() {
        alert();
    });

});
  

мой html

  <h2><a href="#" id="addScnt">Ajoutez une nouvelle photo</a></h2>

<div id="p_scents">
    <p>
        <label for="p_scnts">
            <input type="file" id="p_scnt" name="p_scnt">
        </label>
    </p>
</div>
  

Итак, $(‘#remScnt’).click(function() вообще не работает, когда я добавляю другого дочернего элемента … но если я буквально добавлю тег с идентификатором #remScnt на свою страницу, мое предупреждение сработает…

Комментарии:

1. обнаружены двойные идентификаторы #…

2. Вам может быть полезно прочитать несколько руководств по HTML, здесь вы допускаете некоторые ошибки новичков, и вы можете избавить себя от головной боли

Ответ №1:

Здесь происходят две вещи…

Во-первых, похоже, что вы повторно используете id значения. Если вы добавляете это несколько раз на страницу:

 <a href="#" id="remScnt">Remove</a>
  

Тогда у вас есть несколько одинаковых элементов id , что недопустимо. Таким образом, поведение таких вещей, как jQuery selectors ( $('#remScnt') ) , не определено. (Они могут случайно работать, но они по-прежнему недействительны и не определены.) Вместо этого попробуйте использовать классы вместо:

 <a href="#" class="remScnt">Remove</a>
  

и:

 $('.remScnt')
  

Во-вторых, привязка щелчка здесь происходит только один раз при загрузке страницы:

 $('.remScnt').click(function() {
    // etc.
});
  

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

Вы можете обойти это, делегировав обработчик событий общему родительскому элементу и отфильтровав события на основе селектора. jQuery предоставляет .on() функцию для этого:

 $(document).on('click', '.remScnt', function() {
    // etc.
});
  

То, что это делает, на самом деле привязывается к событию щелчка всего документа и реагирует на это событие каждый раз, когда что-то, соответствующее предоставленному селектору, вызывает такое событие. Проще говоря, в этой версии '.remScnt' селектор вычисляется при возникновении события щелчка, а не при определении обработчика события.

Вам не нужно использовать document для удержания события, подойдет любой общий родительский элемент. До тех пор, пока этот родительский элемент не будет динамически добавлен / удален, как целевые элементы. Например, если все целевые a class="remScnt" элементы будут одинаковыми div , вы можете div настроить их вместо этого:

 $('#someParentDiv').on('click', '.remScnt', function() {
    // etc.
});
  

Комментарии:

1. Вау. В первой части я видел свои ошибки, но даже переход на классы ничего не дал. Но теперь, когда я попробовал эту функцию, все работало гладко. Действительно отличное объяснение, понятное и чистое. Спасибо за ваше время, Дэвид!

Ответ №2:

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

 $('#p_scents').on('click', '#remScnt', function() {
    alert();
});
  

Ответ №3:

Когда вы добавляете элемент, который вам нужно использовать .on вот так,

 $('#p_scents').on('click', '#remScnt', function(){
    // Some Stuff
});