2010-07-21 12 views
38

Tratando de encontrar div elemento con id="result" de datos devueltos por .ajax() usando .find(). Lamentablemente, alert(result) no devuelve div#result.jQuery .find() en la fecha de .ajax() se vuelve "[object Object]" en lugar de div

Aquí está mi código:

$.ajax({ 
    url: url, 
    cache: false, 
    success: function(response) { 
     result = $(response).find("#result"); 
     alert(response); // works as expected (returns all html) 
     alert(result); // returns [object Object] 
    } 
}); 
+0

qué la respuesta viene en el lugar puño: 'alerta (respuesta)'? – Sarfraz

+0

No sé cómo corregir el código de la manera en que lo hizo, pero creo que funcionará si primero coloca el contenido dentro de una etiqueta div con ninguna visualización y luego encuentra la etiqueta #result dentro de este div. Me gusta: $ ('# div-content'). Html (resultado); $ ('# div-content'). find ('# resultado'); –

Respuesta

81

Para responder a su pregunta en concreto, parece estar funcionando correctamente. Usted dijo que devuelve [object Object], que es lo que jQuery devolverá con el método find("#result"). Devuelve un elemento jQuery que coincide con la consulta find.

Intente obtener un atributo de ese objeto, como result.attr("id") - debe devolver result.


En general, esta respuesta depende de si o no #result es el elemento de nivel superior.

Si #result es el elemento de nivel superior,

<!-- #result as top level element --> 
<div id="result"> 
    <span>Text</span> 
</div> 
<div id="other-top-level-element"></div> 

find() no va a funcionar. En su lugar, utilice filter():

var $result = $(response).filter('#result'); 

Si #result no es el elemento de nivel superior,

<!-- #result not as top level element --> 
<div> 
    <div id="result"> 
    <span>Text</span> 
    </div> 
</div> 

find() funcionará:

var $result = $(response).find('#result'); 
+1

Estaba averiguando cómo hacer esto por mi cuenta - esto definitivamente me ha ahorrado algo de tiempo :) – Rob

+0

Esto también me salvó . – derekshull

+1

Gracias por explicarme, encontré una comparación simple que puede ser útil http://www.mkyong.com/jquery/difference-between-filter-and-find-in-jquery/ – CrandellWS

19

probar esto:

result = $("#result", response); 

por cierto alert es una forma aproximada a las cosas de depuración, tratar console.log

0

Es #result en la respuesta HTML? Prueba lo siguiente. jQuery aún devolverá un objeto vacío si no encuentra nada.

alert(result.length); 
+0

return 1 pero cómo obtener html de ese div –

0

Debe añadir dataType: "html" a la solicitud. Estoy bastante seguro de que no podrás buscar el DOM del html devuelto si no sabe que es html.

+0

Tuve un problema relacionado que esto no solucionó. Estaba recuperando una página web entera a través de AJAX, y debido a una etiqueta o algún otro problema con formato incorrecto, jQuery vio la respuesta como una matriz de nodos de texto en lugar de un árbol DOM correcto. La solución para mí fue simplificar los nodos de respuesta. –

-1

Es posible que tenga que hacer algo como

