使用<script type="text/plain" src="http://..."></script>
时,URL指的是纯文本文件,有没有办法在JavaScript中访问文件的内容?该文件将传输到浏览器,但innerHTML
元素的script
属性值不会更改(它仍为空字符串)。检查DOM中的元素节点似乎并未显示可以通过其找到所接收内容的任何属性。
我知道可以使用XMLHTTPRequest,但我对浏览器以我描述的方式获取数据但似乎无法提供任何访问权限的问题感兴趣。
答案 0 :(得分:10)
首先,text
的{{1}}属性是访问内联HTMLScriptElement
元素文本的首选方法。 DOM-Level-2和HTML5: 4.11.1都表示脚本应具有属性<script>
,其中包含内部脚本 text :
IDL属性
text
必须以树的顺序返回所有Text节点内容的串联,这些节点是text
元素的子节点(忽略任何其他节点,如注释或元素)。在设置时,它的行为必须与script
IDL属性相同。
由于textContent
元素为空(您指定了外部来源),<script>
,text
和textContent
为空。这是因为innerHTML
属性仅在内联脚本中设置:
如果脚本是内联的,并且脚本块的类型是基于文本的语言:
上次设置元素“已启动”标志时
text
IDL属性的值是脚本源。
因此,使用此方法无法包含外部text
。
另见:
text/plain
答案 1 :(得分:6)
请注意,如果支持此功能,则会提供巨大的安全漏洞,以及绕过保护json和其他数据的跨站点脚本保护的方法。从本质上讲,我讨厌的网页(比如nasty.com)可以通过使用脚本标记加载来访问受cookie保护的私人数据。 e.g。
<script type="text/plain"
src="https://supersecure.com/youraccount/privatedocs/list"/>
由于supersecure.com的cookie会自动与请求一起发送(请求任何资源时),安全站点只返回数据(例如私人文档列表),因为它无法轻易说明除了来自其合法网页的ajax请求之外的请求。这个漏洞与ajax不存在,因为浏览器只会阻止nasty.com的页面向supersecure.com发出ajax请求,这要归功于相同的原始策略。
显然,内联数据没有安全问题。
答案 2 :(得分:4)
经过几天研究同样的问题,我发现了几个对以下代码的引用:
<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文件的更普遍的问题(或者如果遇到此页面的任何其他人正在寻求所述问题的答案),主要是因为我花了几个小时研究它,所以我认为答案很难产生,这似乎是合理的。
答案 3 :(得分:0)
是的,不,我认为你不能得到那样的文字内容。这主要是因为你要使用dom访问元素来获取一些从未真正注入dom本身的文本。
我尝试了一些选项而且没有用。我没有充分的理由说明你无法找到它,但我放弃/想这样的原因是因为即使是我正在使用的WebKit检查员也没有三角形披露在script-src标记旁边。它的作用是将src转换为可以单击的链接,然后使用Ajax或其他任何内容从服务器读取该文本。