jQuery « При добавлении нового элемента DOM через jQuery, он не срабатывает на перехватчики событий

В JavaScript коде есть примерно такой участок:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .javascript.geshi_code {font-family:monospace;} .javascript.geshi_code .imp {font-weight: bold; color: red;} .javascript.geshi_code .kw1 {color: #000066; font-weight: bold;} .javascript.geshi_code .kw2 {color: #003366; font-weight: bold;} .javascript.geshi_code .kw3 {color: #000066;} .javascript.geshi_code .co1 {color: #006600; font-style: italic;} .javascript.geshi_code .co2 {color: #009966; font-style: italic;} .javascript.geshi_code .coMULTI {color: #006600; font-style: italic;} .javascript.geshi_code .es0 {color: #000099; font-weight: bold;} .javascript.geshi_code .br0 {color: #009900;} .javascript.geshi_code .sy0 {color: #339933;} .javascript.geshi_code .st0 {color: #3366CC;} .javascript.geshi_code .nu0 {color: #CC0000;} .javascript.geshi_code .me1 {color: #660066;} .javascript.geshi_code span.xtra { display:block; }

$(document).ready(function() {
        $('.update-link').click(function() {
        id = $(this).attr('rel');
        //.. do something
              alert('ID: ' + id);
        });
        $('#add').click(function() {
             $('<input type="button" class="update-link" value="Сохранить" />').insertAfter('#lastelement');
        });
});
 


Соответственно при нажатии на ссылку с id "add" действительно появляется нужная мне кнопка, но вот нажатия на неё не перехватываются, хотя у неё тот же класс, что и у изначально загруженных кнопок. Остальные кнопки, которые загружены изначально со страницей, срабатывают нормально.
Как я понимаю, нужно каким-то макаром «обновить» DOM, чтобы перехватчик события клика увидел новый элемент?

1 ответов


Просто используй $('.update-link').live('click', function() {} вместо текущего кода. Это самый простой, но не самый правильный способ.


".... макаром «обновить» DOM, чтобы перехватчик события клика увидел новый элемент... " странная логика, вы думаете что когда кликаете по элементу "перехватчик" обходит все элементы с классом .update-link?

Вы загрузили документ, прошлись по всем элементам $('.update-link') и повесили на них евент, все, какие были элементы получили события. Если вы добавляете еще элмент делайте callback функцию которая навесит на этот новый элемент событие.

К сожалению в JQuery не силен но примерно могу набросать


var next_link_id = 5;
var category = 3;

function addNewLine() {
    var btn = $('<input type="button" rel="' + next_link_id + '" value="Сохранить" style="height: 25px;" class="update-link" />');
    btn.click(process);
    var newelement = $('<tr id="rel' + next_link_id + '"></tr>');
    var td1 = $('<td class="gray villageid">' + next_link_id + '</td>');
    var td2 = $('<td class="gray"><a href="#" id="link' + next_link_id + '"></a></td>');
    var td3 = $('<td class="gray"><input type="text" name="link' + next_link_id + '_link" id="link' + next_link_id + '_link" style="width: 300px;" /></td>');
    var td4 = $('<td class="gray"></td>');
    td4.append(btn);
    newelement.append(td1);
    newelement.append(td2);
    newelement.append(td3);
    newelement.append(td4);
    newelement.insertAfter('#head');
}

function process() {
    id = $(this).attr('rel');
    if($('#link' + id + '_link').val() == '')
      alert('Введите адрес ссылки!');
    else
    {
      var link = $('#link' + id + '_link').val();
      var text = $('#link' + id + '_text').val();
      setLink(id, link, text, category);
    }
}

$(document).ready(function() {
  $('.update-link').click(process);
  $('#add-link').click(function() {
      addNewLine();
      next_link_id++;
  });
});
function setLink(id, link, text, category)
{
  $.post('add_link.php', { id: id, link: link, text: text, category: category}, function(data){
    if(data == 'success')
    {
      alert('Данные сохранены');
      if(text == '')
        text = link;
      $('#link' + id).html(text);
      $('#link' + id).attr('href', link);
    }
  });
}
 

PS Поправьте в комментариях как правильно это должно выглядеть на JQuery
UPD: Отредактировал код.

Для ustisha:


var next_link_id = 5;
var category = 3;

$(document).ready(function() {
  $('.update-link').click(function() {
    id = $(this).attr('rel');
    if($('#link' + id + '_link').val() == '')
      alert('Введите адрес ссылки!');
    else
    {
      var link = $('#link' + id + '_link').val();
      var text = $('#link' + id + '_text').val();
      setLink(id, link, text, category);
    }
  });
 
  $('#add-link').click(function() {
    var newelement = '<tr id="rel' + next_link_id + '"><td class="gray villageid">' + next_link_id + '</td><td class="gray"><a href="#" id="link' + next_link_id + '"></a></td><td class="gray"><input type="text" name="link' + next_link_id + '_link" id="link' + next_link_id + '_link" style="width: 300px;" /></td><td class="gray"><input type="text" name="link' + next_link_id + '_text" id="link' + next_link_id + '_text" style="width: 300px;" /></td><td class="gray"><input type="button" rel="' + next_link_id + '" value="Сохранить" style="height: 25px;" class="update-link" /></td></tr>';
    $(newelement).insertAfter('#head');
    $('input[rel=' + next_link_id + ']').onclick = setLink(next_link_id, $('#link' + next_link_id + '_link').val(), $('#link' + next_link_id + '_text').val(), category);
    next_link_id++;
  });
});
function setLink(id, link, text, category)
{
  $.post('add_link.php', { id: id, link: link, text: text, category: category}, function(data){
    if(data == 'success')
    {
      alert('Данные сохранены');
      if(text == '')
        text = link;
      $('#link' + id).html(text);
      $('#link' + id).attr('href', link);
    }
  });
}
 

Есть таблица с ячйками: ID ссылки, поле input с адресом ссылки, поле input с текстом ссылки, кнопка «Сохранить».
При клике на ссылку с id "add", в таблицу добавляется новая строка TR с пустыми соответствующими полями. Переменная next_link_id соответственно указывает на id новой ссылки. Всё создаётся нормально, вот только после

$('input[rel=' + next_link_id + ']').onclick = setLink( //...
 
У меня сразу же срабатывает нажатие на новую кнопку %) И соответственно в базу добавляется пустая ссылка.

Сократил код до такого:


var next_link_id = 5;
var category = 3;

$(document).ready(function() {
  $('.update-link').click(setLink($(this).attr('rel')));
 
  $('#add-link').click(function() {
    var newelement = '<tr id="rel' + next_link_id + '"><td class="gray villageid">' + next_link_id + '</td><td class="gray"><a href="#" id="link' + next_link_id + '"></a></td><td class="gray"><input type="text" name="link' + next_link_id + '_link" id="link' + next_link_id + '_link" style="width: 300px;" /></td><td class="gray"><input type="text" name="link' + next_link_id + '_text" id="link' + next_link_id + '_text" style="width: 300px;" /></td><td class="gray"><input type="button" rel="' + next_link_id + '" value="Сохранить" style="height: 25px;" class="update-link" /></td></tr>';
    $(newelement).insertAfter('#head');
    $('input[rel=' + next_link_id + ']').click(setLink(next_link_id));
    next_link_id++;
  });
});
function setLink(id)
{
  var link = $('#link' + id + '_link').val();
  var text = $('#link' + id + '_text').val();
  $.post('add_link.php', { id: id, link: link, text: text, category: category}, function(data){
    if(data == 'success')
    {
      alert('Данные сохранены');
      if(text == '')
        text = link;
      $('#link' + id).html(text);
      $('#link' + id).attr('href', link);
    }
  });
}
 

Но теперь просто при загрузке страницы сразу же вызывается setLink() почему-то %)