As web apps evolve, you might have found it handy to let users drag
and drop files from the desktop onto the browser to edit, upload, share,
etc. But unfortunately, we’ve been unable to drag and drop folders onto
web pages. Luckily, beginning with Chrome 21, this issue will be
addressed (already available in the Chrome dev channel).
Passing multiple files with drag and drop
Let’s look at a code sample of existing drag and drop.
<divid=”dropzone”></div>
var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
var length = e.dataTransfer.files.length;
for (var i = 0; i < length; i++) {
var file = e.dataTransfer.files[i];
... // do whatever you want
}
};
In this example, you can actually drag and drop
a file or files from the desktop to your browser, but when you try to
pass a folder, notice that it will be either rejected or treated as a File object resulting in a failure.
How to handle dropped folders
Chrome 21 allows you to drop a folder or multiple folders into the
browser window. To handle these, you need to change the way you handle
dropped objects.
<divid=”dropzone”></div>
var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
var length = e.dataTransfer.items.length;
for (var i = 0; i < length; i++) {
var entry = e.dataTransfer.items[i].webkitGetAsEntry();
if (entry.isFile) {
... // do whatever you want
} else if (entry.isDirectory) {
... // do whatever you want
}
}
};
Notice that a big difference here is that you can treat a dropped object as Entry (FileEntry or DirectoryEntry) by using new function called getAsEntry (webkitGetAsEntry).
After obtaining access to the Entry object, you can use
standard file handling methods that were introduced in the FileSystem
API specification. For example, this example shows how you can detect if
a dropped object is a file or a directory by examining the .isFile (or the .isDirectory) field.
For further information regarding the FileSystem API, read Exploring the FileSystem APIs, regarding new drag and drop capability, read this document. Of course, these features are open standards or are waiting to become one soon.
In a recent post, Eiji Kitamura highlighted a subtle, yet powerful new feature in the drag and drop APIs; the ability to drag in folders and retrieve them as HTML5 Filesystem API FileEntry and DirectoryEntry objects (done by accessing a new method on the DataTransferItem, .webkitGetAsEntry()).
What's remarkably cool about the .webkitGetAsEntry() extension is how elegant it makes importing files and entire folders. Once you have a FileEntry or DirectoryEntry from a drop event, it's a matter of using the Filesystem API's copyTo() to get it imported into your app.
An example of copying multiple dropped folders over to the filesystem:
var fs =null;// Cache filesystem for later.// Not shown: setup drag and drop event listeners.function onDrop(e){
e.preventDefault();
e.stopPropagation();var items = e.dataTransfer.items;for(var i =0, item; item = items[i];++i){var entry = item.webkitGetAsEntry();// Folder? Copy the DirectoryEntry over to our local filesystem.if(entry.isDirectory){
entry.copyTo(fs.root,null,function(copiedEntry){// ...}, onError);}}}
window.webkitRequestFileSystem(TEMPORARY,1024*1204,function(fileSystem){
fs = fileSystem;},function(e){
console.log('Error', e);});
Very nice! Again, the simplicity comes from integrating DnD with the Filesystem API calls.
Taking this one step further, we also have the ability to drag and drop a folder and/or files onto a normal <input type="file">, then access the entries as Filesystem directory or file entries. That is done through .webkitEntries:
<inputtype="file"multiple>
function onChange(e) {
e.stopPropagation();
e.preventDefault();
var entries = e.target.webkitEntries; // Get all dropped items as FS API entries.
[].forEach.call(entries, function(entry) {
// Copy the entry into our local filesystem.
entry.copyTo(fs.root, null, function(copiedEntry) {
...
}, onError);
});
}
document.querySelector('input[type="file"]').addEventListener('change', onChange);
I've put together a photo gallery demo to demonstrate these different techniques for importing files/folders.
사용 케이스 XDisplay는 iPad를 컴퓨터의 무선 보조 디스플레이로 전환하여 생선성을 향상 시킵니다. iPad를 화면 확장기로 사용하면 많은 용도에 활용할 수 있습니다. 예시: •위젯, 폴더 바로가기, IM 친구 리스트, Skype, Twitter, Photoshop 팔레트 및 기타 유틸리티 애플리케이션을 iPad 화면에 두어 데스크탑 혼란을 줄이세요 •모든 열을 스크롤을 하지 않고 볼 수 있도록 모니터를 통해서 스프레드시트를 보세요 •작업하는 동안 iPad에서 Netflix, Hulu, 혹은 소셜게임(FarmVille)같은 엔터테인먼트를 배경에 놓으세요 •iPad에 나타난 웹 페이지를 보는 동안에 한 개의 모니터에서 HTML 페이지를 편집하세요 •확장된 iPad 화면에서 추가 컨텐츠를 보여주면서 다른 사람들과 협력하세요 •전달 혹은 전환의 번거로움을 피하고, 침대나 휴식처에서 iPad를 통해서 플래쉬 영화나 비디오를 즐기세요
기능 •전체 오디오 및 비디오 지원(소리는 독립적으로 PC나 iPad에서 켜고 끌 수 있습니다) •반투명 화면을 갖춘 Windows 7 기본 Aero 바탕화면을 지원함 •핀치-투-줌 기능을 갖춘 직관적인 터치 제스처 •옵션 텍스트 입력 방법으로 가상 화면 키보드 •iPad가 껴졌을 때 자동 방향 (가로와 세로 모드 모두에서 작동) •개인정보 보호를 위한 암호 보호 •연결된 PC에 확장된 디스플레이의 위치를 선택할 수 있는 능력
빠르고 쉬운 설정 1.App Store에서 Splashtop XDisplay를 다운로드 하세요 2.http://www.splashtop.com/streamer에서가장 최신의 Splashtop Streamer를 컴퓨터에 다운로드하세요 (Mac 사용자는 XDisplay를 사용하여 [설정] -> [고급 설정] 아래에 있는 Mac Streamer에 가상 드라이버를 설치하십시오.) 3.Splashtop XDisplay 디바이스 리스트에서 당신의 컴퓨터를 선택하고 진행하세요
소프트웨어를 국제화해야 하기 위해서는 고려해야할 것이 한두가지가 아니다. 그런데 많은 회사들은 메세지나 번역하면 되는 것으로 안다. 그렇게 쉽게 접근했다가는 해외 진출을 하면 할수록 문제가 커지고 비용이 늘어나서 점점 어려워진다.
국제화 기술은 알아야 할 지식도 많고 경험도 많이 필요하다.
기본적으로 국제화(i18n)과 지역화(L10N)으로 나뉜다. 국제화(i18n)은 소프트웨어가 여러 Locale을 지원할 수 있는 기본 기술이고 지역화(L10N)은 각 Locale을 지우너하는 것이다.
이 과정에서 고려해야 할 것은 수백가지가 넘는다. 그 중에서 49가지만 알아보자. 만약에 국제화된 소프트웨어를 개발하고 있는 개발자라면 이중에서 몇가지나 알고 있는지 세어보자. 어떤 항목은 그 하나가 엄청나게 큰 것도 있다. 특별하게 순서를 가지고 정리한 것은 아니지만 하나씩 살펴보자.
1~49번까지의 항목들이 제목만 본다고 쉽게 해결할 수 있는 것은 아니다. 하나의 항목을 가지고 10년 넘게 연구하고 개발하고 있는 것도 있을 정도로 크고 복잡한 것도 있다. 제대로 국제화를 적용하고 싶다면 국제화 전문가의 도움을 받는 것도 한 방법이다. 이것을 처음부터 제대로 하지 않고 시행착오를 거쳐서 고객이 버그를 찾을 때마다 하나씩 고쳐주는 것은 끝도 없고 제품의 이미지도 처음부터 추락할 것이다.
확실한 것은 국제화를 스스로 생각해서 직접 개발하면 잘못될 가능성이 99%이다. 대부분은 이미 국제 표준이나 기술이 있으므로 직접 개발하기보다는 제대로 완성된 기술을 이용해야 한다.