2010-09-01 18 views
13

Trabajo para una empresa que escribe software qué sitios de cliente incrustan con < script language = "JavaScript" src = ..... etc. etc. Dependemos bastante un poco en document.write para escribir elementos en la página. Por alguna razón, uno de nuestros clientes ha optado por utilizar el tipo de contenido "application/xhtml + xml", que hace que document.write() no se pueda usar en Chrome.Reemplazo de document.write() s en una página xhtml + xml

Entiendo por qué ocurre esto, y que el código DOM debe crear cada elemento, establecer sus atributos, llenarlo con un nodo de texto si es necesario, adjuntar el nodo de texto a su elemento primario y el primario a algún elemento de página. ..

pero ¿cuál es una buena solución que no requiere toda esta basura? Los write() tienen tantos elementos que el código resultante sería espantoso si creáramos nodos y los uniéramos como Knex, Legos o what-have-you.

edición: intentado usar CDATA, pero incluso esta línea es condenado de manera similar por el analizador XHTML en la misma página que el script incrustar:

<script language="text/javascript"><![CDATA[document.write('hi');]]></script> 
+1

A primera vista, JSONML - http://jsonml.org/ - parece que hace lo que quiere, pero como acabo de buscarlo en Google y no lo he pasado demasiado tiempo mirándolo, no estoy lo suficientemente seguro como para llamar a esto una respuesta. – Quentin

Respuesta

10
var el = document.createElement('div'); 
el.innerHTML = 'What you used to document.write()'; 
document.body.appendChild(el); 

Tenga en cuenta que tendrá que fijar el HTML ser XHTML válido, pero eso debería ser mucho menos trabajo que convertir todo el código para usar la manipulación DOM.

+0

innerHTML no funcionará en XML –

+0

Lo hace el html es xhtml válido. El código anterior está adaptado del código de producción, y encontrarás que jQuery usa una técnica similar para construir fragmentos. Página de prueba: http://pastebin.com/4akXVkv3 – stormsweeper

+0

De acuerdo, parece que está implementado para todos los navegadores modernos y es parte de HTML5. Resurgiré tu respuesta pero estoy bloqueado a menos que lo edites. –

0

Hemos estado utilizando Jquery y hemos establecido tiempos de espera para reescribir el código que nos han proporcionado organizaciones similares al suyo. He aquí un ejemplo de búsqueda de Ignite:

<script> 
<!-- 
// once all the page has loaded 
$(document).ready(function() 
    { 
     // wait a bit so everything else that runs when the page has loaded loads, then... 
     setTimeout(function() 
     { 
      // ...load the tracking stuff 
      var headerTag = document.getElementsByTagName('head')[0]; 
      var seo_tag = $.createElement(document.location.protocol + "//track.searchignite.com/si/CM/Tracking/ClickTracking.aspx?siclientid=123456&jscript=1", "script"); 
      headerTag.appendChild(seo_tag); 

     }, 20); 
    }); 
// --> 
</script> 

El tiempo de espera tiene el beneficio adicional de hacer que nuestra página de respuesta al usuario antes de que se haya cargado por el navegador del usuario el código externo, muy útil si los servidores del proveedor externo ocurra ir abajo. Sí, perdemos algunas estadísticas de seguimiento pero la experiencia del usuario no se ve comprometida.

Obviamente, no podrá confiar en JQuery pero tendrá la idea general.

2

Quizás pueda crear un iframe de tipo text/html, escribir el contenido en eso y luego importar los nodos nuevamente en la página principal.

+0

+1 para una idea muy creativa, aunque la respuesta aceptada sea probablemente más simple. – MatrixFrog

+0

La URL modificada en el marco no se mostrará en el navegador, por lo que el usuario no puede agregar una página específica al marcador – cwtuan

Cuestiones relacionadas