在非應用程式的 HTML 安全執行程序內處理檔案放下

Adobe AIR 1.0 以及更新的版本

非應用程式的內容無法存取因拖曳檔案到 AIR 應用程式中而產生的 File 物件,也無法透過安全執行程序橋接將這些 File 物件中的任何一個傳遞至應用程式內容 (存取物件屬性必須在序列化期間進行)。不過,藉由偵聽 HTMLLoader 物件的 AIR nativeDragDrop 事件,您還是可以在應用程式中放下檔案。

一般而言,如果使用者在裝載非應用程式內容的頁框中放下檔案,子系並不會將 drop 事件傳給父系。不過,由於 HTMLLoader (此為 AIR 應用程式中所有 HTML 內容的容器) 傳送的事件不屬於 HTML 事件流程的一部分,您仍然可以在應用程式內容中接收 drop 事件。

為了接收檔案放下事件,父文件可使用 window.htmlLoader 所提供的參考,將事件偵聽程式加入 HTMLLoader 物件:

window.htmlLoader.addEventListener("nativeDragDrop",function(event){ 
    var filelist = event.clipboard.getData(air.ClipboardFormats.FILE_LIST_FORMAT); 
    air.trace(filelist[0].url); 
});

下列範例使用父文件將子頁面載入至遠端安全執行程序 (http://localhost/)。父文件會偵聽 HTMLLoader 物件的 nativeDragDrop 事件以追蹤檔案 URL。

<html> 
<head> 
<title>Drag-and-drop in a remote sandbox</title> 
<script language="javascript" type="text/javascript" src="AIRAliases.js"></script> 
<script language="javascript"> 
    window.htmlLoader.addEventListener("nativeDragDrop",function(event){ 
        var filelist = event.clipboard.getData(air.ClipboardFormats.FILE_LIST_FORMAT); 
        air.trace(filelist[0].url); 
    }); 
</script> 
</head> 
<body> 
       <iframe src="child.html" 
               sandboxRoot="http://localhost/"  
               documentRoot="app:/"  
               frameBorder="0"  width="100%" height="100%"> 
       </iframe> 
</body> 
</html>

子文件必須成為有效的放下目標,因此應在 HTML dragenter dragover 事件處理常式中呼叫 Event 物件 preventDefault() 方法。否則不會發生放下事件。

<html> 
<head> 
    <title>Drag and drop target</title>             
    <script language="javascript" type="text/javascript"> 
        function preventDefault(event){ 
            event.preventDefault(); 
        } 
    </script> 
</head> 
<body ondragenter="preventDefault(event)" ondragover="preventDefault(event)">  
<div> 
<h1>Drop Files Here</h1> 
</div> 
</body> 
</html>