在 HTML 中嵌入 SWF 内容

Adobe AIR 1.0 和更高版本

在 AIR 应用程序中,可以像在浏览器中那样,在 HTML 中嵌入 SWF 内容。使用 object 标签、 embed 标签或同时二者可嵌入 SWF 内容。

注: 常见的 Web 开发做法是同时使用 object 标签和 embed 标签在 HTML 页中显示 SWF 内容。此做法在 AIR 中毫无益处。您可以只使用 W3C 标准的 object 标签在 AIR 中显示内容。同时,对于浏览器中显示的 HTML 内容,您可以继续同时使用 object 和 embed 标签(如果需要)。

如果在显示 HTML 和 SWF 内容的 NativeWindow 对象中启用了透明度,则用于嵌入内容的窗口模式 ( wmode ) 设置为 window 时,AIR 不会显示 SWF 内容。要在透明窗口的 HTML 页中显示 SWF 内容,请将 wmode 参数设置为 opaque 或 transparent 。 window 是 wmode 的默认值,因此如果不指定值,则可能不会显示所需内容。

以下示例说明如何使用 HTML object 标签在 HTML 内容中显示 SWF 文件。应将 wmode 参数设置为 opaque 才可显示内容,即使基础 NativeWindow 对象是透明的。SWF 文件加载自应用程序目录,但您可以使用 AIR 支持的任何 URL 方案。(SWF 文件的加载位置决定了 AIR 放置内容的安全沙箱。)

<object type="application/x-shockwave-flash" width="100%" height="100%"> 
    <param name="movie" value="app:/SWFFile.swf"></param> 
    <param name="wmode" value="opaque"></param> 
</object>

还可以使用脚本动态地加载内容。以下示例创建了一个 object 节点,用于显示 urlString 参数中指定的 SWF 文件。该示例将此节点添加为页面元素的子元素,并使用 elementID 参数来指定 ID:

<script> 
function showSWF(urlString, elementID){ 
    var displayContainer = document.getElementById(elementID); 
    var flash = createSWFObject(urlString, 'opaque', 650, 650); 
    displayContainer.appendChild(flash); 
} 
function createSWFObject(urlString, wmodeString, width, height){ 
    var SWFObject = document.createElement("object"); 
    SWFObject.setAttribute("type","application/x-shockwave-flash"); 
    SWFObject.setAttribute("width","100%"); 
    SWFObject.setAttribute("height","100%"); 
    var movieParam = document.createElement("param"); 
    movieParam.setAttribute("name","movie"); 
    movieParam.setAttribute("value",urlString); 
    SWFObject.appendChild(movieParam); 
    var wmodeParam = document.createElement("param"); 
    wmodeParam.setAttribute("name","wmode"); 
    wmodeParam.setAttribute("value",wmodeString); 
    SWFObject.appendChild(wmodeParam);      
    return SWFObject; 
} 
</script>

如果缩放或旋转 HTMLLoader 对象或者将 alpha 属性设置为 1.0 之外的任何值,则不会显示 SWF 内容。在早于 AIR 1.5.2 的版本中,无论将 wmode 值设置为何值,透明窗口中都不显示 SWF 内容。

注: 当嵌入式 SWF 对象尝试加载外部资源(如视频文件)时,如果 HTML 文件中未提供视频文件的绝对路径,可能无法正确呈现 SWF 内容。不过,嵌入式 SWF 对象可以使用相对路径加载外部图像文件。

下面的示例描述了如何通过嵌入到 HTML 内容中的 SWF 对象加载外部资源:

    var imageLoader; 
     
    function showSWF(urlString, elementID){ 
        var displayContainer = document.getElementById(elementID); 
        imageLoader = createSWFObject(urlString,650,650); 
        displayContainer.appendChild(imageLoader); 
    } 
 
    function createSWFObject(urlString, width, height){ 
    
        var SWFObject = document.createElement("object"); 
            SWFObject.setAttribute("type","application/x-shockwave-flash"); 
            SWFObject.setAttribute("width","100%"); 
            SWFObject.setAttribute("height","100%"); 
             
        var movieParam = document.createElement("param"); 
            movieParam.setAttribute("name","movie"); 
            movieParam.setAttribute("value",urlString); 
            SWFObject.appendChild(movieParam); 
             
        var flashVars = document.createElement("param"); 
            flashVars.setAttribute("name","FlashVars");    
    
        //Load the asset inside the SWF content. 
            flashVars.setAttribute("value","imgPath=air.jpg");    
            SWFObject.appendChild(flashVars); 
    
        return SWFObject; 
    } 
    function loadImage() 
    { 
      showSWF("ImageLoader.swf", "imageSpot"); 
      
    }

在下面的 ActionScript 示例中,读取 HTML 文件传递的图像路径,并将该图像加载到舞台上:

package 
{ 
      import flash.display.Sprite; 
      import flash.display.LoaderInfo; 
      import flash.display.StageScaleMode; 
      import flash.display.StageAlign; 
      import flash.display.Loader; 
      import flash.net.URLRequest; 
      
      public class ImageLoader extends Sprite 
      { 
            public function ImageLoader() 
            { 
                  
                  var flashvars = LoaderInfo(this.loaderInfo).parameters; 
                  
                  if(flashvars.imgPath){ 
                        var imageLoader = new Loader(); 
                        var image = new URLRequest(flashvars.imgPath); 
                        imageLoader.load(image); 
                        addChild(imageLoader); 
                        imageLoader.x = 0; 
                        imageLoader.y = 0; 
                        stage.scaleMode=StageScaleMode.NO_SCALE;                    
                        stage.align=StageAlign.TOP_LEFT; 
                  } 
            } 
      } 
}