Адресация свойств объекта Shockwave Flash (MultiPowUpload) в JavaScript - PullRequest
0 голосов
/ 08 мая 2009

Прошу прощения за тупой вопрос новичка; Я программировал Javascript только около 24 часов ... :)

Мне удалось (с некоторой внешней помощью) встроить в мою страницу объект ударной волны - в частности, MultiPowUpload 2.1 . Он хорошо отображается на странице и, кажется, работает правильно; мы можем принять эту часть как прочитанное.

Теперь я пытаюсь сделать некоторые более сложные вещи в JavaScript - у меня есть кнопка, а в коде onClick() у меня есть следующее:

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

Но в уведомлении говорится: "items: undefined". Это делает то же самое, если я устанавливаю itemsCount в swf.nonExistentProperty - все "неопределено". Но из того, что я прочитал в документации , определенно есть свойство filesCount. Я попытался получить доступ ко всем другим свойствам и методам этого объекта swf, и ни одно из них не работает, за исключением toString(), который возвращает «HTMLObjectElement».

Я явно обращаюсь к этому объекту неправильно, но что я делаю не так?


Разъяснение

В ответ на @ brianpeiris : я делаю это совсем не так, как на странице по ссылке , которую вы предложили . Я не делал этого с большим знанием, я просто веду себя как обезьяна, пытаюсь скопировать работающий код других людей, а затем настроить его так, чтобы он делал то, что я хочу ... так что не думайте, что я ничего знаю , как бы это ни было очевидно - помните, я занимался 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>

Как вы видите, он встроен в HTML как object, в отличие от ссылки, которую вы дали, где они делают другой трюк, используя скрипт, чтобы вывести его на страницу.

Кстати, когда я попробовал это по-своему (не очень сильно, даю вам), мне так и не удалось получить контроль даже на моей странице!

Спасибо за вашу помощь ... высоко ценится

1 Ответ

2 голосов
/ 08 мая 2009

Редактировать: Думаю, я наконец понял! Вы просто установили useExternalInterfaces на Yes.

Так что в вашем коде вы бы изменили

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

до

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

и сделайте то же самое для тега <embed>.

Если вы посещаете демонстрационный сайт и запускаете следующий код в Firebug, он возвращает 0 перед выбором файлов и правильный счет после выбора файлов. Кроме того, если вы проверите источник, вы увидите, что для параметра useExternalInterface установлено значение Yes

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

P.S. Вы должны рассмотреть возможность использования скрипта SWFObject, включенного в MultiPowUpload. Он позволяет легко устанавливать и изменять переменные, не беспокоясь о кросс-браузерных проблемах, а также изящно ухудшается для пользователей без флеш-памяти.


Дальнейшее редактирование Чтобы ответить на ваш комментарий: Да, у меня 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>
...