SlideShare una empresa de Scribd logo
1 de 25
HTML 5 Native Drag
    楊維中(a.k.a zonble)
話說…
• 有次聽了一位資深 Web Developer   發表
 關於 HTML 5 的演講,裡頭提到 Native
 Drag
• …聽完覺得完全沒搔到癢處
• …果然要講跟 Native 有關的東西,你還
 是得要玩過一點 Native 的東西才行
在 Native Drag 之前?

• 網頁上的 Drag and Drop,其實就只是讓
 某個 HTML Element 移動位置而已

• 讓某個 HTML Element 跟著滑鼠
• 拉範圍不能超過目前網頁
Native Drag

• 將要透過 Drag and Drop 交換的資料寫入
 系統剪貼簿

 • Mac OS X:NSPasteboard
• 透過系統 API 設定滑鼠游標圖片
所以可以…

• 瀏覽器不同網頁之間 拉資料
• 不同瀏覽器之間 拉資料
• 瀏覽器與其他應用程式之間 拉資料
其實…
• 瀏覽器本來就有一定程度的 Native
 Drag,但是原本   限於部分種類的資
 料…

 • 文字
 • 圖片
以前的作法
• 如果想將 HTML 中出現一個可以    拉到
 瀏覽器之外的 custom 資料,我們需要寫
 一個瀏覽器 plug-in

• 瀏覽器 plug-in 就是在瀏覽器畫面中   出
 一塊 Native View,裡頭的實作當然就是
 Native 的,於是可以用 Native 方式交換
瀏覽器 Plug-in

• Windows:可能要寫 ActiveX Control,
 會有一堆安全性問題…

• Mac OS X:原本 WebKit Plug-in 超好寫,
 但是 10.7 Lion 之後禁止 Safari 載入
 WebKit Plug-in…
Demo

• Sample Code:https://github.com/zonble/
  NativeDrag
• 參考文件:WebKit DOM Programming
  Topics - Using Drag and Drop From
  JavaScript
WebView 與 NSTableView 交換資料
怎麼做

• 先解釋怎樣從 WebView   資料放到
 NSTableView
• 再解釋怎樣從 NSTableView   資料到
 WebView
從 WebView   資料放
  到 NSTableView
JavaScript
• 要讓一個 HTML Element 變成可以用
 Native Drag    拉

 • 加上 CSS 屬性:-webkit-user-drag:
   element;
 • 加上 ondragstart 的 handler
 • <div style=”-webkit-user-drag: element;”
JavaScript
呼叫系統剪貼簿
dragstart = function(this, event) {
     var dataTransfer = event.dataTransfer;
     dataTransfer.setData(“key”, “value
     string”);
     return true;
};
Objective C
•       冊可以 Drop 的 Data Type

    •   [self.tableView registerForDraggedTypes:@[@”key”]];

• NSView 需要實作 NSDraggingDestination
    才能支援 Drop 資料

• NSTableView DataSource 需要實作兩個
    method
Objective C
- (NSDragOperation)tableView:(NSTableView *)tableView
validateDrop:(id <NSDraggingInfo>)info proposedRow:
(NSInteger)row proposedDropOperation:
(NSTableViewDropOperation)dropOperation
{
	

 NSPasteboard *pasteBoard = [info draggingPasteboard];
	

 NSString *value = [pasteBoard stringForType:@”key”];
	

 if (value) {
	

 	

 return NSDragOperationCopy;
	

 }
	

 return NSDragOperationNone;
}
setData()
• JavaScript 會透過 dataTransfer 物件的
  setData() 與 getData() 交換資料

• …但是裡頭的資料目前只能夠是字串,
  如果是 array 等物件,會變成 [object
  Object]   類字串

• 所以如果是複雜的資料,我們可以一次
setData()
• 既然只能用字串…
 • 把 JavaScript 物件透過 JSON.stringify()
   與 JSON.parse() 轉成字串

 • Objective C 可以用 NSJSONSerialization
   或是其他第三方 JSON Parser
查看全部剪貼簿內容?




      Pasteboard Peeker
蘋果雖然說 Deprecated,但是還是很好用
從 NSTableView   資
 料放到 WebView
Objective C
• NSView 只要實作一個 method 就可以開
 始 Drag 東西出來

 • dragImage:at:offset:event:pasteboard:sour
   ce:slideBack:
• NSTableView DataSource 則是要實作
 tableView:writeRowsWithIndexes:toPasteb
