1. js文件导出功能
就像正常的下载文件一样。把服务的js文件下载下来,然后在本地浏览器执行。
另外你需要补充一下浏览器加载、解析、渲染的一些知识。复制一下我之前整理的笔记。
浏览器加载
加载过程 当浏览器获得一个html文件时,会”自上而下“加载,并在加载过程中进行解析渲染。 加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。 遇到图片资源,浏览器也会另外发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。 但是当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。
加载外联js和css的阻塞情况
一个不太严谨但方便记忆的口诀:
JS 全阻塞,CSS 半阻塞
JS 会阻塞后续 DOM 解析以及其它资源(如 CSS,JS 或图片资源)的加载。
CSS不阻塞DOM的加载和解析(它只阻塞DOM的渲染呈现。这里谈加载),不会阻塞其它资源(如图片)的加载,但是会阻塞 后续JS 文件的执行(原因之一是,js执行代码可能会依赖到css样式。css只阻塞执行而不阻塞js的加载)。
鉴于上面的特性,当css后面存在js的时候,css会间接地阻塞js后面资源的加载(css阻塞js,js阻塞其他资源 )。
现代浏览器会进行 prefetch 优化,浏览器在获得 html 文档之后会对页面上引用的资源进行提前下载
外联js文件使用defer属性和asyn可以达到异步非阻塞加载的效果,由于现代浏览器都存在 prefetch,所以 defer, async 可能并没有太多的用途,可以作为了解扩展知识,仅仅将脚本文件放到 body 底部(但还是在之前)就可以起到很不错的优化效果(遵循先解析再渲染再执行script这个顺序)。当把js放在最后的时候,其实浏览器将自动忽略标签,从而自动在最后的最后补上。
浏览器解析
1、浏览器通过请求的 URL 进行域名解析,向服务器发起请求,接收文件(HTML、CSS、JS、Images等等)。
2、HTML 文件加载后,开始构建 DOM Tree(DOM树)
3、CSS 样式文件加载后,开始解析和构建 CSS Rule Tree
4、Javascript 脚本文件加载后, 通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree
浏览器渲染
1、浏览器引擎通过 DOM Tree 和 CSS Rule Tree 构建 Rendering Tree(渲染树)
2、布局阶段——在屏幕上绘制渲染树中的所有节点的几何属性,比如: 位置,宽高,大小等等,这个过程称为 Flow 或 Layout 。
3、绘制元素——绘制所有节点的可视属性。
4、合并渲染层——把以上绘制的所有图层(类似于PhotoShop中的“图层”)合并,最终输出一张图片
其中的阶段3、4可称之为Paint
Repaint和Reflow
当用户在浏览网页时进行交互或通过 js 脚本改变页面结构时,以上的部分操作有可能重复运行,此过程称为 Repaint 或 Reflow。
Repaint
当元素改变的时候,将不会影响元素在页面当中的位置(比如 background-color, border-color, visibility),浏览器仅仅会应用新的样式重绘此元素,此过程称为 Repaint。
Reflow
当元素改变的时候,将会影响文档内容或结构,或元素位置,此过程称为 Reflow。( HTML 使用的是 flow based layout ,也就是流式布局,所以,如果某元件的几何尺寸发生了变化,需要重新布局,也就叫 Reflow。)
Reflow 的成本比 Repaint 的成本高得多的多。我们应当尽量避免Reflow。
如何优化浏览器渲染过程
1、创建有效的 HTML 和 CSS ,不要忘记指定文档编码,比如。
2、CSS 样式应该包含在 中, Javascript 脚本出现在末尾。
3、减少 CSS 嵌套层级和选择适当的选择器,可参考 如何提升 CSS 选择器性能。
4、不要通过 JS 逐条修改 DOM 的样式,提前定义好 CSS 的 Class 进行操作。
5、尽量减少将 DOM 节点属性值放在循环当中,会导致大量读写此属性值。
6、尽可能的为产生动画的 HTML 元素使用 fixed 或 absolute 的 position ,那么修改他们的 CSS 是不会 Reflow 的。
2. js文件导出功能无效
1、切换IE内核
由于一些效果渲染的原因,现在的主流网站都是基于webkit内核设计的。在一些网站上限制文字复制的代码在IE浏览器并不能顺利执行。利用这个原理,我们可以将无法复制文字的网址复制粘贴到ie浏览器里面尝试一下,说不准会有意外的惊喜。
2、使用JavaScript代码解除限制
限制复制网文字的实现方法大多都是通过Javascript代码来实现的,也可以利用Javascript代码来解除限制。
在浏览器地址栏中输入: javascript:void($={}); 然后按回车键,然后网页上的内容就任由你复制啦,注意要手动输入,复制无效哦。如果输入后还是无效的话,可以先将这个网页按F5键刷新一下,再在浏览器中输入上面的代码。
3、保存网页格式
将无法复制的网页保存在本地计算机也可以解除对网页文字的限制,具体操作方法为:
利用快捷键【Ctrl+S】保存当前网页,并且将保存类型选择这“网页 仅HTML”。然后双击打开刚刚保存的网页文件,你会发现上面的文字已经可以直接复制了。
4、审查元素
在Webkit内核的浏览中有一个非常好用的功能叫“审查元素”。通过这个功能可以查看加载到当前网页上的绝大多数内容。对于限制复制的文字也当然也不在话下。
在需要复制的文字上点右键,然后选择【审查元素】便可以看到网页的源代码并且定位到当前浏览的位置。在这里的所有文字都是以普通文本方式显示的,想怎么复制就怎么复制。
5、查看源代码
在使用上一种审查元素的方法时,有时会遇到网页把右键也屏蔽的情况,根本无法使用【审查元素】的方法。此时,只要按下快捷键【Ctrl+U】便可以查看该网页的源代码。尽管普通人根本看不懂这个源代码,但是再按下【Ctrl+F】的快捷键搜索一下你要在网页中复制的一小段内容,就可以快速定位到显示这些内容的代码段。接下来就可以直接复制你想要的内容了。
6、打印法
网页在打印预览模式下是不执行任何JS代码的,所以只要在网页上按下【Ctrl+P】进入打印预览模式,就可以在预览窗口随意的复制上面的文字了。
7、插件法
如果以上这几种方法都不能解决问题的话,建议使用专业的浏览器插件来完成这个工作。在浏览器上安装插件之后,今后遇到无法复制的内容时只要点一下这个插件就可以快速解除限制。这样的插件有很多,但是为了避免广告嫌疑,这里就不具体给出它的名称了。如有需要大家可以自行查找。
8、OCR识别
现在OCR识别技术已经非常成熟了,无论是手机还是电脑都能轻松完成这个操作。最简单的方法就是将无法复制的网页用手机拍照,然后通过手机QQ或者微信都可以完成图片文字的识别。只要是你拍的图片清晰度没有问题,一般都能准确识别上面的内容。
3. js导出excel文件
javascript才能完成的东西,确实在IE浏览器的js调用的ActiveX形成的前端,数据导出到excel,但这种方法在其他浏览器中是不常见的。
数据导出到Excel,最好的方法是,在服务端的Excel数据,然后发送到前端的负载。您可以使用脚本。JAVA生成的一些开源组件,支持Excel。
4. js 导出文件
1、首先启动pr软件。
2、启动完成之后,点击页面上面的新建项目。
3、为项目起一个名字,什么名字都可以,选择储存的位置,然后点击下方的确定。
4、接着在左下角的项目栏中,点击鼠标的右键,选择导入。
5、电脑的文件夹中找到想要导入的视频,然后点击确定,接着在项目中就可以看到导入的视频。
6、可以按照自己的需要,对视频进行一些处理,处理完成之后,点击文件,打开导出,在导出中选择媒体。
7、选择想要导出的格式,然后点击下方的导出,等待视频导出即可。
5. js导出excel文件前端插件
背景
在学习微信小程序的过程中,需要导出excel文件数据,可是却没有后台服务器,所以只能够想着使用纯前端去导出excel
使用插件:excel-export
导出思想
将数据封装成excel文件
将excel文件上传到云存储中
将云存储的excel文件以图片的格式下载到本地
修改图片文件后缀为xlsx,成为excel文件
操作
将数据封装成excel文件;将excel文件上传到云存储中
建立云函数(我的云函数名称:uploadexportfile),打开云函数终端,安装excel-export插件
// 云函数入口文件
const cloud = require('wx-server-sdk')
const nodeExcel = require('excel-export');
const path = require('path');
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
var tableMap = {
styleXmlFile:path.join(__dirname,"styles.xml"),
name: Date.now()+"-export",
cols: [],
rows: [],
}
var tableHead = ["编号", "名称", "生日", "年龄"];
//添加表头
for(var i=0;i<tableHead.length;i++){
tableMap.cols[tableMap.cols.length]={
caption:tableHead[i],
type:'string'
}
}
//表体:伪数据
const tableList = [
{编号:0,名称:'张三',生日:'2019-5-1',年龄:20},
{编号:1,名称:'李四',生日:'2019-5-1',年龄:45}
]
//添加每一行数据
for(var i=0;i<tableList.length;i++){
tableMap.rows[tableMap.rows.length]=[
tableList[i].编号,
tableList[i].名称,
tableList[i].生日,
tableList[i].年龄
]
}
//保存excelResult到相应位置
var excelResult = nodeExcel.execute(tableMap);
var filePath = "outputExcels";
var fileName = cloud.getWXContext().OPENID + "-" + Date.now()/1000 + '.xlsx';
//图片上传到云存储
return await cloud.uploadFile({
cloudPath: path.join(filePath, fileName),
fileContent: new Buffer(excelResult,'binary')
}).then(res=>{
console.log(res.fileID);
return res;
}).catch(err=>{
});
}
DOWNLOAD
//导出excel
function exportFile(dataHeader,dataList){
wx.showLoading({
title: '正在导出',
});
console.log(dataHeader);
console.log(dataList);
wx.cloud.callFunction({
name:'uploadexportfile',
data:{
dataHeader:dataHeader,
dataList:dataList
}
}).then(res=>{
const fileID = res.result.fileID;
//下载文件
wx.cloud.downloadFile({
fileID: fileID
}).then(res1 => {
this.saveFileToPhotosAlbum(res1);//保存文件到相册
this.delCloudFile(fileID);//删除云存储文件
}).catch(error => {
// handle error
})
}).catch(err1=>{
});
}
//保存文件到本地相册
function saveFileToPhotosAlbum(res){
//授权
this.writePhotosAlbumAuth();
// 保存文件
var saveTempPath = wx.env.USER_DATA_PATH + "/exportFile"+new Date().getTime()+".jpg";
wx.saveFile({
tempFilePath: res.tempFilePath,
filePath: saveTempPath ,
success:res1=> {
//获取了相册的访问权限,使用 wx.saveImageToPhotosAlbum 将图片保存到相册中
wx.saveImageToPhotosAlbum({
filePath: saveTempPath ,
success: res2 => {
//保存成功弹出提示,告知一下用户
wx.hideLoading();
wx.showModal({
title: '文件已保存到手机相册',
content: '文件位于tencent/MicroMsg/WeiXin下 \r\n将保存的文件重命名改为[ .xlsx ]后缀即可正常打开',
confirmColor: '#0bc183',
confirmText: '知道了',
showCancel: false
});
},
fail(err2) {
console.log(err2)
}
})
}
});
}
//删除云存储文件
function delCloudFile(fileID){
const fileIDs=[];
fileIDs.push(fileID);
//删除云存储中的excel文件
wx.cloud.deleteFile({
fileList: fileIDs,
success: res4 => {
// handle success
console.log(res.fileList);
},
fail: console.error
})
}
//上传单个文件
function uploadSingleFile(cloudPath,filePath){
wx.cloud.uploadFile({
cloudPath: cloudPath, // 上传至云端的路径
filePath: filePath, // 小程序临时文件路径
success: res => {
// 返回文件 ID
console.log(res.fileID)
},
fail: console.error
})
}
//微信图片保存到本地相册授权
function writePhotosAlbumAuth(){
wx.getSetting({
success(res) {
if (!res.authSetting['scope.writePhotosAlbum']) {
wx.authorize({
scope:'scope.writePhotosAlbum',
success() {
console.log('授权成功')
}
})
}
}
})
}
module.exports={
uploadSingleFile:uploadSingleFile,
exportFile:exportFile,
saveFileToPhotosAlbum:saveFileToPhotosAlbum,
delCloudFile:delCloudFile,
writePhotosAlbumAuth:writePhotosAlbumAuth
}
6. js导出函数
方法一:functionsaveCode(obj){varwinname=window.open('','_blank','top=10000')
;varstrHTML=document.all.tableExcel.innerHTML;winname.document.open('text/html','replace');winname.document.writeln(strHTML);winname.document.execCommand('saveas','','excel.xls');winname.close();
}方法二://Excel导出2/*
*如果javaScript报“Automation服务器不能创建对象”,则按下方解决。打开InternetExplorer“工具”菜单栏中的“选项”一栏,单击“安全”栏中的“自定义级别”选项卡,将第三项“对没有标记为安全的activex控件进行初始化和脚本运行”设置成“启用”即可。*/functionexportExecl(tableId){vartable=document.getElementById(tableId)
;varoXL=newActiveXObject("Excel.Application")
;varoWB=oXL.Workbooks.Add()
;varoSheet=oWB.ActiveSheet;varsel=document.body.createTextRange();sel.moveToElementText(table)
;sel.select();sel.execCommand("Copy");oSheet.P..
.方法一:functionsaveCode(obj){varwinname=window.open('','_blank','top=10000')
;varstrHTML=document.all.tableExcel.innerHTML;winname.document.open('text/html','replace')
;winname.document.writeln(strHTML)
;winname.document.execCommand('saveas','','excel.xls');winname.close();
}方法二://Excel导出2/*
*如果javaScript报“Automation服务器不能创建对象”,则按下方解决。打开InternetExplorer“工具”菜单栏中的“选项”一栏,单击“安全”栏中的“自定义级别”选项卡,将第三项“对没有标记为安全的activex控件进行初始化和脚本运行”设置成“启用”即可。*/functionexportExecl(tableId){vartable=document.getElementById(tableId)
;varoXL=newActiveXObject("Excel.Application")
;varoWB=oXL.Workbooks.Add()
;varoSheet=oWB.ActiveSheet;varsel=document.body.createTextRange();sel.moveToElementText(table)
;sel.select();sel.execCommand("Copy");oSheet.Paste();oXL.Visible=true;}这里的tableId为表格的id
7. js文件导入
可以通过npm安装的就安装,在通过Vue.use()插入到vue里使用;如果想单个页面使用的就在使用的.vue页面通过import导入并使用。
8. js导出设置文本格式
你好,把html转成PDF:
1.下载HTML2FPDF开源软件,将其放在你的网站根目录文件夹下,比如 /srv/httpd/htdocs/test/;
2.新建1.php文件,1.php中的代码如下:AddPage();// yourfile.html 你要转化的HTML文件$yourfile_html = "yourfile.html"// yourfile.pdf 转化成功后的pdf文件名$yourfile_pdf = "yourfile.pdf"$fp = fopen($yourfile_html,"r");$strContent = fread($fp, filesize($yourfile_html));fclose($fp);$pdf->WriteHTML($strContent);$pdf->Output($yourfile_pdf );echo "PDF 文件成功生成!";
3.将你要转化的yourfile.html文件也放在test目录下,随后在浏览器中访问1.php文件就可以把html文件转化成PDF文件了,
- 相关评论
- 我要评论
-