2010-04-20 19 views
9

Llamo a un método ajax para actualizar un div. Contiene enlaces y funciones que requieren archivos de script java. Pero estos métodos y funciones no se llaman correctamente ya que los archivos de script java no se incluyen a través de una llamada jaja. Por ejemplo, estoy tratando de llamar a una función de caja de luz, pero se redirige a una página diferente y no a una caja de luz.¿Cómo incluir el archivo js en la llamada ajax?

Gracias de antemano, Anubhaw Prakash

+1

Tuve una pregunta similar, no hace mucho tiempo, que encontré una respuesta para, donde estaba tratando de cargar jQuery. ¿La información que contiene puede ayudarte? http://stackoverflow.com/questions/3129451/load-jquery-in-a-js-then-execute-a-script-that-depends-on-it – jasonpgignac

Respuesta

0

Veo que estás usando Ruby on Rails   — quiere decir que usted está usando Prototype en el cliente? Si es así, Prototype's Ajax.Updater ignorará las etiquetas de script que hacen referencia a archivos externos (evaluará las etiquetas de script que tienen sus contenidos en línea). Por lo tanto, para agregar esos archivos externos a su página, deberá enlazar el proceso a través de la devolución de llamada onSuccess, busque en el responseText las etiquetas de scripts con los atributos src, y trátelas usted mismo. Una vez que haya identificado las etiquetas de secuencia de comandos relevantes y haya extraído sus atributos src, puede incluirlos añadiendo dinámicamente las secuencias de comandos como se describe en this article desde la wiki no oficial Prototipo & script.aculo.us.

+0

Hola Crowder, Gracias por la respuesta. Probé el código proporcionado en el artículo, pero la llamada ajax aún no incluye los archivos js. Se saltea el código escrito bajo la etiqueta

0

<script> Las etiquetas escritas en innerHTML no se ejecutan en tiempo de escritura. Puede hacer element.getElementsByTagName('script') para tratar de obtenerlos y ejecutar sus scripts manualmente, pero es muy feo y no es confiable.

Existen diferencias tediosas en el navegador que tienen que ver con lo que sucede con un elemento <script> escrito en innerHTML que luego (directamente o mediante un antecesor) se vuelve a insertar en el documento. Desea evitar este tipo de cosas: simplemente no escriba <script> s en innerHTML en absoluto.

Entonces tampoco tiene que preocuparse por ejecutar scripts dos veces, algo que nunca querrá hacer con los scripts de la biblioteca. No desea terminar con dos copias de una función/clase que se ven iguales pero que no se comparan por igual, y que mantienen ganchos en la página que no se combinan bien entre sí. Los scripts de biblioteca insertados dinámicamente son una receta para confundir fallas.

Mucho mejor para incluir sus scripts estáticamente y vincularlos a elementos de página manualmente después de escribir nuevos elementos en la página. Si realmente lo necesita, puede hacer que sus llamadas AJAX capturen un objeto JSON que contenga tanto el nuevo HTML para agregar como una secuencia de script para ejecutar.

+0

Hola Bobince, Gracias por la respuesta. Intenté reemplazar la etiqueta del script, pero no incluye los archivos js en la solicitud ajax. ¿Puede explicar cómo llamar dinámicamente a los archivos js? Anubhaw – Anubhaw

+0

Ejecutar el contenido de las secuencias de comandos es molesto de hacer. 'eval' de su' textContent' se ejecutará en el ámbito local, lo que puede no ser bueno si está definiendo funciones/vars globales; también tendría que buscar el contenido de los scripts externos con XMLHttpRequest. (Pero, de nuevo, realmente * no * quiere definir globales en un guión insertado en tiempo de escritura). Una forma de ejecutar de manera más confiable es tomar el elemento '

-2
  1. incluyen secuencias de comandos en las páginas estáticas que necesitan utilizar ellos (es decir, contienen una caja de luz, a continuación, incluir el guión caja de luz)
  2. Problema resuelto. No cargue las secuencias de comandos usando AJAX
  3. Hacer una función necesaria llama a los scripts estáticos utilizando las devoluciones de llamada AJAX
