文/玄魂

目录

node-webkit教程(10)Platform Service之File dialogs

前言

10.1  File dialogs简介

10.2  打开一个文件对话框

10.3 多文件选择对话框

10.4  文件类型过滤

10.5  选择文件夹

10.6  保存文件对话框

10.7  FileList

10.8 指定默认路径

10.9 小结

前言

几个月前,要开发一个简易的展示应用,要求支持离线播放(桌面应用)和在线播放(web应用)。

当时第一想到的是flex,同一套代码(或者只需少量的更改)就可以同时运行在桌面和浏览器上。由于很多展现效果要全新开发,我想到了impress.js(https://github.com/bartaz/impress.js/)。如果选择impress.js,就意味着要将html5作为桌面应用,当时想到要封装webkit,但是本人对这方面也不是很熟悉,时间也很有限,就又沿着这个方向搜索,找到了node-webkit(https://github.com/rogerwang/node-webkit)。

node-webkit解决了我通过htmljs来编写桌面应用的难题

至于node-webkit的定义,按照作者的说法:

“ 基于node.js和chromium的应用程序实时运行环境,可运行通过HTML(5)、CSS(3)、Javascript来编写的本地应用程序。node.js和webkit的结合体,webkit提供DOM操作,node.js提供本地化操作;且将二者的context完全整合,可在HTML代码中直接使用node.js的API。”

从本篇文章开始,为您介绍Platform Services些列的API,本系列由以下类别:

·             App – 每个应用运行时全局api

·             Clipboard – 剪贴板

·             Tray – 状态栏图标,消息通知

·             File dialogs-文件选择对话框

·             Shell – 桌面相关

·             Handling files and arguments-处理文件和相关参数

10.1  File dialogs简介

文件操作是桌面应用最常使用的功能之一,相应的打开或保存文件的文件对话框也是最常用的组件之一。

在html中,我们可以通过

<input type='file' />

去打开文件对话框,上传文件到服务端。但是html中的文件对话框对于桌面应用来说,显然是不够的,没有办法知道文件的来源,不能保存文件到本地等。

node-wekit对html的文件对话框做了扩展,本文将对这些特性做详细的说明。下面创建示例应用。

新建dialog.html 和package.json作为本文的示例程序的原型。

dialog.html内容如下:

<html>

<head>

<title>dialogDemo</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body >

<h1>dialog 测试</h1>

<script>

// Load native UI library

var gui = require('nw.gui');

var win = gui.Window.get();

</script>

</body>

</html>

package.json内容如下:

{

"name": "dialog-demo",

"main": "dialog.html",

"nodejs":true,

"window": {

"title": "dialogDemo",

"toolbar": true,

"width": 800,

"height": 600,

"resizable":true,

"show_in_taskbar":true,

"frame":true,

"kiosk":false,

"icon": "2655716405282662783.png"

},

"webkit":{

"plugin":true

}

}

10.2  打开一个文件对话框

修改dialog.html如下:

<html>

<head>

<title>dialogDemo</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

</head>

<body >

<h1>dialog 测试</h1>

<input id="fileDialog" type="file" />

<script>

var chooser = document.querySelector('#fileDialog');

chooser.addEventListener("change", function (evt) {

apendText(this.value);

}, false);

function apendText(text) {

var element = document.createElement('div');

element.appendChild(document.createTextNode(text));

document.body.appendChild(element);

}

</script>

</body>

</html>

首先,在代码中添加了“file”类型的input标签。

<input id="fileDialog" type="file" />

这就是一个普通的文件选择框,在script中,我们添加对改选择框的选择文件之后的事件监听代码,获取选择文件的路径。

var chooser = document.querySelector('#fileDialog');

chooser.addEventListener("change", function (evt) {

apendText(this.value);

}, false);

运行效果如下:

10.3 多文件选择对话框

若要支持文件选择框支持多文件,只需要在input标签内添加“multiple ”属性即可,这是html5支持的属性。

<input id="fileDialog" type="file" multiple />

此时input的value值为所有文件的路径,以分号分隔。运行效果如下:

10.4  文件类型过滤

使用accept属性来过滤需要的文件类型,如:

<input id="fileDialog" type="file" multiple accept=".html"/>

10.5  选择文件夹

选择文件夹,而不是文件,在桌面应用中更有用,因为我们可以通过后端程序(node.js)进行文件遍历。

使用nwdirectory属性,可以是input支持选择文件夹。

<input id="fileDialog" type="file" nwdirectory />

运行效果如下:

10.6  保存文件对话框

当我们想要把某些内容保存到文档,保存文件对话框就十分重要了,当然这也是传统浏览器应用不具备的功能。

使用nwsaveas  属性可以启动保存文件对话框。

<input id="fileDialog" type="file" nwsaveas />

运行结果如下:

可以设置默认文件名,如:

<input id="fileDialog" type="file" nwsaveas="aa.txt"/>

10.7  FileList

在前面我们通过input标签的value属性获取选择的文件,Html5提供了files 属性,可以遍历文件。

修改示例程序的script,如下:

<script>

var chooser = document.querySelector('#fileDialog');

chooser.addEventListener("change", function (evt) {

var files = this.files;

for (var i = 0; i < files.length; ++i)

apendText(files[i].name);

}, false);

function apendText(text) {

var element = document.createElement('div');

element.appendChild(document.createTextNode(text));

document.body.appendChild(element);

}

</script>

运行结果如下:

在上图中,我们看到程序输出了选择的文件名,但是并没有完整的路径。node-webkit,扩展了一个名为path的属性,通过这个属性,可以获取完整的文件路径。继续修改代码:

for (var i = 0; i < files.length; ++i)

apendText(files[i].path);

运行结果如下:

10.8 指定默认路径

很多时候,我们需要引导用户从指定的目录打开或者保存文件,比如用户的文档目录,通过nwworkingdir属性可以完成这一需求。

修改input标签如下:

<input id="fileDialog" type="file"  nwworkingdir="D:\xuanhunfile" />

在应用中打开文件对话框,会从指定目录开始。

10.9 小结

本文内容主要参考node-webkit的官方英文文档,做了适当的调整(https://github.com/rogerwang/node-webkit/wiki/File-dialogs)。

下一篇文章,介绍shell。

鄙视不标明出处的转载,更多相关内容,欢迎访问玄魂的博客(www.xuanhun521.com)

更多相关内容,欢迎访问玄魂的博客(更多node-webkit相关内容 http://www.xuanhun521.com/Blog/Tag/node-webkit)

ps:nw.js,electron交流群 313717550

node-webkit教程(10)Platform Service之File dialogs的更多相关文章

  1. node-webkit教程(11)Platform Service之shell

    node-webkit教程(11)Platform Service之shell 文/玄魂 目录 node-webkit教程(10)Platform Service之shell 前言 11.1  She ...

  2. node-webkit教程(8)Platform Service之Clipboard

    node-webkit教程(8)Platform Service之Clipboard 文/玄魂 目录 node-webkit教程(8)Platform Service之Clipboard 前言 8.1 ...

  3. node-webkit教程(7)Platform Service之APP

    node-webkit教程(7)Platform Service之APP 文/玄魂 前言 几个月前,要开发一个简易的展示应用,要求支持离线播放(桌面应用)和在线播放(web应用). 当时第一想到的是f ...

  4. Node入门教程(10)第八章:Node 的事件处理

    Node中大量运用了事件回调,所以Node对事件做了单独的封装.所有能触发事件的对象都是 EventEmitter 类的实例,所以上一篇我们提到的文件操作的可读流.可写流等都是继承了 EventEmi ...

  5. Service官方教程(10)Bound Service的生命周期函数

    Managing the Lifecycle of a Bound Service When a service is unbound from all clients, the Android sy ...

  6. 10+ 最佳的 Node.js 教程和实例

    如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用.API服务编写.投票问卷应用.人物投票APP.社交授权. Node.js on Raspberry Pi ...

  7. Node.js v0.10.31API手工-DNS

    原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...

  8. How to Find the Self Service Related File Location and Versions

     How to Find the Self Service Related File Location and Versions (文档 ID 781385.1) In this Document ...

  9. Linux pwn入门教程(10)——针对函数重定位流程的几种攻击

    作者:Tangerine@SAINTSEC 本系列的最后一篇 感谢各位看客的支持 感谢原作者的付出一直以来都有读者向笔者咨询教程系列问题,奈何该系列并非笔者所写[笔者仅为代发]且笔者功底薄弱,故无法解 ...

随机推荐

  1. git免密码pull,push

    执行git config --global credential.helper store

  2. linq to entity中遇到的问题

    当使用 from m in _db.students从数据库中获取数据时,数据库中的数据类型和C#中的不同,所以可能会出错!先作_db.students.ToList()然后select

  3. WebForm---增删改(内置对象)

    一.添加 前台代码: <body> <form id="form1" runat="server"> <h1>用户添加< ...

  4. Mysql 与日期和时间相关的函数

    目录: 常用日期函数 时间加减函数 date_forma函数 1. 常用日期函数 now() current_timestamp() sysdate() 实例一: 从上图可以看出三个函数都是用来获取当 ...

  5. socket编程相关的结构体和字节序转换、IP、PORT转换函数

    注意:结构体之间不能直接进行强制转换, 必须先转换成指针类型才可以进行结构体间的类型转换, 这里需要明确的定义就是什么才叫强制转换. 强制转换是将内存中一段代码以另一种不同类型的方式进行解读, 因此转 ...

  6. CSS3 中的 rem 值与 px 之间的换算

    想给博客换个主题,到处找找不到满意的,最后发现默认主题 twentytwelve 越看越顺眼,于是就想动手改一下用. 看 CSS 文件的时候发现引入了一个新大小单位:rem,虽然 CSS 文件注释里有 ...

  7. php解析json数组

    function urltest(){ $url='http://121.43.153.80:8983/solr/collection1/select?q=+searchkey%3a%E4%BC%9A ...

  8. decimalFormat("#","##0.00") java

    importjava.text.DecimalFormat; publicclassTestNumberFormat{ publicstaticvoidmain(String[]args){ doub ...

  9. Selenium2+python自动化4-Pycharm使用

    前言 在写脚本之前,先要找个顺手的写脚本工具.python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里就不一一列举的,只要自己用着顺手就可以的, ...

  10. Codeforces Round #325 垫底纪念

    A. Alena's Schedule 间隔0长度为1被记录  1被记录  其余不记录 #include <iostream> #include <cstring> #incl ...