2011-02-14 4 views
7

Я использую следующий JQuery, чтобы тянуть новые данные и заменить содержимое DIV ListDataИспользование JQuery ReplaceWith заменить содержимое DIV работает только первый раз

$(function(){ 
$('.refresh').click(function(event) { 
    event.preventDefault(); 

    $.ajax({ 
     url: "_js/data.php", 
     success: function(results){ 
      $('#listdata').replaceWith(results); 
     } 
    }); 
}); 
}); 

Скрипт запускается многочисленные ссылки на страница, такая как:

<a href="" id="update1" class="refresh">Update 1</a> 
<a href="" id="update2" class="refresh">Update 2</a> 

По какой-то причине сценарий работает только при первом щелчке ссылки. Последующие клики не обновляют данные.

Я видел различные исправления, но ничего, что я мог бы получить. Какие-либо предложения?

+0

Живой номер? ... –

ответ

27

Похоже, ваша проблема связана с использованием replaceWith.

Вы удаляете элемент, который соответствует $('#listdata') при первом вызове replaceWith, поэтому последующие обновления не могут найти, где данные должны быть помещены в документ.

Вы могли бы попробовать что-то вроде

$('#listdata').empty(); 
$('#listdata').append(results); 

или прикованного как этот

$('#listdata').empty().append(results); 
+0

Я думаю, что вы ударили ноготь по голове, но это конкретное исправление не работает – Paul

+0

Простите, я пропустил, что вы переключили ** replaceWith ** на ** append **. Отлично! – Paul

+0

@Sam Dufel У меня такая же проблема, все еще освежает ... – EBM

0

Try:

$('a.refresh').live('click', function(e) { 
    e.preventDefault(); 

    $.ajax({ 
     url: '_js/data.php', 
     success: function(data) { 
      $('#listdata').empty().html(data); 
     } 
    }); 
}); 

Если .refresh якоря внутри #listdata элемента, то делегация является более оптимальным решением:

var list = $('#listdata'); 

list.delegate('a.refresh', 'click', function(e) { 
    e.preventDefault(); 

    $.ajax({ 
     url: '_js/data.php', 
     success: function(data) { 
      list.empty().html(data); 
     } 
    }); 
}); 
+0

Имейте в виду, что с помощью вашего решения '.delegate()' вы меняете элемент '# listdata', поэтому вы потеряете обработчик' .delegate() '. EDIT: вы можете сделать 'list.parent(). Delegate ('# listdata a.refresh', 'cli ...' – user113716

+0

К сожалению, это первое, что я попробовал не повезло. Я думаю, что ответ Сэма идет по правильным линиям , в том, что ** replaceWith ** удаляет div. К сожалению, я все еще не ближе к ответу. – Paul

+0

@Paul Я обновил свой ответ –

0

Вам нужно изменить HREF на ваши ссылки на < a href = "#" > ... </a >. Это предотвращает обновление браузера при нажатии ссылки.

Если вы так поступаете, вы также захотите вставить «return false» в конце обработчика кликов, чтобы предотвратить пузырение.

+0

OP использует preventDefault(), чтобы отключить привязки ... –

+0

Кроме того, пузырьки не являются проблемой Вот. –

3

Если вы используете replaceWith(), вы заменяете #listdata с совершенно новым элементом в целом.

Если data не является чем-то вроде <div id="listdata"></div>, то #listdata исчезает после replaceWith(). Я думаю, вы, вероятно, должны использовать html().