1

tuve un problema similar, en el que quería postLoad algo de JavaScript.Lo que hice fue separar la carga del fragmento html y cargar el script en dos llamadas. Para cargar la secuencia de comandos que llamo la siguiente función (no tengo el manejo de la parte jQuery Ajax):

function loadModule(name, callback) { 
    $.ajax({type: "POST" 
      , url: "/js/" + name 
      , dataType: "script" 
      , success: callback 
    });  
} 
0

hey yo encontré una manera de añadir que .... :)

en cuenta este es un síncrona proceso para que no tenga que preocuparse de que el script esté cargado o no ... el script siempre cargará la instancia u invocará la función y podrá comenzar a usar el script cargado instantáneamente ...

use estas 2 funciones

1) la primera es la función ajax para retr IEVE los valores donde asincrónico debe ser cierto para enviar la petición de forma sincrónica

// AJAX FUNCTION 
    function loadXMLDoc(reqt,url,reqp,cfunc,async) 
    { 
     var xmlhttp; 
     try// code for IE7+, Firefox, Chrome, Opera, Safari 
     { 
      xmlhttp=new XMLHttpRequest(); 
     } 
     catch(err)// code for IE6, IE5 
     { 
      try{ 
       xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
      } 
      catch(e){ 
       try{ 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
       catch(E){} 
      } 
     } 
     if(!xmlhttp) 
     { 
      alert("error"); 
     } 
    xmlhttp.onreadystatechange=function(){ 
     if(xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      cfunc(xmlhttp.responseText); 
     } 
    } 
    if(reqt=='GET') 
    { 
     url+=(reqp!=""?"?":"")+reqp; 
     xmlhttp.open("GET",url,(async?false:true)); 
     xmlhttp.send(); 
    } 
    else if(reqt=='POST') 
    { 
     xmlhttp.open("POST",url,(async?false:true)); 
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
     xmlhttp.send(reqp); 
    } 
    else 
    { 
     return false; 
    } 
    } 
    /*use this function 
    loadXMLDoc(reqt,url,reqp,function(response){ 
    }); 
    */ 

2) A continuación, utilizar Ajax para cargar el archivo js como cadena y luego añadirlo a innerHTML de la nueva etiqueta de script y luego añadirlo al sección de la cabeza y una cosa más para asegurar archivo ya está cargado i utiliza el ID de etiqueta de secuencia de comandos como la ruta del archivo que hace que sea realmente fácil para comprobar el duplicado ... :)

//add new script dynamically 
    function add_script(src) 
    { 
     if(!document.getElementById(src)) 
     { 
      loadXMLDoc("GET",src,"",function(jsresp){ 
       var head = document.getElementsByTagName("head")[0]; 
       var script=document.createElement("script"); 
       script.type='text/javascript'; 
       script.id=src; 
       script.text=jsresp; 
       head.appendChild(script); 
      },true); 
     } 
    } 

gracias por toda la ayuda que solía obtener de este sitio y sus usuarios para fines de desarrollo ...

saludos VIPIN JAIN

+0

Tengo esto en mi código nuevo Ajax.Request ('/ products/view_favorite_list?order_no = '+ order_no, {asynchronous: true, evalScripts: true, inserción:' replace ', parámetros:' main_item_id = '+ acción}); Quiero incluir archivos js en mi página de lista favorita ¿me puede guiar cómo debo incluir arriba el código – vasu

+0

? Ey bud simplemente copie estas 2 funciones y cada vez que desee agregar el archivo js simplemente llame a esta función de esta manera --- -------------------------------------------------- --- add_script ("ruta de acceso a su archivo js"); ------------------------------------------------- ------- esto agregará su archivo js en la parte superior de la página para usarlo de inmediato --------------------------- ----------------------------- por favor responde si tienes más preguntas ------------ -------------------------------------------- He editado el código en este momento debido a algún error en los navegadores más antiguos, copie el nuevo código :) –

+0

Veo que la solicitud se realiza en el archivo js en la consola, pero javascript no se está llamando :( – vasu

Cuestiones relacionadas