¿Cómo eliminar la etiqueta de script ya generada y volver a generar?

Estoy frente a un problema crítico. Tengo una página que tiene dos partes. En la primera parte de la página, el html se procesa a través de una solicitud ajax. Y en la segunda página, el html se representa al cargar la página. La primera parte de la página se maneja por separado con un script de paginación diferente. La paginación también se maneja enviando una solicitud ajax a la misma URL.

Tengo un problema con la primera parte. El script que genera el html para la primera parte también genera muchas etiquetas javascript y html usando javascript. Ahora, lo que estoy haciendo al insertar una nueva etiqueta de script en ese html es así:

var script   = document.createElement("script");
script.type  = "text/javascript";
script.text  = "window.twttr = (function (d,s,id) {var t, js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;js.src=\"//platform.twitter.com/widgets.js\"; fjs.parentNode.insertBefore(js, fjs);return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });}(document, \"script\", \"twitter-wjs\"));(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return;js = d.createElement(s); js.id = id; js.src = \"//connect.facebook.net/en_GB/all.js#xfbml=1\"; fjs.parentNode.insertBefore(js, fjs);}(document, \"script\", \"facebook-jssdk\"));var script_generated=1";               // use this for inline script
document.body.appendChild(script);

De hecho, las declaraciones de conexión de Twitter y Facebook muestran un botón Me gusta de Facebook y un botón de Twitter en cada elemento de la primera parte de la página. Cuando la página se carga por primera vez, la etiqueta del script se genera correctamente. Pero cuando hago clic en paginación, envía una nueva solicitud ajax para tener html para una nueva página, también genera la misma etiqueta de script nuevamente. Entonces, en la segunda página, mi botón de Twitter y los botones Me gusta de Facebook no se muestran.

Pensé que se debía a declaraciones de doble conexión de Facebook y Twitter. Luego genero una variable y establezco algún valor mientras genero esa etiqueta de script. Y en cada solicitud compruebo si esa variable existe o no. Si existe, no genero esa etiqueta de script en particular como esta:

if(typeof script_generated === "undefined") {
  var script   = document.createElement("script");
  script.type  = "text/javascript";
  script.text  = "window.twttr = (function (d,s,id) {var t, js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;js.src=\"//platform.twitter.com/widgets.js\"; fjs.parentNode.insertBefore(js, fjs);return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });}(document, \"script\", \"twitter-wjs\"));(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return;js = d.createElement(s); js.id = id; js.src = \"//connect.facebook.net/en_GB/all.js#xfbml=1\"; fjs.parentNode.insertBefore(js, fjs);}(document, \"script\", \"facebook-jssdk\"));var script_generated=1";
           // use this for inline script
  document.body.appendChild(script);
} 

Hacer esta etiqueta de secuencia de comandos no se regenera, pero el tweet y los botones Me gusta de Facebook aún no aparecen.

Ahora, lo que he interpretado (podría estar equivocado) es que, dado que las etiquetas de secuencia de comandos se generan mediante una solicitud de ajax, los botones no se muestran correctamente ya que no encuentran sus etiquetas de secuencia de comandos.

Ahora lo que quiero es que cada vez que se envíe una solicitud a ese archivo, primero verifique si esa etiqueta de secuencia de comandos en particular existe, la elimine si existe y genere una nueva, de lo contrario generará. Por favor guíame como hacer esto.

Si he interpretado mal el problema, hágame saber cuál es exactamente el problema y cómo solucionarlo.

preguntado el 22 de mayo de 12 a las 11:05

2 Respuestas

Bueno, puede dar una identificación a la etiqueta del script cuando está agregando dinámicamente.

var script   = document.createElement("script");
script.setAttribute('id', 'addedScript');
script.type  = "text/javascript";
script.text  = "window.twttr = (function (d,s,id) {var t, js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;js.src=\"//platform.twitter.com/widgets.js\"; fjs.parentNode.insertBefore(js, fjs);return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });}(document, \"script\", \"twitter-wjs\"));(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return;js = d.createElement(s); js.id = id; js.src = \"//connect.facebook.net/en_GB/all.js#xfbml=1\"; fjs.parentNode.insertBefore(js, fjs);}(document, \"script\", \"facebook-jssdk\"));var script_generated=1";
// use this for inline script
document.body.appendChild(script);

Después de eso, puede verificar si existe una etiqueta de secuencia de comandos usando esto y eliminarla usando la función de consulta .remove().

if(addedScript != undefined) {
  $("#addedScript").remove();
} 

Respondido el 23 de enero de 14 a las 07:01

Hola, puede obtener el objeto de referencia para esa etiqueta de secuencia de comandos y puede cambiar el archivo src al que se hace referencia usando el objeto.

Debería ser así

var $jsRef = $('<script type="text/javascript" >').appendTo(document.body);
$jsRef.attr("src","jsFileName.js");

// You can also add content like this
$jsRef.append(content);


// You can change the js file name or content the same way
$jsRef.attr("src","newJSFileName.js");

// Changing the content like this
$jsRef.empty();
$jsRef.append(content);

Alternativamente, puede establecer la identificación para la etiqueta del script y cambiar el contenido según la identificación en lugar de acceder con objetos.

contestado el 22 de mayo de 12 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.