高性能JS 非阻塞方式下载 JavaScript 用 XHR 对象下载代码,并注入到页面中

XMLHttpRequest Script Injection XHR
另一个以非阻塞方式获得脚本的方法是使用 XMLHttpRequest(XHR)对象将脚本注入到页面中。此技术
首先创建一个 XHR 对象,然后下载 JavaScript 文件,接着用一个动态<script>元素将 JavaScript 代码注入页
面。下面是一个简单的例子:
var xhr = new XMLHttpRequest();
xhr.open("get", "file1.js", true);
xhr.onreadystatechange = function(){
if (xhr.readyState == 4){
if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
var script = document.createElement ("script");
script.type = "text/javascript";
script.text = xhr.responseText;
document.body.appendChild(script);
}
}
};
xhr.send(null);
此代码向服务器发送一个获取 file1.js 文件的 GET 请求。onreadystatechange 事件处理函数检查 readyState
是不是 4,然后检查 HTTP 状态码是不是有效(2XX 表示有效的回应,304 表示一个缓存响应)。如果收
到了一个有效的响应,那么就创建一个新的<script>元素,将它的文本属性设置为从服务器接收到的
responseText 字符串。这样做实际上会创建一个带有内联代码的<script>元素。一旦新<script>元素被添加到
文档,代码将被执行,并准备使用。
这种方法的主要优点是,你可以下载不立即执行的 JavaScript 代码。由于代码返回在<script>标签之外(换
句话说不受<script>标签约束),它下载后不会自动执行,这使得你可以推迟执行,直到一切都准备好了。
另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。
此方法最主要的限制是:JavaScript 文件必须与页面放置在同一个域内,不能从 CDNs 下载(CDN 指“内
容投递网络(Content Delivery Network)”,前面 002 篇《成组脚本》一节提到)。正因为这个原因,大型
网页通常不采用 XHR 脚本注入技术。 
引用自高性能JS
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用JavaScript调用扫描仪并将扫描结果传递给Java后台的完整示例代码: ```html <!DOCTYPE html> <html> <head> <title>扫描仪示例</title> </head> <body> <h1>扫描仪示例</h1> <button id="scanButton">开始扫描</button> <script> // 获取按钮元素 const scanButton = document.getElementById('scanButton'); // 点击按钮时调用扫描函数 scanButton.addEventListener('click', function() { scanDocument(); }); // 扫描函数 function scanDocument() { // 使用getUserMedia获取媒体流 navigator.mediaDevices.getUserMedia({ video: true }) .then(function(stream) { const video = document.createElement('video'); video.srcObject = stream; video.play(); // 创建canvas用于显示扫描结果 const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); // 在canvas上绘制视频帧 function drawVideoFrame() { context.drawImage(video, 0, 0, canvas.width, canvas.height); requestAnimationFrame(drawVideoFrame); } // 开始绘制视频帧 requestAnimationFrame(drawVideoFrame); // 在canvas上点击时进行扫描 canvas.addEventListener('click', function() { // 在canvas上绘制的内容即为扫描结果 const imageURI = canvas.toDataURL('image/png'); // 将扫描结果传递给后台 sendScanResult(imageURI); }); // 将canvas添加到页面显示 document.body.appendChild(canvas); }) .catch(function(error) { console.log('无法访问摄像头:', error); }); } // 将扫描结果传递给后台 function sendScanResult(imageURI) { const xhr = new XMLHttpRequest(); xhr.open('POST', '/your-endpoint', true); xhr.setRequestHeader('Content-Type', 'application/json'); // 创建要发送给后台的数据对象,包含扫描结果的图像数据 const data = { scanResult: imageURI }; // 将数据转换为JSON字符串 const jsonData = JSON.stringify(data); // 发送请求 xhr.send(jsonData); // 监听请求完成事件 xhr.onload = function() { if (xhr.status === 200) { console.log('扫描结果已发送至后台'); } else { console.log('发送请求失败'); } }; } </script> </body> </html> ``` 在上述代码,我们创建了一个简单的HTML页面,并通过JavaScript实现了以下功能: 1. 点击"开始扫描"按钮后,调用`scanDocument()`函数。 2. `scanDocument()`函数使用`getUserMedia()`方法获取摄像头的媒体流,并将视频显示在页面上的canvas元素。 3. 在canvas上点击时,调用`sendScanResult()`函数将扫描结果发送给后台。 4. `sendScanResult()`函数使用XMLHttpRequest对象发送POST请求,将扫描结果作为图像数据发送给后台接口。 请根据你的具体需求和后台接口进行适当修改。记得将`/your-endpoint`替换为你的后台接口的URL。同时,确保你的项目在HTTPS环境下运行,以便在浏览器访问摄像头。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值