在 JavaScript 中寻址 Shockwave Flash 对象 (MultiPowUpload) 的属性

Posted

技术标签:

【中文标题】在 JavaScript 中寻址 Shockwave Flash 对象 (MultiPowUpload) 的属性【英文标题】:Addressing properties of a Shockwave Flash object (MultiPowUpload) in JavaScript 【发布时间】:2010-10-24 17:29:35 【问题描述】:

请原谅这个愚蠢的新手问题;我只用了大约 24 小时的 javascript 编程...... :)

我已经设法(在一些外部帮助下)将一个冲击波闪存对象嵌入到我的页面中 - 特别是 MultiPowUpload 2.1。它在页面上显示得很好,并且似乎运行正常;我们可以把那部分当作已读。

现在我正在尝试在 JavaScript 中做一些更高级的事情 - 我有一个按钮,在 onClick() 代码中我有以下内容:

var swf = document.getElementById("FlashFilesUpload1");
var itemsCount = swf.filesCount;
alert("items: "+itemsCount);

但警报语句告诉我“项目:未定义”。如果我将itemsCount 设置为swf.nonExistentProperty,它的作用相同——一切都是“未定义的”。但从我在documentation 中读到的内容来看,肯定有filesCount 属性。我尝试访问这个 swf 对象的所有其他属性和方法,但它们都不起作用,除了 toString(),它返回“htmlObjectElement”。

我显然错误地处理了这个对象 - 但我做错了什么?


澄清

回复@brianpeiris:我这样做与link you suggested 的页面完全不同。我没有任何丰富的知识来做这件事,我只是真的像一只猴子,试图复制其他人的有效代码,然后对其进行调整,让它做我想要的......所以不要以为我什么都知道,无论多么明显 - 请记住,我现在才使用 JavaScript 大约一天!

下面是控件本身的代码:

          <object id="FlashFilesUpload1" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
          classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" viewastext>
          <!-- Replace symbols " with the &quot; at all parameters values and 
    symbols "&" with the "%26" at URL values or &amp; at other values!
    The same parameters values should be set for EMBED object below. -->
          <param name="FlashVars" value="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx" />
          <param name="BGColor" value="#F8F6E6" />
          <param name="Movie" value="ClientSideControls/ElementITMultiPowUpload2.1.swf" />
          <param name="Src" value="ClientSideControls/ElementITMultiPowUpload2.1.swf" />
          <param name="WMode" value="Window" />
          <param name="Play" value="-1" />
          <param name="Loop" value="-1" />
          <param name="Quality" value="High" />
          <param name="SAlign" value="" />
          <param name="Menu" value="-1" />
          <param name="Base" value="" />
          <param name="AllowScriptAccess" value="always" />
          <param name="Scale" value="ShowAll" />
          <param name="DeviceFont" value="0" />
          <param name="EmbedMovie" value="0" />
          <param name="SWRemote" value="" />
          <param name="MovieData" value="" />
          <param name="SeamlessTabbing" value="1" />
          <param name="Profile" value="0" />
          <param name="ProfileAddress" value="" />
          <param name="ProfilePort" value="0" />
          <!-- Embed for Netscape,Mozilla/FireFox browsers support. Flashvars parameters are the same.-->
          <!-- Replace symbols " with the &quot; at all parameters values and symbols "&" with the "%26" at URL values or &amp; at other values! -->
          <embed bgcolor="#F8F6E6" id="EmbedFlashFilesUpload" src="ClientSideControls/ElementITMultiPowUpload2.1.swf"
            quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"
            type="application/x-shockwave-flash"   flashvars="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx">
</embed>
        </object>

正如您所见,它作为object 嵌入在 HTML 中,与您提供的参考不同,他们使用脚本执行其他一些技巧将其放到页面上。

顺便说一句,当我按照他们的方式尝试时(我承认不是很努力),我什至没有设法让控件出现在我的页面上!

感谢您的帮助...非常感谢

【问题讨论】:

【参考方案1】:

编辑:我想我终于弄明白了!您只需将useExternalInterfaces 设置为Yes

所以在你的代码中你会改变

<param 
  name="FlashVars"
  value="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx" />

<param 
  name="FlashVars"
  value="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx&useExternalInterface=Yes" />

并对&lt;embed&gt; 标记执行相同操作。

如果您访问 demo site 并在 Firebug 中运行以下代码,它会在您选择文件之前返回 0,并在您选择文件后返回正确的计数。此外,如果您检查源代码,您会看到 useExternalInterface 选项设置为 Yes

alert(document.getElementById('MultiPowUpload').filesCount());

P.S.您应该考虑使用 MultiPowUpload 附带的 SWFObject 脚本。它使您可以轻松设置和更改变量,而不必担心跨浏览器问题,并且对于没有 Flash 的用户,它还可以优雅地降级。


