2012-10-06 9 views
18

Quando si utilizza <script type="text/plain" src="http://..."></script>, dove l'URL fa riferimento a un file di testo normale, esiste un modo per accedere al contenuto del file in JavaScript? Il file viene trasferito nel browser, ma il valore della proprietà innerHTML dell'elemento script non viene modificato (rimane la stringa vuota). Ispezionare il nodo dell'elemento nel DOM non sembra rivelare alcuna proprietà attraverso la quale il contenuto ricevuto possa essere trovato.Come accedere al contenuto di testo semplice richiamato tramite <script type = "text/plain" src = ...> in JavaScript?

So che XMLHTTPRequest può essere utilizzato al posto, ma sono interessato al problema perché i browser recuperano i dati nel modo in cui ho descritto ma non sembrano offrire alcun accesso ad essi.

+0

Suppongo che tu stia aspettando correttamente per tutto il contenuto da caricare e quindi provando – Mutahhir

+0

Direi che i browser non si preoccupano di mantenere il contenuto * (tranne forse nella cache del browser per un po ') *. Una volta che lo script è stato valutato, la fonte non è più necessaria, quindi sarebbe solo sprecare memoria. –

+1

È interessante notare che Chromium non si preoccupa nemmeno di scaricare risorse di script esterne con l'attributo type come qualsiasi tipo MIME da non interpretare come script come elencato qui [http://www.w3.org/TR/html5/the-script-element .html # scriptingLanguages] allora mi chiedo perché tutto questo [http://www.w3.org/TR/html5/the-script-element.html#the-script-block-s-source] – toofast1227

risposta

10

Prima di tutto, l'attributo text di HTMLScriptElement è il metodo preferito per accedere al testo di un elemento in linea <script>. DOM-Level-2 e HTML5: 4.11.1 sia indicare che uno script dovrebbe avere un attributo text che contiene gli script interni testo:

L'IDL attributiva dei text deve restituire una concatenazione dei contenuti di tutti i nodi di testo che sono figli del script elemento (ignorando qualsiasi altro nodo come commenti o elementi), nell'ordine dell'albero. All'impostazione, deve agire allo stesso modo dell'attributo IDL textContent.

Poiché l'elemento <script> è vuota (specificato una fonte esterna), text, textContent e innerHTML sono vuoti. Questo perché l'attributo text è impostato solo negli script in linea:

Se lo script è in linea e il tipo di blocco di script è un linguaggio basato su testo:

Il valore dell'attributo text IDL a il momento in cui il flag "già avviato" dell'elemento è stato impostato per ultimo è la fonte dello script.

quindi non è possibile includere un esterno text/plain utilizzando questo metodo.

Consulta anche:

  • W3C: HTML5: 4.11.1 The script element: text attribute e l'esempio per la mappa di gioco:
    <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

Sembra convincente. Non dimostra che non ci sia modo di accedere al contenuto caricato, ma lo rende molto probabile. E come @toofast menziona, Chrome non lo carica nemmeno. –

0

Sì, no, non penso che si possa ottenere il contenuto del testo in questo modo. È principalmente perché utilizzerai gli elementi di accesso dom per ottenere del testo che non è mai stato realmente inserito nella dom stessa.

Ho provato alcune opzioni e non hanno funzionato. Non ho una solida ragione per cui non sarai in grado di trovarlo, ma il motivo per cui mi sto arrendendo/pensando in questo modo è perché anche l'ispettore WebKit che sto usando non ha una rivelazione a triangolo accanto a un tag script-src. Quello che fa è che converte l'src in un link su cui puoi cliccare e poi usa Ajax o qualsiasi altra cosa per leggere quel testo dal server.

6

Si noti che se questo fosse supportata, fornirebbe un enorme buco di sicurezza e un mezzo per aggirare protezioni cross-site scripting che proteggono json e altri dati. In sostanza, la mia brutta pagina web (nasty.com, ad esempio) potrebbe accedere ai tuoi dati privati ​​che sono protetti dai cookie caricandoli tramite un tag script. per esempio.

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

Dal momento che i biscotti per supersecure.com verrà automaticamente inviato con la richiesta (come è il caso in cui la richiesta di eventuali risorse), il sito protetto solo restituisce i dati (ad esempio, l'elenco dei documenti privati) poiché couldn Puoi facilmente distinguere la richiesta da una richiesta ajax dalla sua legittima pagina web. Questo buco non esiste con Ajax, dal momento che il browser impedisce semplicemente a una pagina di nasty.com di effettuare una richiesta Ajax su supersecure.com, grazie alla stessa politica di origine.

Ovviamente, non ci sono problemi di sicurezza con i dati in linea.

3

Dopo diversi giorni di ricerca la stessa domanda, ho trovato diversi riferimenti al seguente codice:

<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> 

Il codice di cui sopra non realmente accedere al file txtData.txt (a condizione che esista) e discariche in una <textarea> come testo predefinito. Per qualche ragione, nessuna delle suddette risposte menziona che funziona, presumo perché la domanda sembra implicare il tag <src> in modo specifico (per una tecnica simile potrebbe non essere disponibile, non ho controllato); tuttavia, continuo a pensare che valga la pena di supporre che la tua query pretenda la questione più generale di ottenere un file .txt esterno (o se qualcun altro che si imbatte in questa pagina sta cercando l'anwser di detta domanda), soprattutto perché mi ci sono volute delle ore per cercarlo , quindi credo sia plausibile che la risposta fosse semplicemente difficile da produrre.

+0

Hai ragione, la mia domanda riflette un problema più generale e l'uso di "iframe" è un approccio interessante a questo (sebbene non funzioni in Chrome per i file locali, ed è normalmente soggetto a restrizioni di origine incrociata - efficacemente , è come "Ajax light" con l'incorporamento HTML). L'assegnazione a 'extText' è il codice più essenziale qui - per ottenere il contenuto del testo, il resto dipende da cosa vogliamo fare con esso. –

Problemi correlati