JavaScript不能读取script标签src文件内容

script标签

通常我们页面中创建script标签时要么src引入外部js文件

<script type="text/javascript" src="jquery-1.9.1.min.js"></script>

要么直接在标签内写内容:

<script type="text">
这里是script标签里的内容
</script>

script标签有一个属性type,默认值:text/javascript,例如你直接声明一个script标签,如果不声明type标签就默认为js文档。

<script>
	var a = 50;

</script>

<script type="text/javascript">

	alert(a); // 50

</script>

当然,你也可以指定它就是纯文本:

<script type="text">
	var a = 50;
</script>

<script type="text/javascript">
	alert(a); // 提示没有定义
</script>

因为第一个script标签type类型为text,浏览器自然就不会把标签里的内容当做js文档处理,也就不会声明a变量。

当然,如果的script标签type=text的时候,标签里无论写什么内容都不会报js语法错误:

<script>
这里是script标签内容,没有指定type=text,默认浏览器当做js文档来处理于是会报语法错误
</script>

声明为type=text类型,报错消失:

<script type="text">
这里是script标签内容,没有指定type=text,默认浏览器当做js文档来处理于是会报语法错误
</script>

 

通过DOM节点获取script内容

script理论上也是一个标签,既然是标签那我们就可以获取它的DOM节点:

即使是你声明的script标签type=text/javascript 类型,也能获取获取:

<script type="text/javascript">
// 这里是单行注释
/**
 * 这里是多行注释
 */
var name = "lizhong";
</script>

安全:不能获取src文件的内容

以上,我们都可以通过dom节点获取script的内容,但无法获取src指定文件的内容。比如:

<script type="text/javascript" src="a.js">
// 这里是单行注释
/**
 * 这里是多行注释
 */
var name = "lizhong";
</script>

a.js文件内容:

var dec = "这里是a.js文件内容";

执行:

我们发现居然还是打印页面上声明script时往里写的内容,即使我像正常情况声明script标签:

<script type="text/javascript" src="a.js"></script>

或者使用type=text类型:

<script type="text" src="a.js"></script>

结果还是获取不到a.js的内容:

然而有趣的是,FireFox的FireBug工具显示script标签里的内容就是src指定的文件内容

但你通过dom节点的innerHTML属性依然读到的内容只是在页面标签里实际写入的内容。

这就引发了一个问题:

假如要是能动态读取script标签src指向路径文件的内容,那么就会非常的不安全。这样,我就会轻易的获取到所有登录我站点用户电脑中的所有文件(至少文本文件的内容)。

如我生成这么一个标签,假定是window平台用户访问我站点,并且拥有D磁盘路径:

<script type="text" src="file:///D:/"></script>

它能把我D盘下所有文件目录都能获取到:

然后获取这个script节点内容,经过字符串正则处理读到一大堆文件名,得到文件名后就容易获取文件的内容了。

