2011-01-09 4 views
2

У меня есть вызов ajax, и я пытаюсь проанализировать возвращенную страницу для #viewport, тем самым удаляя верхний и нижний колонтитулы возвращенной страницы. но find() не может найти div.jquery не может найти div по id

моя оригинальная функция:

 function(event) { 
      $.ajax({ 
       type: this.method, 
       url: this.action, 
       data: $(this).serialize(), 
       datatype: "html", 
       success: function(data) { 
        alert(data); 
        var respHTML = $(data).find("#viewport"); 
        alert(respHTML.length); 
        $("#contacts_sidebar").html(respHTML); 
       } 
      }); 
      return false; 
     } 

в оповещении (данные), я определенно вижу <div id="viewport">, но alert(respHTML.length) отображается 0. Если я изменить селектор «table.someclass», было бы найти его. но селекторы, такие как «голова» и «тело», также возвращают 0.

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

 success: function(data) { 
      var respHTML; 
      var d=$(data); 
      for (i=0; i<d.length; i++) { 
       if (d[i]["id"] === "viewport") { 
        respHTML = d[i]["innerHTML"]; 
        break; 
       } 
      } 
      $("#contacts_sidebar").html(respHTML); 
     } 

я упускаю что-то? обходной путь работает, просто уродливый.

спасибо большое!

+3

Вы не совершали бы грех использования того же значения «id» для нескольких элементов, не так ли? – Pointy

+0

Вы уже добавляли элемент в DOM, прежде чем искать идентификатор? или это просто HTML? –

+0

@Caspar Kleijne, он неявно добавляет возвращенный HTML в фрагмент документа, записывая '$ (данные)' – Pointy

ответ

7

Если '#viewport' находится на верхнем уровне HTML ответа, вам нужно .filter() вместо этого, так как .find() только смотреть внутри элементы верхнего уровня.

success: function(data) { 
     alert(data); 
     var respHTML = $(data).filter("#viewport"); 
     alert(respHTML.length); 
     $("#contacts_sidebar").html(respHTML); 
    } 

При переходе HTML в JQuery, вы не можете рассчитывать на нахождение <html><head><body> тегов в перекрестном браузере способе.

Если ваш ответ включает в себя весь HTML-документ, я бы избавил его от необходимости только того контента, который вам действительно нужен, если это вообще возможно.

Другим вариантом может быть, чтобы сделать что-то вроде этого:

var respHTML = $('<div>' + data + '</div>').find("#viewport"); 

... но я бы не гарантирует результат.

+1

Думаю, вы, вероятно, прав насчет того, что происходит. – Pointy

+0

это работает. Спасибо большое!!!! – steve

2

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

Отъезд http://api.jquery.com/load и посмотрите раздел о загрузке фрагментов страницы.

+0

Он отправляет форму, поэтому '.load()' действительно не поможет многим (хотя я понимаю объект, о котором вы говорите). – Pointy

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