2013-09-04 2 views
6

У меня типичный вызов AJAX, который добавляет некоторый HTML к текущей странице. Я хочу иметь доступ к недавно вставленному HTML с типичными селекторами jQuery.Доступ к объекту DOM после вызова AJAX?

Вот что я бы как, чтобы быть в состоянии сделать ...

$.ajax({ 
    url: url, 
    success: function(data) { 
     $('body').append(data); 
    } 
}); 

$('#new_div').show(); 

#new_div бы некоторые HTML элемент из данных я извлеченного. Я не обязательно хочу присоединять события к новым элементам (например, click), поэтому использование чего-то вроде .load() или .on() здесь не работает (насколько я знаю).

Я попытался установить $.ajax() вызов переменной: var new_div = $.ajax(...), но это меня никуда не доставило.

+0

а) Вы проверить ваши ajax-запрос действительно работает (с консолью разработчика, предупреждениями или firebug) и б) каков его вывод? – DanFromGermany

+2

Да, запрос работает нормально. Вывод при попытке доступа к новому элементу DOM за пределами вызова успеха просто не определен. – Shpigford

+1

AJAX является асинхронным, поэтому 'new_div' еще не добавлен –

ответ

1

как насчет:

$.ajax({ 
    url: url, 
    success: function(data) { 
     $('body').append(data).find('#new_div').show(); 
    } 
}); 
+0

Есть много дополнительных вещей, которые мне нужно сделать. Не * просто * 'show()'. Мне нужно получить доступ к нему за пределами звонка. – Shpigford

+0

Что вы на самом деле хотите сделать? –

+0

Что я действительно хочу делать с элементом DOM? Все виды вещей. Там есть множество других функций, которые мне нужны, чтобы получить доступ к вновь вставленным элементам DOM. – Shpigford

2

Если вы хотите отделить код от обратного вызова:

functionWithALotOfStuffToDo = function(data){ 
    // do stuff here 
} 

$.ajax({ 
    url: url, 
    success: functionWithALotOfStuffToDo 
}); 
12

Если вы хотите, чтобы управлять новым содержанием сразу после (или даже раньше), вставив его в DOM вы можете добавить это также в обратный вызов успеха AJAX:

$.ajax({ 
    url: url, 
    success: function(data) { 
     $('body').append(data); 
     $('#new_div').show(); 
    } 
}); 

С другой стороны руки, если вы хотите связать обработчик контент, который будет добавлен на страницу с помощью AJAX, JQuery делает это так:

$(document).on('click', '#new_div', function(){ 
    alert("This function is bound to all #new_div's click events, even if they are added to the DOM via ajax later!") 
}); 
0

Если предположить, что данные быть возвращено нечто вроде <div id='new_div' /> затем попробовать что-то такое, как

var newDiv = null; 

$.ajax({ 
    url: url, 
    success: function(data) { 
     newDiv = $(data).appendTo($('body')); 
    } 
}); 

Это добавит <div /> к телу вашей страницы и присвоит элементу jQuery значение переменной newDiv, которое затем будет доступно снова на более позднем этапе.

Однако, если вы получили доступ к newDiv до того, как был возвращен success, это будет null или предыдущее значение, если оно было назначено ранее.

0

На самом деле такого рода вещи могут быть решены следующим образом: (я знаю, что он похож на другие, но немного более ясно)

$.ajax({ 
    url: url, 
    success: function(data) { 
     $('body').append(data); 
     afterHtmlAppendCallback(); 
    } 
}); 
function afterHtmlAppendCallback() 
{ 
    $('#new_div').show(); 
} 
0

Я думаю, что это Аякса асинхронной вызвать проблему, которую вы упоминаете ,

В jQuery API ajax funciton говорит: Выполните асинхронный запрос HTTP (Ajax).

Если вы хотите получить доступ к данным из АЯКС справа после запроса

вы должны поставить вам код в Ajax.функция успеха, как:

$.ajax({ 
    url: url, 
    success: function(data) { 
     $('body').append(data); 
     $('#new_div').show(); 
    } 
}); 

Или включить параметр асинхронной в ложном

$.ajax({ 
    url: url, 
    async:false, 
    success: function(data) { 
     $('body').append(data); 
    } 
}); 
$('#new_div').show(); 

что будет убедиться, что $ («# new_div») селектор получает объект

Смежные вопросы