Загрузка XML-файла из-за пределов SWF-файла во Flash

Веб-сайт, над которым я работаю (использую AS2, потому что это старая школа), имеет больший индексный файл .swf, который загружает под-swf с помощью loadMovie("foo1.swf", placeToShowSwf). Есть foo1.swf через 4, что глупо, потому что единственное, что между ними отличается, - это одно число в адресе XML-файла, которое сообщает ему, какой контент загружать. Поэтому я хочу сократить это до одного файла с помощью простой функции, которую индексный файл вызывает для загрузки файла xml, как показано здесь.

function setFooNum(i:Number) {
   fooNum = i;
   //my_xml = new XML();  edit: this line has since been removed and is kept for historical purposes
   my_xml.load("foo"+fooNum+".xml");
};

Однако по какой-то причине файл xml не загружается. Он правильно загружается вне функции, но мне от этого мало пользы. Он правильно меняет fooNum, но это не приносит мне никакой пользы, если уже загружается неправильный xml-файл. Насколько я могу судить, код ведет себя так, как будто my_xml.load("foo"+fooNum+".xml") вообще отсутствует.

Это какая-то мера безопасности, о которой я не знаю, и есть ли способ ее обойти?

РЕДАКТИРОВАТЬ Как указали несколько человек, виновником была линейка my_xml = new XML(). К сожалению, теперь я получаю новую интересную ошибку. Когда setFooNum(i) вызывается сразу после loadMove() в индексном файле, trace(fooNum) внутри функции setFooNum() печатает, что fooNum установлен правильно, но trace(fooNum) внутри onLoad() (который возвращает успех, несмотря на очевидную загрузку, кстати) показывает, что fooNum не определено! Кроме того, я сделал кнопку в индексном swf, которая вызывает setFooNum(3) (для целей отладки), что по какой-то причине заставляет его работать нормально. Таким образом, ожидание загрузки файла в течение нескольких секунд, похоже, решает проблему, но это невероятно уродливое решение.

Итак, как мне дождаться, пока все полностью загрузится, прежде чем вызывать setFooNum()?

Предоставьте весь источник, который вы упоминаете в своей редакции, без него сложно помочь.

Cory Petosky 13.11.2009 12:55

Можете ли вы опубликовать, как выглядит ваш onLoad? fooNum не является глобальной переменной, поэтому внутри вашего onLoad fooNum не будет распознан. Это проблема с переменной областью видимости.

milesmeow 21.11.2009 21:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
2
3 426
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваша функция каждый раз создает новый экземпляр XML, и в результате вам нужно будет каждый раз определять функцию onLoad, если вы повторно используете один и тот же экземпляр XML, вам не нужно будет повторно определять функцию, например

var iFooNum:Number;
var oXML:XML = new XML();

oXML.onLoad = function (success:Boolean) {
  if (success) {
    //Do Something with XML.
  }
}

loadFooNum = function(i:Number) {
  iFooNum = i;
  oXML.load("foo" + i + ".xml");
}

Если вы загружаете XML-файл из другого домена, вам понадобится файл crossdomain.xml в другом домене, чтобы флеш-память могла загружать XML-файл.

onLoad определяется в другом месте. my_xml.load работает, когда он не вызывается в функции, но мне нужно изменить загружаемый XML-файл, а затем загрузить его.

mgbennet 28.10.2008 21:35

но вы создаете новый экземпляр в своей функции, и в результате onLoad не определен.

Ady 28.10.2008 21:37

Ты прав. Это было глупо с моей стороны. Но теперь у меня другая ошибка. Если я вызываю setFooNum (i) сразу после loadMovie (), swf получает один из тех: «Сценарий заставляет ваш компьютер работать медленно. Отменить?» ошибки, которые, как я полагаю, означают бесконечный цикл или сбой. В любом случае обновил свой вопрос.

mgbennet 29.10.2008 21:06

Предполагая, что вы определили обработчик событий onLoad для своего экземпляра XML вне функции, вы можете удалить объявление экземпляра из тела функции:

function setFooNum(i:Number) {
    fooNum = i;
    my_xml.load("foo"+fooNum+".xml");
};

Этот туториал на сайте kirupa может вам помочь.

http://www.kirupa.com/web/xml/index.htm

В нем объясняется, как работать с AS и XML. Надеюсь, это поможет вам получить ответ.

Ответ принят как подходящий

Возможно, вам стоит еще раз проверить, что у вас есть надлежащая авторизация в crossdomain.xml. Если ваш кроссдоменный файл взломан, ни один из ваших запросов не пройдет.

http://crossdomainxml.org/

Другие вопросы по теме