精通 JavaScript 作 Windows Store App 開發

Slides:



Advertisements
Similar presentations
第 15 章 Mobile PHP 與 Ajax 15-1 Mobile PHP 15-2 Ajax 的基礎 15-2 Ajax 的基礎 15-3 jQuery 的 Ajax 方法 15-3 jQuery 的 Ajax 方法 15-4 應用實例:關鍵字建議清單 15-4 應用實例:關鍵字建議清單.
Advertisements

— 高级软件人才实作培训专家 ! 北京传智播客教育 ajax 讲师:韩顺平 qq:
1 网站设计理念 大连理工大学创新实验学院 优秀网站展示 - LAMP 类网站
Web app和html5给前端带来的变化 —— 我们的html5游戏平台之旅.
具有梦天堂特色的 Web前端开发规范 叫我三桂吧 t.qq.com/aNd1coder.
第 4 章 PHP 基本語法.
事件驱动的移动数据中心 广州舜飞信息科技有限公司 谭荣棉.
浅析浏览器解析和渲染 偏右.
姓名: 钱琬婷 学号: 0501W238 专业: 计算机科学与技术 指导教师: 陈家琪 教授
汇报大纲 一、报送系统总体介绍 二、自查及检查评分报送流程 三、自查及检查方法及关键点 四、建议及注意事项.
Lua+wax在ios上的应用 白 衣.
JavaScript中常用的互動方式 認識簡單的交談與基本的運算.
第12讲 Javascript 复习 信息学院 孙辉.
第三讲 站点链接与表格布局.
Web程序设计基础 太原理工大学 计算机科学与技术学院 林福平 求实创新
王寧疆 資深講師 資策會數位教育研究所 MCPD/MCT/MVP
P303 HTML/DHTML/CSS/JavaScript 專業HTML網頁設計 陳錦輝.
第一讲 JavaScript编程基础 信息学院 周宝刚.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
《网页设计与制作》 教学课件 主讲人:湖南铁道职业技术学院 陈承欢
ES6简介.
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第三章 使用XMLHttpRequest对象
一、登录界面 (一)登录方式 1、访问广东工程咨询网 ( 动态里,“咨询师登记工作”专栏 2、 IE地址栏中直接键入管理系统 地址(
模块七 信息获取与发布 第8章 计算机网络信息的获取与发布.
Google 自訂搜尋 淡江大學資訊中心 專案發展組 朱家璁 2009/10/6.
Chapter14 HTML簡介與簡易網頁製作
Selenium经典教程 selenium教程.
DhtmlXGrid表格显示控件简介.
网络协会2017培训 恶补Web知识训练营 2017/4/7 – Payne.
第四組 停車場搜尋系統 第四組 溫允中 陳欣暉 蕭積遠 李雅俐.
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Ajax编程技术 第一章 Ajax简介.
MIT App Inventor簡介及 「Hello World」程式初體驗 靜宜大學資管系 楊子青
手機作業系統介紹.
Working with Databases (II) 靜宜大學資管系 楊子青
JavaScript 语言3 学习网站:心蕊设计
R教學 安裝RStudio 羅琪老師.
JavaScript 靜宜大學 資管系 楊子青.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
立即啟動!免費開發人員帳戶!! Windows Store / Windows Azure / Windows Phone
安裝JDK 安裝Eclipse Eclipse 中文化
網頁切換移轉 JS vs. ASP.NET.
DWR WEB开发交流 1、自我介绍 2、DWR概述 3、DWR DEMO介绍 4、DWR实现机制 5、DWR配置说明 6、JS开发注意事项.
复习 JavaScript && ES6 专题 (1) 2017/3/10 – Payne
Web Crack 专题 – AJAX – 2016/11/18 – Payne 本次培训仅供教学内部用途 实验请遵守相关法律法规
Android App簡介及 App Inventor 2體驗 靜宜大學資管系 楊子青
[作品名称] 方案计划书 [SaaS / Apps 名称: ] [提交人:公司名称、姓名、手机、邮箱 ]
網頁切換移轉 JS vs. ASP.NET.
張智星 台大資工系 多媒體檢索實驗室 第十二章 ASP基本介紹 張智星 台大資工系 多媒體檢索實驗室.
WEB统一检索本地整合技术 中国农业大学图书馆 康实.
App Inventor 2初體驗 靜宜大學資管系 楊子青
对ReactJs的认知.
Ajax编程技术 第六章 调试与错误处理.
HTML – 超連結與圖片 資訊教育.
網頁程式概論 建國科技大學資管系 饒瑞佶 2015/9 V1 2016/4 V2 2016/9 V3.
讓Emulator可以 使用Android Market
JavaScript Sunxiaoshen.
DEV342 Visual Basic 2005: 应用程序框架 和高级语言特性
第3章 JavaScript基本语句.
网 站 设 计 与 建 设 Website design and developments
利用 EditorConfig 自訂文字編輯器設定
JQuery 標籤操作 建國科技大學 資管系 饒瑞佶 2013/4 V1.
Dreamweaver 進階網頁製作 B 許天彰.
黑龙江省科学基金 项目验收填报培训 黑龙江省计算中心 2015年09月.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
店铺装修学习与实操.
Jquery Mobile開發須知 周季賢.
Develop and Build Drives by Visual C++ IDE
JavaScript 教师:魏小迪
Presentation transcript:

精通 JavaScript 作 Windows Store App 開發 DEV308 精通 JavaScript 作 Windows Store App 開發 蔡秉諺 Vexed 中華電信 Xuite

課程簡介 Windows Store App 支援以原先用於網頁前端開發的 HTML/CSS/JavaScript 技術來進行 app 的開發,這使得原先做網頁開發的開發人員得以使用既有的知識及技能來開發 Windows 8 Apps。 本課程將會介紹在使用 JavaScript 開發 Windows 8 Apps 時的細節,以及瞭解如何運用開發環境提供的 WinJS 函式庫來開發 Windows 8 Apps。

微軟跟你說 用 JavaScript 開發 Windows Store App 和開發網頁前端很像 很像 !== 一樣

不一樣 顧名思義 可以上 Windows Store 可以碰到系統底層 可以離線操作

不一樣 多 Windows 、 WinJS 、 MSApp 物件 少不適合 App 環境函式 適應 App 環境行為改變 Cross-Domain AJAX

Windows 物件 不是 window 物件 Windows Runtime API (WinRT API) C++ C# VB JavaScript 共通

Windows 物件 不夠用、自己寫 WinRT Component C++ C# VB

WinJS 物件 Windows Library for JavaScript 100% JavaScript 寫成 原始碼可以看、不能改 跟 jQuery YUI 一樣 原始碼可以看、不能改

WinJS 物件 base.js WinJS ui.js WinJS.UI 看原始碼、比看文件快 鎖 搜尋 註解

不用 WinJS 能寫 Windows Store App 嗎? 不用 jQuery 能寫網頁嗎? 能、但麻煩 WinJS 存在意義 拉近 Windows 物件與網頁前端開發距離

WinJS 能在 Windows Store App 外用嗎? base.js ui.js 開頭註解 This library is supported for use in Windows Store apps only. 原始碼找 hasWinRT 未使用 Windows 物件分出 為了 web context

少不適合 App 環境函式 不可開新視窗 無 alert、comfirm、prompt 無 open、moveBy、moveTo、resizeBy、resizeTo window.close() 中止 App 、例外使用 無 alert、comfirm、prompt Windows.UI.Popups.MessageDialog 替代 改變動線

替代 alert var md = new Windows.UI.Popups.MessageDialog('Hi'); md.showAsync().then(function() { // ... }); 關閉

替代 confirm var md = new Windows.UI.Popups.MessageDialog('Are you OK?'); md.commands.append(new Windows.UI.Popups.UICommand('Yes')); md.commands.append(new Windows.UI.Popups.UICommand('No')); md.showAsync().then(function (cmd) { console.log(cmd.label); });

替代 prompt 無直接方案 選項明確 Flyout 控制項 改變動線 Windows.UI.Popups.MessageDialog 同 confirm Flyout 控制項 無 Block UI

適應 App 環境行為改變 HTML and DOM API changes list <a > 的 href 、 target 屬性 innerHTML、document.write ... 安全機制 限制載入外部 JavaScript Cross-Domain AJAX

<a > 的 href 屬性 href="../a.html" 、 href="/b.html" App 內相對路徑、絕對路徑 href="ms-appx:///c.html" App 內絕對路徑 3 條斜線

為什麼 3 條斜線? <a href="ms-appx://a3001e40-c3bf-4ae9-b713-da500ca42135/c.html" > Package 名稱 package.appmanifest 可見 Package 名稱省略 <a href="ms-appx:///c.html" > ms-appx-web:/// 、 ms-appdata:///

外部連結 <a href="http://bing.com" >Bing</a> 跳離 App 、 Modern IE 開啟

<a > 的 target 屬性 target="_blank" 外部連結 跳離 App 、 Modern IE 開啟 App 內連結 JavaScript 錯誤 <a href="b.html" target="if" >b</a> <iframe name="if" src="a.html" ></iframe> 正常運作 有寫跟沒寫一樣

innerHTML、document.write ... 安全機制 elm.innerHTML = '<p onclick="void(0)" >!</p>'; JavaScript 錯誤 elm.innerHTML = '</link>'; elm.innerHTML = toStaticHTML('…'); Safe

限制載入外部 JavaScript <script src="http://a.cc/b.js"></script> 檔案下載、加入 App 內 <script src="js/b.js"></script>

Cross-Domain AJAX XMLHttpRequest WinJS.xhr WinJS.xhr({ url : 'a.txt' }).then(function() { // … }); App 內檔案

MSApp 物件 額外審查? 都不是好東西? WinJS 原始碼找 Unsafe MSApp.execUnsafeLocalFunction

MSApp.execUnsafeLocalFunction innerHTML、document.write ... 安全機制 elm.innerHTML = '<p onclick="void(0)" >!</p>'; JavaScript 錯誤 MSApp.execUnsafeLocalFunction(function() { elm.innerHTML = '<p onclick="void(0)" >!</p>'; }); Pass

App 中顯示外部網頁 <a href="http://bing.com" >Bing</a> 外部連結、跳離 App 、 Modern IE 開啟 <iframe src="http://bing.com" ></iframe> iframe 內 local context、外 web context <iframe src="a.html" ></iframe> iframe 內外 local context 外部網頁 App 內網頁

web context 與 Windows Store App 外幾乎相同 無 Windows 物件 WinJS 部分可用 無 innerHTML、document.write ... 安全機制 不限制載入外部 JavaScript AJAX 不可 Cross-Domain WinJS 原始碼找 hasWinRT

web context App 內網頁 web context 載入 local context 、 web context 溝通 <iframe src="ms-appx-web:///a.html" ></iframe> local context 、 web context 溝通 HTML5 postMessage()

Windows Store App 用 jQuery JavaScript 錯誤 限制載入外部 JavaScript 檔案下載、加入 App 內 <script src="http://code.jquery.com/jquery.min.js" ></script> <script src="js/jquery.min.js" ></script>

Windows Store App 用 jQuery 3 個 JavaScript 錯誤 jQuery 初始時觸犯 innerHTML、document.write ... 安全機制 原始碼找 改 jQuery.support = (function() { ... })(); jQuery.support = MSApp.execUnsafeLocalFunction(function() { ... });

Windows Store App 用 jQuery 待續 …

Windows Store App 用 Google Maps JavaScript API Google Map 放 map.html 裡 web context 載入 <script src="https://maps.googleapis.com/maps/api/js?sensor=false" ></script> <iframe src="ms-appx-web:///map.html" ></iframe>

ECMAScript 5 Windows Store App 、 IE10 支援 不普及原因 WinJS 原始碼 不普及原因 IE8 + Windows XP ECMAScript 5 compatibility table 兇

ECMAScript 5 可 JavaScript 模擬 需瀏覽器底層支援 Array.prototype.forEach Object.keys … 需瀏覽器底層支援 Object getter setter Object.defineProperty Strict Mode

Object getter setter on 、 off 屬性 只可讀、不可寫 var strings = { get on() { return WinJS.Resources._getWinJSString("ui/on").value; }, get off() { return WinJS.Resources._getWinJSString("ui/off").value; }, }; 沒有 JavaScript 錯誤 on 、 off 屬性 只可讀、不可寫 var v = 1, o = { get p() { return v; }, set p(x) { v += x; } }; o.p = 2; console.log(o.p); // 3

Object.defineProperty Object.defineProperty(element, "winBindingToken", { configurable: false, writable: false, enumerable: false, value: bindingToken } ); configurable 、 writable 、 enumerable 以前存在、看不到、碰不到

Strict Mode "use strict"; Visual Studio 2012 自動加上 strict 模式 (JavaScript) @ MSDN arguments.callee 不能用 block 中不可宣告函式 call 、 apply 指定 this 行為改變 函式中 this 行為改變

arguments.callee 不能用 匿名函式中指向函式本身 最佳化 遞迴呼叫 "use strict"; setTimeout(function() { setTimeout(arguments.callee, 1000); }, 1000); JavaScript 錯誤 "use strict"; setTimeout(function f() { setTimeout(f, 1000); }, 1000); IE9 (含) 以下有 bug

block 中不可宣告函式 function declaration "use strict"; if(Windows) { function f() { console.log('hasWinRT'); } } JavaScript 錯誤 "use strict"; if(Windows) { var f = function() { console.log('hasWinRT'); } } 改用 function expression

call 、 apply 指定 this 行為改變 "use strict"; function f() { console.log(this); } f.call(null); // null f.call(undefined); // undefined 非 Strict 模式、 window "use strict"; f.apply(null, [1, 2, 3]); 使用目的為第二個參數

函式中 this 行為改變 IE9 、 bug IE10 (原) 、 bug "use strict"; f(); // undefined function f() { console.log(this); } 非 Strict 模式、 window IE9 、 bug IE10 (原) 、 bug

"use strict"; 能拿掉嗎? 嚴謹好、事出必有因 煩 拿掉還沒碰到問題

WinJS 實踐 Promise 物件 Observable 物件 Single-page navigation

Promise 物件 WinJS.Promise 、 jQuery Deferred 物件 Promise/A Promise/B Promise/D WinJS.Promise 、 jQuery Deferred 物件 不太相同

WinJS.Promise 超過 0.5 秒、非同步、吐回 Promise 物件 與 callback 相比 messageDialog.showAsync() WinJS.Application.local.readText() WinJS.xhr 與 callback 相比 語意清晰

AJAX a.php -> b.php -> c.php var xhr = new XMLHttpRequest(); xhr.open('GET', 'a.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { xhr.open('GET', 'b.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { xhr.open('GET', 'c.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { // ... } }) xhr.send(); } }) xhr.send(); } }); xhr.send();

AJAX a.php -> b.php -> c.php WinJS.xhr({ url: 'a.php' }) .then(function() { return WinJS.xhr({ url: 'b.php' }); }) .then(function() { return WinJS.xhr({ url: 'c.php' }); }) .done(function() { /* ... */ });

AJAX a.php b.php c.php 同時送出 等三者皆完成 再下一步 不用 Promise

AJAX a.php b.php c.php 同時送出 WinJS.Promise.join([ WinJS.xhr ({ url: 'a.php' }), WinJS.xhr ({ url: 'b.php' }), WinJS.xhr ({ url: 'c.php' })]) .done(function() { /* ... */ });

視情況 AJAX a.php 或 b.php 使用情境 例 多元登入 var xhr = XMLHttpRequest(); if(type === 'A') { xhr.open('GET', 'a.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { // http -> result f(result); } }); xhr.send(); } else { xhr.open('GET', 'b.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { // http -> result f(result); } }); xhr.send(); } function f(result) { /* ... */ } 使用情境 例 多元登入

視情況 AJAX a.php 或 b.php var promise; if(type === 'A') promise = WinJS.xhr({ url : 'a.php' }).then(function(data){ /* ... */ }); else promise = WinJS.xhr({ url : 'b.php' }).then(function(data) { /* ... */ }); promise.done(function(result) { /* ... */ });

有值直接用、沒值 AJAX a.php if(localStorage.x) f(localStorage.x); else { var xhr = XMLHttpRequest(); xhr.open('GET', 'a.php', true); xhr.onreadystatechange(function(http) { if(http.readyState == 4 && http.status == 200) { // http -> result f(result); } }); xhr.send(); } function f(result) { /* ... */ };

有值直接用、沒值 AJAX a.php WinJS.Promise.as 非 Promies 轉成 Promise var promise; if(localStorage.x) promise = WinJS.Promise.as(localStorage.x); else promise = WinJS.xhr({ url : 'a.php' }).then(function(data) { /* ... */ }); promise.done(function(result) { /* ... */ }); WinJS.Promise.as 非 Promies 轉成 Promise

自己兜 Promise 物件 Promise 內部 callback 實作 參考 WinJS.xhr 原始碼 var promise = new WinJS.Promise(function(complete, error, progress) { setTimeout(function() { // ... complete('DEMO'); }, 3000); }); Promise 內部 callback 實作 參考 WinJS.xhr 原始碼

setPromise 待 Promise 執行完畢、 Event 才完畢 app.onready = function (ev) { ev.detail.setPromise( WinJS.Application.roaming.writeText("time.txt", new Date()) ); }; 待 Promise 執行完畢、 Event 才完畢

Observable 物件 var target = document.getElementById('target'), a = { x : 1 }, b = WinJS.Binding.as(a); b.bind('x', function(newVal, oldVal) { target.innerHTML = newVal; }); console.log(target.innerHTML); // 1 b.x = 2; console.log(target.innerHTML); // 2 b.x = 3; console.log(target.innerHTML); // 3

Observable 物件 ECMAScript 5 Object getter setter WinJS.Binding Observable Proxy WinJS.Binding WinJS.Binding.as WinJS.Binding.define … WinJS 原始碼

Single-page navigation Quickstart: Using single-page navigation WinJS.UI.Pages 、 WinJS.Navigation 官方建議使用、較像 App

Single-page navigation WinJS.UI.Pages.define("/pages/home/home.html", { ready : function (element, options) { WinJS.Utilities.query("a").listen("click", function(ev) { ev.preventDefault(); WinJS.Navigation.navigate(ev.target.href); }, false); } }); 記得寫、否則

Windows App Cert Kit 簡稱 WACK 或 Windows ACK App 上架前 JavaScript 特有不通過 UTF-8 檔案編碼 Bytecode 產生

UTF-8 檔案編碼 檔案開頭要有 BOM jQuery 待續 … 官方說法、BOM 提高 15 – 20% 效能

Bytecode 產生 App 內 JavaScript 存為 Bytecode 不通過處理步驟 本機電腦 App 移除 組態選單 Release 專案 -> 市集 -> 建立應用程式套件 精靈、 Windows App Cert Kit

Bytecode 產生

Bytecode 產生

Bytecode 產生

Bytecode 產生

立即啟動!免費開發人員帳戶!! Windows Store / Windows Azure / Windows Phone 擁有 MSDN 訂閱 「取得代碼」後進行註冊 http://aka.ms/startmsdn 優惠內容: Windows Store / Windows Phone – 啟用後12個月, 完全免費! Windows Azure – 訂閱期間, 每月固定的免費使用量!