Адресация свойств объекта Shockwave Flash (MultiPowUpload) в JavaScript
Прошу прощения за тупой вопрос новичка; Я программировал Javascript только около 24 часов...:)
Мне удалось (с некоторой внешней помощью) встроить объект flashwave flash на мою страницу, в частности 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 " at all parameters values and
symbols "&" with the "%26" at URL values or & 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 " at all parameters values and symbols "&" with the "%26" at URL values or & 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 ответ
Редактировать: я думаю, я наконец понял это! Вы просто установили 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());
PS Вам следует рассмотреть возможность использования скрипта SWFObject, включенного в MultiPowUpload. Он позволяет легко устанавливать и изменять переменные, не беспокоясь о кросс-браузерных проблемах, а также изящно ухудшается для пользователей без Flash.
Дальнейшее редактирование Чтобы ответить на ваш комментарий: Да, у меня есть 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 " at all parameters values and
symbols "&" with the "%26" at URL values or & 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 " at all parameters values and symbols "&" with the "%26" at URL values or & 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>