2012-10-06 38 views
18

當使用<script type="text/plain" src="http://..."></script>,其中的URL是一個純文本文件,有沒有一種方法可以訪問JavaScript中的文件的內容?該文件被傳輸到瀏覽器,但script元素的innerHTML屬性的值未更改(它仍爲空字符串)。檢查DOM中的元素節點似乎並未透露可以找到收到內容的任何屬性。如何在JavaScript中訪問通過<script type =「text/plain」src = ...>檢索的純文本內容?

我知道可以使用XMLHTTPRequest來代替,但我對瀏覽器以我描述的方式獲取數據的原因感興趣,但似乎沒有提供任何訪問權限。

+0

我假設你正在等待所有的內容加載,然後嘗試 – Mutahhir

+0

我猜測瀏覽器不打擾保持內容*(除了可能在瀏覽器的緩存一段時間)*。一旦腳本被評估過,源碼就不再需要了,所以這隻會浪費內存。 –

+1

有趣的是,Chromium甚至懶得下載外部腳本資源,其中type屬性是任何MIME類型,不能被解釋爲這裏列出的腳本[http://www.w3.org/TR/html5/the-script-element .html#scriptingLanguages]然後我想知道爲什麼所有這些[[http://www.w3.org/TR/html5/the-script-element.html#the-script-block-s-source] – toofast1227

回答

10

首先,HTMLScriptElementtext屬性是訪問內聯<script>元素的文本的首選方法。 DOM-Level-2HTML5: 4.11.1都表明,一個腳本應該有一個包含腳本內部文本屬性text

的IDL屬性text必須返回屬於script的孩子的所有文本節點的內容串聯元素(忽略任何其他節點,如註釋或元素),按樹形順序排列。在設置時,它的行爲必須與textContent IDL屬性相同。

由於<script>元素爲空(你指定的外部源),texttextContentinnerHTML是空的。這是因爲text屬性在內嵌腳本只設置:

如果腳本內聯和腳本塊的類型是基於文本的語言:

text IDL屬性的值在該元素的「已啓動」標誌上次設置的時間是腳本源。

所以這是不可能用這種方法包括外部text/plain

參見:

  • W3C: HTML5: 4.11.1 The script element: text attribute和遊戲圖的實例:
    <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

這聽起來很有說服力。它不能證明沒有辦法訪問加載的內容,但它很可能。正如@toofast所言,Chrome甚至不會加載它。 –

0

是的,不,我不認爲你可以得到這樣的文字內容。這主要是因爲您將使用dom訪問元素來獲取一些從未真正注入dom本身的文本。

我試了幾個選項,他們沒有工作。我沒有堅實的理由說明你爲什麼找不到它,但是我放棄這個想法的原因是因爲即使我使用的WebKit檢查器沒有三角形公開在script-src標籤旁邊。它的功能是將src轉換成一個鏈接,然後使用Ajax或其他方式從服務器讀取文本。

6

需要注意的是,如果這是支持的,這將提供一個巨大的安全漏洞,一種避免跨站點腳本保護的方法,可以保護json和其他數據。本質上,我討厭的網頁(nasty.com,說)可以通過使用腳本標記加載它來訪問受Cookie保護的私人數據。例如

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

因爲餅乾的supersecure.com將自動與請求發送(如請求任何資源時的情況),安全站點只是返回的數據(如私人文檔的列表),因爲它couldn除了來自其合法網頁的ajax請求之外,不會輕易地將請求分開。這個漏洞與ajax不存在,因爲瀏覽器只會阻止nasty.com的頁面向supersecure.com發出ajax請求,這要歸功於相同的源策略。

很明顯,內聯數據沒有安全問題。

3

後研究同一個問題的幾天,我發現下面的代碼多次提到:

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

上面的代碼不會實際訪問txtData.txt文件(只要它存在),它轉儲成<textarea>作爲默認文本。由於某種原因,上述答覆都沒有提到這是有效的,因爲這個問題似乎暗示了<src>標籤的具體含義(對於類似的技術可能不可用;我沒有檢查過);不過,我仍然認爲值得一提的是,假設您的查詢需要獲取外部.txt文件的更一般問題(或者如果有人遇到此頁面正在尋找問題的答案),主要是因爲我花了數小時研究它,所以我相信答案很難產生,這是合理的。

+0

你是對的,我的問題反映了一個更普遍的問題,並且使用iframe是一個有趣的方法(儘管它在Chrome中不適用於本地文件,並且通常受到跨源限制 - 有效,就像使用HTML嵌入的「Ajax light」)。 「extText」的分配是這裏最重要的代碼,用於獲取文本內容,其餘部分取決於我們想要處理的內容。 –

相關問題