2009-06-10 15 views
18

Voy a enviar una petición GET jQuery así:Cómo ejecutar código JavaScript dentro de una etiqueta de script devuelto por una respuesta ajax

$.get($(this).attr("href"), $(this).serialize(), null, "script"); 

La respuesta que esperaba recibir será envuelto en las etiquetas de secuencia de comandos.

Entiendo que el navegador no ejecuta la respuesta a menos que se devuelva sin las etiquetas de script. Normalmente eliminaría las etiquetas de la respuesta, pero en esta situación no tengo acceso al código que se ejecuta en la máquina remota, por lo que no puedo quitar las etiquetas en la fuente.

¿Hay alguna manera de quitar las etiquetas de script del lado del cliente de respuesta y ejecutar el javascript?

Respuesta

26

Usted debe ser capaz de hacer lo siguiente:

$.get($(this).attr("href"), $(this).serialize(), function(data){ 
    var script = $(data).text(); 
    eval(script); 
}); 
+0

Perfecto. Esto hizo el truco. ¡¡¡Gracias!!! – KJF

+0

Recomendaría agregar var before script, para evitar que sea global. – Boude

2

Si entiendo su pregunta correcta, esto debería ser suficiente para obtener el texto de las etiquetas de script:

$(response).text()

0

decir que nuestra respuesta está en el var 'respuesta':

script = response.replace(/<script>(.*)<\/script>/, "$1"); // Remove tags 
eval(script); // Execute javascript 
+2

Sin embargo, si tuviera que usar esta solución, probablemente tendría que complicar un poco la expresión regular para permitir cualquier atributo en las etiquetas del script, y probablemente ancle dicho regex al principio y al final de la cadena. Por ejemplo (totalmente no probado):/^ ] +> (. *) <\/script> $/ – EvanK

+0

Tiene razón, usar .text() es probablemente una mejor manera de todos modos. – cloudhead

2
+1

Eso funcionaría si los datos devueltos no estuvieran incluidos en las etiquetas

3

O:

var myScript = new Function($('script#myscript',responseText).text()); 
myScript(); 
1

respuesta de José Basilio está bien, pero recomiendo reemplazar eval con la función globalEval de jQuery ..

$.get($(this).attr("href"), $(this).serialize(), function(data) { 
    script = $(data).text(); 
    $.globalEval(script); 
}); 

globalEval es la función que normalmente se llamaría cuando llame a un método ajax con un tipo de retorno de script.

Este de la documentación de la API ...

Este método se comporta de manera diferente de usar una eval Javascript normal() en que se ejecuta dentro del contexto global (lo cual es importante para cargar scripts externos dinámicamente) .

0

Hice esto de manera ligeramente diferente, y utilicé php land para hacerlo más fácil. (No me gusta usar eval, ni me gustan las reescrituras conspicuas).

puse todo mi jQuery en una cadena PHP como tal (que había mucho más JavaScript en la vida real)

$out .= "  $('#save_now').button(); \n"; 
    $out .= "  $('#save_now').click(function() {\n"; 
    $out .= "   return false;\n"; 
    $out .= "  }); \n"; 

continuación, también en PHPlandia

echo "<script>\n"; 
    echo " function onOpen(){ \n"; 
    echo $out; 
    echo " } \n"; 
    echo "</script>\n"; 

continuación, en el jQuery $ .ajax llamada hago esto

$.ajax({ 
      url: geturl, 
      type: 'post', 
      data: getparams, 
      success: function(data) { 
       mydiv.html(data); 
       onOpen(); 
      }, 
      cache: false 
     }); 

como se puede ver que no lo nee php tierra, es sólo en mi base de código Yo especie de necesidad de hacerlo. El truco está en eliminar $(document).ready(function(){}); y rodar su propio

Cuestiones relacionadas