2012-10-06 51 views
18

Al usar <script type="text/plain" src="http://..."></script>, donde la URL se refiere a un archivo de texto sin formato, ¿hay alguna manera de acceder al contenido del archivo en JavaScript? El archivo se transfiere al navegador, pero el valor de la propiedad innerHTML del elemento script no cambia (sigue siendo la cadena vacía). Inspeccionar el nodo del elemento en el DOM no parece revelar ninguna propiedad a través de la cual se pueda encontrar el contenido recibido.¿Cómo acceder al contenido de texto plano recuperado mediante <script type = "text/plain" src = ...> en JavaScript?

Sé que XMLHTTPRequest se puede usar en su lugar, pero me interesa el problema de por qué los navegadores obtienen datos de la manera que describí pero no parecen ofrecer ningún acceso a ellos.

+0

Supongo que está esperando correctamente que se cargue todo el contenido y luego pruebe – Mutahhir

+0

Supongo que los navegadores no se molestan en mantener el contenido * (excepto tal vez en la memoria caché del navegador por un tiempo) *. Una vez que se ha evaluado el guión, la fuente ya no se necesita, por lo que sería una pérdida de memoria. –

+1

Curiosamente, Chromium ni siquiera se molesta en descargar recursos de scripts externos con el tipo de atributo que es cualquier tipo MIME que no se debe interpretar como script, como se detalla aquí [http://www.w3.org/TR/html5/the-script-element .html # scriptingLanguages] entonces me pregunto por qué hacer todo esto [http://www.w3.org/TR/html5/the-script-element.html#the-script-block-s-source] – toofast1227

Respuesta

10

En primer lugar, el atributo text del HTMLScriptElement es el método preferido para acceder al texto de un elemento en línea <script>. DOM-Level-2 y HTML5: 4.11.1 tanto indicar que una secuencia de comandos debe tener un atributo text que contiene los scripts interior texto:

El atributo IDL text debe devolver una concatenación de los contenidos de todos los nodos de texto que son hijos de la script elemento (ignorando cualquier otro nodo, como comentarios o elementos), en orden de árbol. En la configuración, debe actuar del mismo modo que el atributo textContent IDL.

Dado que el elemento <script> está vacía (que ha especificado una fuente externa), text, textContent y innerHTML están vacías. Esto se debe a que el atributo text sólo se establece en secuencias de comandos en línea:

Si el guión es en línea y el tipo del bloque de script es un lenguaje basado en texto:

El valor del atributo text IDL en el momento en que se estableció por última vez la bandera del elemento "ya comenzado" es el origen del script.

así que no es posible incluir una text/plain externo utilizando este método.

Consulte también:

  • W3C: HTML5: 4.11.1 The script element: text attribute y el ejemplo para el mapa del juego:
    <script src="game-engine.js"></script> <!-- game engine isn't inline --> 
    <script type="text/x-game-map"> <!-- but data needs to be inline --> 
    ........U.........e 
    o............A....e 
    .....A.....AAA....e 
    .A..AAA...AAAAA...e 
    </script> 
    
+1

Esto suena convincente. No prueba que no hay forma de acceder al contenido cargado, pero lo hace muy probable. Y como @toofast menciona, Chrome ni siquiera lo carga. –

0

Sí, no, no creo que pueda obtener el contenido de texto de esa manera. Es principalmente porque vas a utilizar elementos de acceso directo para obtener texto que nunca se ha inyectado realmente en el dom.

Probé algunas opciones y no funcionaron. No tengo una razón sólida por la que no puedas encontrarla, pero la razón por la que me estoy rindiendo/pensando así es porque incluso el inspector de WebKit que estoy usando no tiene una revelación triangular al lado de una etiqueta script-src. Lo que hace es que convierte el src en un enlace en el que puede hacer clic y luego usa Ajax o lo que sea para volver a leer ese texto del servidor.

6

Tenga en cuenta que si esto se admite, que proporcionaría un enorme agujero de seguridad y un medio para evitar las protecciones de guiones entre sitios que protegen json y otros datos. Esencialmente, mi desagradable página web (nasty.com, por ejemplo) podría acceder a sus datos privados que están protegidos por cookies al cargarlos usando una etiqueta de script. p.ej.

<script type="text/plain" 
     src="https://supersecure.com/youraccount/privatedocs/list"/> 

Desde las galletas para supersecure.com será enviado automáticamente a la solicitud (como es el caso cuando se solicita recursos), el sitio seguro sólo devuelve los datos (por ejemplo, la lista de documentos privados) ya que no podía No puede distinguir fácilmente la solicitud de una solicitud ajax de su página web legítima. Este agujero no existe con ajax, ya que el navegador simplemente evitará que una página de nasty.com realice una solicitud de ajax a supersecure.com, gracias a la misma política de origen.

Obviamente, no hay ningún problema de seguridad con los datos en línea.

3

Después de varios días de investigación de la misma pregunta, encontré varias referencias al siguiente código:

<html> 
<head> 
<script type="text/javascript"> 
function init(){ 
var extText = window.frames.messageTxt.document.body.lastChild.lastChild.data; 
extText = extText.replace(/[\r\n]/g," "); 
document.forms[0].nMessage.value = extText; 
} 
window.onload=init; 
</script> 
</head> 
<body> 
<iframe name='messageTxt' src='txtData.txt' style='display:none'></iframe> 
<form> 
<textarea name='nMessage'></textarea> 
<input type="button" value="click" onClick="init()"> 
</form> 
</body> 
</html> 

El código anterior hace realmente acceder al archivo txtData.txt (siempre que exista) y vuelca en una <textarea> como el texto predeterminado. Por alguna razón, ninguna de las respuestas anteriores menciona que esto funciona, supongo que porque la pregunta parece implicar la etiqueta <src> específicamente (para una técnica similar puede no estar disponible; no he verificado); sin embargo, sigo pensando que vale la pena mencionar suponiendo que su consulta se relaciona con la cuestión más general de obtener un archivo .txt externo (o si alguien más encuentra esta página está buscando la respuesta de dicha pregunta), principalmente porque me tomó horas investigarlo , entonces creo que es plausible que la respuesta sea simplemente difícil de producir.

+0

Tiene razón, mi pregunta refleja un problema más general, y el uso de 'iframe' es un enfoque interesante (aunque no funciona en Chrome para archivos locales, y normalmente está sujeto a restricciones de origen cruzado, de manera efectiva , es como "luz Ajax" con incrustación de HTML). La asignación a 'extText' es el código más esencial aquí: para obtener el contenido de texto, el resto depende de lo que queremos hacer con él. –

Cuestiones relacionadas