可惜,大多浏览器都堵住了这个漏洞,别做梦了!

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript可以通过使用第三方库或浏览器内置的API来读取Excel文件。其中,使用第三方库比较常见,比如使用js-xlsx库可以读取Excel文件中的数据。具体步骤如下: 1. 引入js-xlsx库 ``` <script src="https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js"></script> ``` 2. 读取Excel文件 ``` // 通过input元素获取文件对象 var file = document.getElementById('file').files[]; // 创建FileReader对象 var reader = new FileReader(); // 读取Excel文件 reader.readAsArrayBuffer(file); // 读取完成后的回调函数 reader.onload = function(e) { var data = new Uint8Array(reader.result); var workbook = XLSX.read(data, {type: 'array'}); var sheetName = workbook.SheetNames[]; var worksheet = workbook.Sheets[sheetName]; var jsonData = XLSX.utils.sheet_to_json(worksheet); console.log(jsonData); } ``` 以上代码中,通过input元素获取Excel文件对象,创建FileReader对象读取文件内容,使用js-xlsx库的API将Excel文件转换为JSON格式的数据,最后输出到控制台。 ### 回答2: JavaScript读取Excel文件可以使用第三方库js-xlsx或者使用原生的File API和XMLHttpRequest来实现。下面就分别介绍一下这两种方法。 一、使用js-xlsx库读取Excel文件 1. 安装js-xlsx库 可以通过npm安装js-xlsx库: ``` npm install xlsx ``` 或者在HTML中直接引入js-xlsx的CDN: ``` <script src="https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js"></script> ``` 2. 读取Excel文件 首先需要使用FileReader API读取Excel文件,然后将文件转换成二进制字符串,最后调用js-xlsx库进行解析: ``` <input type="file" id="fileInput" onchange="readFile()"> <script> function readFile() { var file = document.getElementById('fileInput').files[0]; var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, {type: 'binary'}); console.log(workbook); }; reader.readAsBinaryString(file); } </script> ``` 上述代码中使用了FileReader API将Excel文件转换成二进制字符串,并调用XLSX.read方法解析Excel文件。解析后的结果就是Workbook对象,包括Sheet等内容。 二、使用原生File API和XMLHttpRequest读取Excel文件 1. HTML代码 ``` <input type="file" id="fileInput" onchange="readFile()"> ``` 2. JavaScript代码 ``` <script> function readFile() { var file = document.getElementById('fileInput').files[0]; if (file) { var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/parseExcel'); xhr.send(formData); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log(xhr.responseText); } } } } </script> ``` 上述代码中,File API可以获取到选中的Excel文件,并使用FormData来上传文件。XMLHttpRequest从服务器获取处理后的Excel数据,并处理返回结果。 服务器端使用Node.js读取Excel文件的代码: ``` const express = require('express'); const app = express(); const XLSX = require('xlsx'); const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post('/parseExcel', function(req, res) { var file = req.files.file; var workbook = XLSX.readFile(file.path); var sheet = workbook.Sheets[workbook.SheetNames[0]]; var result = XLSX.utils.sheet_to_json(sheet); res.send(result); }); app.listen(3000, () => console.log('Example app listening on port 3000!')); ``` 上述代码中,Node.js通过读取文件路径的方式读取Excel文件,解析后将结果使用JSON格式返回给客户端。 以上就是JavaScript读取Excel文件的两种方法,开发者可以根据自身情况选择适合自己的方式。 ### 回答3: JavaScript可以通过第三方库或者内置API的方式读取excel文件。下面分别介绍两种方式。 第一种是通过第三方库读取,应用比较广泛的是SheetJS,它可以读取XLSX、CSV、JSON等格式的文件。示例代码如下: ```javascript // 引入SheetJS <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> // 读取excel文件 var file = document.querySelector("#excel-file").files[0]; // 获取上传的excel文件 var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = function(e) { var data = new Uint8Array(reader.result); var workbook = XLSX.read(data, { type: "array" }); var sheet = workbook.Sheets[workbook.SheetNames[0]]; // 读取第一个sheet var jsonData = XLSX.utils.sheet_to_json(sheet); // 将sheet转化为json格式 console.log(jsonData); // 输出json数据 }; ``` 第二种是通过内置API的方式读取,主要是File API和FileReader API,示例代码如下: ```javascript // 读取excel文件 var file = document.querySelector("#excel-file").files[0]; // 获取上传的excel文件 var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(e) { var url = e.target.result; var xhr = new XMLHttpRequest(); xhr.open("GET", url); xhr.responseType = "blob"; // 返回二进制数据 xhr.onload = function() { var blob = xhr.response; var workbook = XLSX.read(blob, { type: "binary" }); var sheet = workbook.Sheets[workbook.SheetNames[0]]; // 读取第一个sheet var jsonData = XLSX.utils.sheet_to_json(sheet); // 将sheet转化为json格式 console.log(jsonData); // 输出json数据 }; xhr.send(); }; ``` 需要注意的是,读取excel文件需要注意浏览器的兼容性,IE浏览器需要引入ActiveX控件,同时存在跨域访问的问题,需要设置相应的HTTP头部。另外,读取文件可能会占用过多的内存和CPU,需要特别注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值