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

时间:2009-05-08 07:32:09

标签: asp.net javascript flash shockwave

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

我已经设法(在一些外部帮助下)将一个shockwave flash对象嵌入到我的页面中 - 特别是MultiPowUpload 2.1。它在页面上显得很好,似乎运行正常;我们可以将这部分视为已阅读。

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

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

但警告声明告诉我“items:undefined”。如果我将itemsCount设置为swf.nonExistentProperty,它也是一样的 - 一切都是“未定义的”。但是从我在documentation中读到的内容来看,肯定有一个filesCount属性。我尝试访问此swf对象的所有其他属性和方法,除了返回“HTMLObjectElement”的toString()之外,它们都不起作用。

我显然错误地解决了这个问题 - 但我做错了什么?


澄清

回复@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" width="450" height="350" flashvars="uploadButtonVisible=false&uploadUrl=../ReceiveBulkCases.aspx">
</embed>
        </object>

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

顺便说一句,当我按照自己的方式尝试时(不是很难,我授予你),我甚至无法控制甚至出现在我的页面上!

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

1 个答案:

答案 0 :(得分:2)

编辑:我想我终于搞清楚了!您只需将useExternalInterfaces设置为Yes

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

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

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

并对<embed>标记执行相同操作。

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

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

P.S。您应该考虑使用MultiPowUpload附带的SWFObject脚本。它允许您轻松设置和更改变量,而无需担心跨浏览器问题,并且对于没有闪存的用户,它也会优雅地降级。


进一步修改 回答你的评论:是的,我已经filesCount在我的机器上工作了。

我忘记提到的一件事是,您可能在闪存控件完全加载之前尝试检索filesCount

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

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

<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" width="450" height="350" 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>