在非应用程序 HTML 沙箱中处理文件放置

Adobe AIR 1.0 和更高版本

非应用程序内容无法访问在将文件拖入 AIR 应用程序时产生的 File 对象。也无法将这些 File 对象中的一个对象通过沙箱桥传递给应用程序内容。(必须在序列化期间访问对象属性。)但是,您仍可以通过侦听 HTMLLoader 对象上发生的 AIR nativeDragDrop 事件,在应用程序中放置文件。

通常,如果用户将文件放入承载非应用程序内容的框架中,则放置事件不会从子级传播到父级。但是,由于 HTMLLoader(AIR 应用程序中所有 HTML 内容的容器)调度的事件不是 HTML 事件流的一部分,因此您仍可以在应用程序内容中接收放置事件。

为了接收文件放置事件,父级文档会使用 window.htmlLoader 提供的引用向 HTMLLoader 对象添加一个事件侦听器:

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

NativeDragEvent 对象在行为上与其 HTML 事件的对应对象相似,但部分属性和方法的名称和数据类型不同。例如,HTML 事件 dataTransfer 属性的用途与 ActionScript 事件 clipboard 属性相同。 有关使用这些类的更多信息,请参阅 Adobe ActionScript 3.0 开发人员指南 用于 Adobe Flash Platform 的 ActionScript 3.0 参考

下面的示例使用将子级页面加载到远程沙箱 (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>