Просмотр полной версии : разные данные из xml в одно динамическое поле
Здравствуйте всем! Ещё раз обращаюсь сюда за помощью!
Опять никак не могу найти и понять, как решить свою проблему... :(
Мне нужно, чтобы при наведении на разные мувиклипы в одно единственное динамическое текстовое поле выводилась разная информация из xml-файла (типа всплывающей подсказки).
Два мувиклипа: mcA и mcВ. И еще мувиклип с самим текстовым полем - mсTxt.
Наводим на mcA, и в поле выводится "НадписьА". Наводим на mcВ, и в поле выводится "НадписьВ".
Ничего не получается... Помогите, пожалуйста, разобраться... :(
public class Primer extends MovieClip {
public function Primer() {
mсTxt.visible=false; //мувиклип с текстом
mcA.addEventListener(MouseEvent.MOUSE_OVER,over);
mcA.addEventListener(MouseEvent.MOUSE_OUT,out);
mcB.addEventListener(MouseEvent.MOUSE_OVER,over);
mcB.addEventListener(MouseEvent.MOUSE_OUT,out);
function over(e:MouseEvent) {
mсTxt.visible=true;
}
function out(e:MouseEvent) {
mсTxt.visible=false;
}
var xmlPath:String="primerXML.xml";
var loader = new URLLoader();
loader.load(new URLRequest(xmlPath));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
}
private function xmlLoaded(event:Event):void {
var xml = new XML(event.target.data);
if (mcA.rollOver) {
mсTxt.txt1.text = xml.*.text()[1]; //txt1 - это имя текстового поля в мувиклипе mсTxt
}
if (mcB.rollOver) {
mсTxt.txt1.text = xml.*.text()[2];
}
}
}
Не пойму, как правильно сделать условие if (mcA.rollOver)...
tsarapkabel
15.04.2011, 00:41
Убери rollOver :)
В функции over надо проверять условие. Если e.target = mcA, то показать текст A. Если e.target = mcB, то показать текст B.
Тааак... сейчас попробую разобраться... Спасибо большое за подсказку!
Добавлено через 8 минут
Что-то я запуталась...
function over(e:MouseEvent) {
mсTxt.visible=true;
if (e.target = mcA) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target = mcB) {
mсTxt.txt1.text = xml.*.text()[2];
}
}
private function xmlLoaded(event:Event):void {
var xml = new XML(event.target.data);
mсTxt.txt1.text = xml.*.text()[1];
}
Так как-то что-ли? :(
Не надо объявлять функции в конструкторе, это очень плохо. Вынесите хендлеры (обработчики) over и out наружу из конструктора в тело Класса, объявите как private function. Не бойтесь, они будут видны всем остальным членам Класса. Запомните на будущее - засовывать функцию внутрь другой функции – нехорошо!))
tsarapkabel
15.04.2011, 00:57
1 засунь XML данные в переменную.
2 проверяй на over, только
== //равенство
= //присвоение
Ох... много советов сразу, сейчас попробую понять... :)
Спасибо, что помогаете! :)
Добавлено через 6 минут
А как сделать "засунь XML данные в переменную"?
Помогите, пожалуйста, пока не доходит... :(
Сейчас, ещё раз проверю...
tsarapkabel
15.04.2011, 01:18
Это я глупость сказал. XML уже в переменной
var xml = new XML(event.target.data);
В чём теперь проблема, так работает?
if (e.target.name == mcA) {
mсTxt.txt1.text = xml.*.text()[1];
}
else if (e.target.name == mcB) {
mсTxt.txt1.text = xml.*.text()[2];
}
Что-то не пойму ничего...
1120: Access of undefined property xml
Добавлено через 6 минут
Пока не работает... :(
tsarapkabel
15.04.2011, 01:41
Потому что переменная xml объявлена только в функции xmlLoaded.
Надо создать глобальную переменную
package {
import ...
public class Main extends MovieClip {
private var xmlVar:XML = new XML();
public function Main() {}
}
}
И уже потом var не писать, а сразуxml = new XML(event.target.data);
Сейчас попробую...
Добавлено через 5 минут
Ошибок вроде не выдаёт, но изменений в текстовом поле тоже нет при наведении на разные мувиклипы.
tsarapkabel
15.04.2011, 01:56
Исходник в студию.
tsarapkabel
15.04.2011, 02:27
package pr {
import flash.display.*;
import flash.events.*;
import flash.net.*;
public class Primer extends MovieClip {
private var xml:XML = new XML();
public function Primer() {
mсTxt.visible = false;
mcA.addEventListener(MouseEvent.MOUSE_OVER, over);
mcA.addEventListener(MouseEvent.MOUSE_OUT, out);
mcB.addEventListener(MouseEvent.MOUSE_OVER, over);
mcB.addEventListener(MouseEvent.MOUSE_OUT, out);
var xmlPath:String = "primerXML.xml";
var loader = new URLLoader();
loader.load(new URLRequest(xmlPath));
loader.addEventListener(Event.COMPLETE, xmlLoaded);
}
private function xmlLoaded(event:Event):void {
xml = new XML(event.target.data);
}
private function over(e:MouseEvent):void {
mсTxt.visible = true;
if (e.target.name == "mcA") {
mсTxt.txt1.text = xml.*.text()[0];
} else if (e.target.name == "mcB") {
mсTxt.txt1.text = xml.*.text()[1];
}
}
private function out(e:MouseEvent) {
mсTxt.visible = false;
}
}
}
О!!! Вы - гений!!! Теперь работает!!! СПА-СИ-БО!!!
Как бы я без вас... :yahoo:
tsarapkabel, хотелось бы узнать: а что было-то?
А можно ещё поинтересоваться?
Если из мувиклипов сделать массив, как писать вот тут, вместо имени мувиклипа?
if (e.target.name == "oneArray[0]") { //?
mсTxt.txt1.text = xml.*.text()[1];
}
В общем выходит ошибка #1069: Не удалось найти свойство mcA в pr.Primer; отсутствует значение по умолчанию.
tsarapkabel
15.04.2011, 12:51
...а что было-то?Было сравнение:e.target.name == mcAТо есть строка сравнивалась с объектом, условие не выполнялось.
...как писать вот тут...Полагаю, что:(e.target.name == oneArray[0].name).
Здравствуйте ещё раз. Спасибо, что помогаете!
Но пока что-то опять не работает...
Может где в другом ошибка... :(
public class Primer extends MovieClip {
private var oneArray:Array = new Array("mcA", "mcB", "mcC");
const number:uint = oneArray.length;
public function Primer() {
for (var i:uint = 0; i <number; i++) {
this[oneArray[i]].addEventListener(MouseEvent.MOUSE_OVER,over);
}
}
private function over(e:MouseEvent) {
if (e.target.name == oneArray[0].name) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target.name == oneArray[1].name) {
mсTxt.txt1.text = xml.*.text()[2];
}
if (e.target.name == oneArray[2].name) {
mсTxt.txt1.text = xml.*.text()[0];
}
}
}
#1069: Не удалось найти свойство mcA в pr.Primer; отсутствует значение по умолчанию. :(
1. if (e.target.name == oneArray[0].name)
oneArray[0] это уже строка, у нее нет свойства name. Вобщем, это уже и есть name. Ваш массив хранит имена, а не ссылки на клипы.
2. Почему this[oneArray[i]] не находит mcA, mcB и mcC - я не знаю. А на чем мы там остановились в начале - класс видел клип, если написать просто mcA, или надо было искать его по имени как getChildByName("mcA") ?
Не, если массив не использовать, то всё прекрасно работает (без getChildByName("mcA")).
Или не поняла. В общем, если написать "mcA", то работет.
То есть, если написать
public function Primer() {
this["mcA"].addEventListener(MouseEvent.MOUSE_OVER,over);
this.mcB.addEventListener(MouseEvent.MOUSE_OVER,over);
mcC.addEventListener(MouseEvent.MOUSE_OVER,over);
} то ошибки не будет?
Сейчас попробую и скажу :)
Вот третий вариант - точно работает. Вернее mc.mcC
Добавлено через 7 минут
Работает только такой вариант:
mc.mcA.addEventListener(MouseEvent.MOUSE_OVER,over);
if (e.target.name == "mcA")
Ну замечательно)) Стало быть
public class Primer extends MovieClip {
private var oneArray:Array = new Array("mcA", "mcB", "mcC");
const number:uint = oneArray.length;
public function Primer() {
for (var i:uint = 0; i <number; i++) {
mc[oneArray[i]].addEventListener(MouseEvent.MOUSE_OVER,over);
}
}
private function over(e:MouseEvent) {
if (e.target.name == oneArray[0]) {
mсTxt.txt1.text = xml.*.text()[1];
}
if (e.target.name == oneArray[1]) {
mсTxt.txt1.text = xml.*.text()[2];
}
if (e.target.name == oneArray[2]) {
mсTxt.txt1.text = xml.*.text()[0];
}
}
}
Сейчас попробую. :)
Добавлено через 2 минуты
О! Походу работаееет!!! :)
Какие же вы молодцы!!! Большооое вам спасибо!!! :)
P.S. Можно ещё один маленький вопросик? Почему swf может не работать правильно в браузере?
У нас тут действует правило - одна тема = один вопрос. Это для удобства всех. Соблюдайте пожалуйста. Тем более что Ваш вопрос совсем не маленький. Если коротко - политики безопасности флэш-плеера и интернет-браузера. Не имеющие смысла, когда Вы тестируете собственный проект в среде разработки и можете "навредить" только сами себе.
Хорошо. Спасибо большущее за помощь!!! Я вам ОЧЕНЬ БЛАГОДАРНА!!! :yahoo:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.