Objective C
- (BOOL)tableView:(NSTableView *)tableView
writeRowsWithIndexes:(NSIndexSet *)rowIndexes
toPasteboard:(NSPasteboard *)pboard
{
	

 [pboard declareTypes:@[@”key”];
	

 [pboard setString:@"Value String"
forType:@”key”];
	

 return YES;
}
JavaScript
• 要讓一個 HTML Element 變成可以接受
  Drop
• 加上 CSS 屬性:-webkit-user-drop:
  element;
• 加上 ondragenter、ondragover、ondrop
  等 handler
JavaScript

• 文件上面說 ondragenter 與 ondragover 裡
  頭,一定要呼叫 event.preventDefault();
  不然沒有作用

• 我們可以從 dataTransfer.getData() 拿到
  NSTableView   過來的資料
Das ist alles.

Más contenido relacionado

La actualidad más candente

02 Objective-C
02 Objective-C02 Objective-C
02 Objective-CTom Fan
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器Chieh Kai Yang
 
Blazor 與 Radzen 同行
Blazor 與 Radzen 同行Blazor 與 Radzen 同行
Blazor 與 Radzen 同行Jimmy Ho
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework國昭 張
 
如何攻破大型副本 大型專案的開發與團隊合作經驗 聊天室
如何攻破大型副本   大型專案的開發與團隊合作經驗 聊天室如何攻破大型副本   大型專案的開發與團隊合作經驗 聊天室
如何攻破大型副本 大型專案的開發與團隊合作經驗 聊天室Study4TW
 
07 View Controllers
07 View Controllers07 View Controllers
07 View ControllersTom Fan
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門Will Huang
 
05 MapKit and Text Input
05 MapKit and Text Input05 MapKit and Text Input
05 MapKit and Text InputTom Fan
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starteryiming he
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版Kirk Chen
 
真實環境的Asp.net MVC
真實環境的Asp.net MVC真實環境的Asp.net MVC
真實環境的Asp.net MVCStudy4TW
 
深入浅出浏览器硬件加速
深入浅出浏览器硬件加速深入浅出浏览器硬件加速
深入浅出浏览器硬件加速Baidu, Inc.
 
KISSY_Component
KISSY_ComponentKISSY_Component
KISSY_Componentyiming he
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
深入淺出Node.JS
深入淺出Node.JS深入淺出Node.JS
深入淺出Node.JS國昭 張
 
從前端設計的角度來看 Angular - TW2018 amos
從前端設計的角度來看 Angular - TW2018 amos從前端設計的角度來看 Angular - TW2018 amos
從前端設計的角度來看 Angular - TW2018 amosAmos Lee
 

La actualidad más candente (20)

02 Objective-C
02 Objective-C02 Objective-C
02 Objective-C
 
React js
React jsReact js
React js
 
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
改善 Angular 開發流程:你所不知道的 Schematics 程式碼產生器
 
Blazor 與 Radzen 同行
Blazor 與 Radzen 同行Blazor 與 Radzen 同行
Blazor 與 Radzen 同行
 
ASP.Net MVC Framework
ASP.Net MVC FrameworkASP.Net MVC Framework
ASP.Net MVC Framework
 
AJAX Basic
AJAX BasicAJAX Basic
AJAX Basic
 
如何攻破大型副本 大型專案的開發與團隊合作經驗 聊天室
如何攻破大型副本   大型專案的開發與團隊合作經驗 聊天室如何攻破大型副本   大型專案的開發與團隊合作經驗 聊天室
如何攻破大型副本 大型專案的開發與團隊合作經驗 聊天室
 
07 View Controllers
07 View Controllers07 View Controllers
07 View Controllers
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門
 
HTML5 Samples
HTML5 SamplesHTML5 Samples
HTML5 Samples
 
05 MapKit and Text Input
05 MapKit and Text Input05 MapKit and Text Input
05 MapKit and Text Input
 
KISSY for starter
KISSY for starterKISSY for starter
KISSY for starter
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版
 
Javascript
JavascriptJavascript
Javascript
 
真實環境的Asp.net MVC
真實環境的Asp.net MVC真實環境的Asp.net MVC
真實環境的Asp.net MVC
 
深入浅出浏览器硬件加速
深入浅出浏览器硬件加速深入浅出浏览器硬件加速
深入浅出浏览器硬件加速
 
KISSY_Component
KISSY_ComponentKISSY_Component
KISSY_Component
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
深入淺出Node.JS
深入淺出Node.JS深入淺出Node.JS
深入淺出Node.JS
 
從前端設計的角度來看 Angular - TW2018 amos
從前端設計的角度來看 Angular - TW2018 amos從前端設計的角度來看 Angular - TW2018 amos
從前端設計的角度來看 Angular - TW2018 amos
 

Similar a Html 5 native drag

16 CoreData
16 CoreData16 CoreData
16 CoreDataTom Fan
 
Yog Framework
Yog FrameworkYog Framework
Yog Frameworkfansekey
 
Dev camps Windows Store App 市集應用程式最佳實踐
Dev camps   Windows Store App 市集應用程式最佳實踐Dev camps   Windows Store App 市集應用程式最佳實踐
Dev camps Windows Store App 市集應用程式最佳實踐Meng-Ru (Raymond) Tsai
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統Hsu Ping Feng
 
Network and Multitasking
Network and MultitaskingNetwork and Multitasking
Network and Multitaskingyarshure Kong
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践Jackson Tian
 
Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Gelis Wu
 
Nosql及其主要产品简介
Nosql及其主要产品简介Nosql及其主要产品简介
Nosql及其主要产品简介振林 谭
 
Script with engine
Script with engineScript with engine
Script with engineWebrebuild
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Justin Lin
 
John Resig Beijing 2010 (中文版)
John Resig Beijing 2010 (中文版)John Resig Beijing 2010 (中文版)
John Resig Beijing 2010 (中文版)Jia Mi
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseJack Gao
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门Xiujun Ma
 
redux-observable with react-apollo
redux-observable with react-apolloredux-observable with react-apollo
redux-observable with react-apolloTripmoment
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計Amigo 陳兆祥
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染Ailsa126
 

Similar a Html 5 native drag (20)

16 CoreData
16 CoreData16 CoreData
16 CoreData
 
Yog Framework
Yog FrameworkYog Framework
Yog Framework
 
Dev camps Windows Store App 市集應用程式最佳實踐
Dev camps   Windows Store App 市集應用程式最佳實踐Dev camps   Windows Store App 市集應用程式最佳實踐
Dev camps Windows Store App 市集應用程式最佳實踐
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
Network and Multitasking
Network and MultitaskingNetwork and Multitasking
Network and Multitasking
 
Berserk js
Berserk jsBerserk js
Berserk js
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
 
Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________Blazor in NET 8 的重大改變___________________
Blazor in NET 8 的重大改變___________________
 
Nosql及其主要产品简介
Nosql及其主要产品简介Nosql及其主要产品简介
Nosql及其主要产品简介
 
Zabbix in PPTV
Zabbix in PPTVZabbix in PPTV
Zabbix in PPTV
 
Script with engine
Script with engineScript with engine
Script with engine
 
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
Servlet & JSP 教學手冊第二版 - 第 9 章:整合資料庫
 
John Resig Beijing 2010 (中文版)
John Resig Beijing 2010 (中文版)John Resig Beijing 2010 (中文版)
John Resig Beijing 2010 (中文版)
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 
redux-observable with react-apollo
redux-observable with react-apolloredux-observable with react-apollo
redux-observable with react-apollo
 
以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計以Code igniter為基礎的網頁前端程式設計
以Code igniter為基礎的網頁前端程式設計
 
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
 

Más de Weizhong Yang

怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google MapsWeizhong Yang
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情Weizhong Yang
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事Weizhong Yang
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsWeizhong Yang
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repoWeizhong Yang
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 APIWeizhong Yang
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
 
給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發Weizhong Yang
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼Weizhong Yang
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 CodeWeizhong Yang
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented ProgrammingWeizhong Yang
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIWeizhong Yang
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統Weizhong Yang
 

Más de Weizhong Yang (20)

Flutter BLE
Flutter BLEFlutter BLE
Flutter BLE
 
怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps怎樣在 Flutter app 中使用 Google Maps
怎樣在 Flutter app 中使用 Google Maps
 
關於延長役期這件事情
關於延長役期這件事情關於延長役期這件事情
關於延長役期這件事情
 
Dart null safety
Dart null safetyDart null safety
Dart null safety
 
導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事導入 Flutter 前你應該知道的事
導入 Flutter 前你應該知道的事
 
Github Actions
Github ActionsGithub Actions
Github Actions
 
iPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing AidsiPlayground: CarPlay and MFI Hearing Aids
iPlayground: CarPlay and MFI Hearing Aids
 
CocoaPods private repo
CocoaPods private repoCocoaPods private repo
CocoaPods private repo
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API那些年被蘋果 Ban 掉的 API
那些年被蘋果 Ban 掉的 API
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發給 iOS 工程師的 Vue.js 開發
給 iOS 工程師的 Vue.js 開發
 
使用 switch/case 重構程式碼
使用 switch/case 重構程式碼使用 switch/case 重構程式碼
使用 switch/case 重構程式碼
 
怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
Aspect Oriented Programming
Aspect Oriented ProgrammingAspect Oriented Programming
Aspect Oriented Programming
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
Python 的文件系統
Python 的文件系統Python 的文件系統
Python 的文件系統
 
Input Method Kit
Input Method KitInput Method Kit
Input Method Kit
 
Refactoring
RefactoringRefactoring
Refactoring
 
Core animation
Core animationCore animation
Core animation
 

Html 5 native drag

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n