Веб-сайт, над которым я работаю (использую 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()?
Можете ли вы опубликовать, как выглядит ваш onLoad? fooNum не является глобальной переменной, поэтому внутри вашего onLoad fooNum не будет распознан. Это проблема с переменной областью видимости.





Ваша функция каждый раз создает новый экземпляр 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-файл, а затем загрузить его.
но вы создаете новый экземпляр в своей функции, и в результате onLoad не определен.
Ты прав. Это было глупо с моей стороны. Но теперь у меня другая ошибка. Если я вызываю setFooNum (i) сразу после loadMovie (), swf получает один из тех: «Сценарий заставляет ваш компьютер работать медленно. Отменить?» ошибки, которые, как я полагаю, означают бесконечный цикл или сбой. В любом случае обновил свой вопрос.
Предполагая, что вы определили обработчик событий 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. Если ваш кроссдоменный файл взломан, ни один из ваших запросов не пройдет.
Предоставьте весь источник, который вы упоминаете в своей редакции, без него сложно помочь.