var content= (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d 

, entonces debería ser capaz de utilizar

result = $(content).find("#result") 
+0

Esto funcionará con seguridad si está usando un servicio web, y su tipo de datos es 'json' – drusnov

3

El jQuery encontrar() devuelve un objeto jQuery que envuelve el objeto DOM. Debería poder trabajar con ese objeto para hacer lo que le gustaría con el div.

+0

stjowa me ganó. Parece que está funcionando como se esperaba. – Ryan

0

Especifique dataType: "html".

Si no lo hace, jQuery adivinará el tipo de datos solicitado (marque: http://api.jquery.com/jQuery.ajax/).Supongo que en su caso response era String en lugar de DOMObject. Obviamente, los métodos DOM no funcionarán en una Cadena.

Se podría probar que con console.log("type of response: " + typeof response) (o alert("type of response:" + typeof response), en caso de que no se quede Firebug)

25

acabo de pasar 3 horas para resolver un problema similar. Esto es lo que funcionó para mí.

El elemento que estaba intentando recuperar de mi respuesta $.get fue un primer elemento hijo de la etiqueta de cuerpo. Por alguna razón, cuando envolví un div alrededor de este elemento, se volvió recuperable a través del $(response).find('#nameofelement').

Ni idea de por qué, pero sí, elemento recuperable puede que no sea el primer hijo del cuerpo ... que podría ser útil a alguien :)

+1

En realidad creo que esto debería haber sido validado como la respuesta correcta –

+0

sí útil para mí. ¡aclamaciones! – Alessandro

+0

Excelente. ¡Gracias por compartir! – Ben

1

usted puede hacerlo de esta manera de encontrar cualquier div y obtener sus atributos o nada usted quiere.

$(response).filter('#elementtobefindinresponse').attr("id"); 

o

$(response).filter('img#test').attr("src"); 
+0

es mucho mejor! – Heart

8

Ésta es su respuesta:

<div class="test">Hello</div> 
<div class="one">World</div>  

La siguiente jQuery no funcionará:

$(data).find('div.test');  

como los divs son elementos de primer nivel y los datos no son un elemento, sino una cadena, para que funcione u necesidad de utilizar .Filter

$(data).filter('div.test');  

Otro misma pregunta: Use Jquery Selectors on $.AJAX loaded HTML?

+0

Creo que esta es la mejor respuesta – MTVS

+0

funcionó para mí también ... debería ser la mejor respuesta! – sps

+0

Esto también parece funcionar si '.find()' te da demasiados o resultados incorrectos. – tobias47n9e

0

si su llamada ajax devuelve una matriz JSON, cadena JSON desde el lado del servidor, entonces debería empezar a hacer lo siguiente:

$("button#submit").click(function() { 
    $.ajax({ 
     type: "POST", 
     url: "ajax_create_category", 
     data: $('form#create_cat_form').serialize(), 
    success: function(data) 
      { 
      if(data) 
      { 
       var jsonObj = JSON.parse(data); 
       if(jsonObj.status) 
       { 
       $("#message").html(jsonObj.msg); 
       } 
      } 
     } 
     }); 
    }); 

Analice su objeto JSON en un objeto JS (variable) y luego puede usar el índice de los datos para recuperar los datos. Espero que esto sea útil para algunos de ustedes! :)

5

no te olvides de hacerlo con analizar html. como:

$.ajax({ 
    url: url, 
    cache: false, 
    success: function(response) { 
     var parsed = $.parseHTML(response); 
     result = $(parsed).find("#result"); 
    } 
}); 

tiene que trabajar :)

3

Esto funcionó para mí, sólo tiene que poner .html() en el extremo de - $ (respuesta).encontrar ("# resultado")

+0

Las personas no han escrito este útil método .html() para evitar [objeto objeto] en el cuadro de alerta. lo has mencionado y esto funcionó 4 veces. Gracias. – prashant

0

sólo tiene que utilizar el siguiente código

var response= $(result); 

$(response).find("#id/.class").html(); [or] $($(result)).find("#id/.class").html(); 
1

Lo que pasa es que su ajaxrespuesta devuelve un cadena, así que si usa directamente $ (respuesta) devolvería JQUERY:Error no detectado: error de sintaxis, expressio no reconocido n en la consola. Para usarlo correctamente, primero debe usar una función incorporada JQUERY llamada $.parseHTML(response). Como lo que el nombre de la función implica, necesita analizar primero la cadena como un objeto html. Al igual que este en su caso:

$.ajax({ 
    url: url, 
    cache: false, 
    success: function(response) { 
     var parsedResponse = $.parseHTML(response); 
     var result = $(parsedResponse).find("#result"); 

     alert(response); // returns as string in console 
     alert(parsedResponse); // returns as object HTML in console 
     alert(result); // returns as object that has an id named result 
    } 
}); 
0
$.ajax({ 
    url: url, 
    cache: false, 
    success: function(response) { 
     $('.element').html(response); 
    } 
}); 

< span class = "element" > 
    //response 
    < div id = "result" > 
     Not found 
    </div> 
</span> 

var result = $("#result:contains('Not found')").text(); 
console.log(result); // output: Not found 
Cuestiones relacionadas