进一步修改 回答您的评论:是的,我有 filesCount 在我的机器上工作。

我忘记提及的一件事是,您可能试图在 Flash 控件完全加载之前检索filesCount

以下是我正在使用的代码。我完全复制了您的代码并添加了useExternalInterface 设置以及我自己的javascript。

请注意,我的 javascript 代码使用 setInterval 函数每 500 毫秒重复检查一次 filesCount

<object id="FlashFilesUpload1" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" viewastext>
  <!-- Replace symbols " with the &quot; at all parameters values and
  symbols "&" with the "%26" at URL values or &amp; at other values!
  The same parameters values should be set for EMBED object below. -->
  <param name="FlashVars" value="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx&useExternalInterface=Yes" />
  <param name="BGColor" value="#F8F6E6" />
  <param name="Movie" value="ClientSideControls/ElementITMultiPowUpload2.1.swf" />
  <param name="Src" value="ClientSideControls/ElementITMultiPowUpload2.1.swf" />
  <param name="WMode" value="Window" />
  <param name="Play" value="-1" />
  <param name="Loop" value="-1" />
  <param name="Quality" value="High" />
  <param name="SAlign" value="" />
  <param name="Menu" value="-1" />
  <param name="Base" value="" />
  <param name="AllowScriptAccess" value="always" />
  <param name="Scale" value="ShowAll" />
  <param name="DeviceFont" value="0" />
  <param name="EmbedMovie" value="0" />
  <param name="SWRemote" value="" />
  <param name="MovieData" value="" />
  <param name="SeamlessTabbing" value="1" />
  <param name="Profile" value="0" />
  <param name="ProfileAddress" value="" />
  <param name="ProfilePort" value="0" />
  <!-- Embed for Netscape,Mozilla/FireFox browsers support. Flashvars parameters are the same.-->
  <!-- Replace symbols " with the &quot; at all parameters values and symbols "&" with the "%26" at URL values or &amp; at other values! -->
  <embed bgcolor="#F8F6E6" id="EmbedFlashFilesUpload" src="ClientSideControls/ElementITMultiPowUpload2.1.swf"
    quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"
    type="application/x-shockwave-flash"   flashvars="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx&useExternalInterface=Yes">
  </embed>
</object>


<script>
  function updateMessage() 
    var message = (new Date()).toLocaleTimeString() + ': ';

    try 
      var objectElement = document.getElementsByTagName('object')[0];
      var embedElement = document.getElementsByTagName('embed')[0];

      if (objectElement.filesCount) 
        message += 'We are in IE ' + objectElement.filesCount();
      
      else if (embedElement.filesCount) 
        message += 'We are in Firefox ' + embedElement.filesCount();
      
      else 
        message += "The flash object is not loaded or useExternalInterface is not set to 'Yes'";
      
    
    catch (exp) 
      message += 'An error occurred';
    
    document.getElementById('message').innerHTML = message;
  

  // Update the message every 500 milliseconds
  setInterval(updateMessage, 500);
</script>

【讨论】:

嗯,你说得对,我应该意识到这一点。从你到目前为止所说的,它应该有效。您是否尝试在选择文件之前访问 filesCount ?您确定“FlashFilesUpload1”是 Flash 对象的正确 ID(尤其是在您使用多个上传对象时)。如果您提供一些示例 HTML 和 javascript 会有所帮助 不,这没有任何区别... :( 无论如何,useExternalInterface 的默认值为 true。我将尝试使用 MultiPowUpload 提供的对象脚本,看看这对我有什么帮助...顺便说一句,即使它仍然没有成功,非常感谢您的帮助 - 谢谢! 好吧,按照建议,我设法使用网站上的 embedSWF() 东西使控件正常工作 - 但 javascript 界面仍然无法工作......我无法获得一个成员MultiPowUpload 接口的工作 - 不是属性,不是方法 - 无论我是通过将其嵌入为 还是使用 embedSWF() 来实现它似乎都没有任何区别。即使在简单的“Hello World”类型测试中,您是否设法让它响应 javascript 调用? 我已经用我用来使其工作的代码更新了我的答案。如果您没有将 useExternalInterface 显式设置为 Yes,我的代码将不起作用。文档默认情况下可能是错误的。

以上是关于在 JavaScript 中寻址 Shockwave Flash 对象 (MultiPowUpload) 的属性的主要内容,如果未能解决你的问题,请参考以下文章

指令寻址方式主要是哪两种

什么是立即数寻址

计算机中常用的寻址方式有哪几种

5.2-寻址方式

9.ARM寻址方式

8088/8086的数据寻址方式