PDA

Просмотр полной версии : addEventListener не является функцией


PesaDelo
23.05.2013, 13:21
Здравствуйте.
Есть код:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class btnInputMl1 extends MovieClip
{
public function btnInputMl1()
{
this.addEventListener(MouseEvent.CLICK, clickHandler);
}
public function clickHandler(e:MouseEvent):void
{
pasword();
}
public function pasword()
{
this.removeEventListener(MouseEvent.CLICK,clickHandler);
var textFormat:TextFormat = new TextFormat();
textFormat.font = "Calibri";
textFormat.color = 0x000000;
textFormat.size = 25;
var w:qwerty = new qwerty();
addChild(w);
var r:window = new window();
addChild(r);
var t:winpass = new winpass();
t.x = 65;
t.y = -100;
addChild(t);
var u:PassTxt = new PassTxt();
u.x = -120;
u.y = -100;
addChild(u);
var muu:TextField = new TextField();
muu.setTextFormat(textFormat);
addChild(muu);

muu.type = TextFieldType.INPUT;
muu.height = 42;
muu.width = 167;
muu.x = -20;
muu.y = -122;
muu.displayAsPassword = true;
//muu.border = true;
var a:vx = new vx();
a.x = 0;
a.y = 0;
a.buttonMode = true;
addChild(a);
var wx:bbbtttnnn = new bbbtttnnn();
addChild(wx);
wx.x = 190;
wx.y = -157;
wx.addEventListener(MouseEvent.CLICK, exit);
function exit(e:MouseEvent):void
{
removeChild(w);
removeChild(r);
removeChild(t);
removeChild(u);
removeChild(muu);
removeChild(a);
removeChild(wx);
this.addEventListener(MouseEvent.CLICK, nnn);
function nnn(e:MouseEvent):void
{
pasword();
this.removeEventListener(MouseEvent.CLICK, nnn);
}
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);

trace("1");
}
a.addEventListener(MouseEvent.CLICK, loginFunction);

function loginFunction(e:MouseEvent):void
{
if (muu.text == "1")
{

trace("Complit!");
}
else
{
trace("неверный пароль");
}
}
}

}
}
При нажатии кнопки на сцене появляется окно с текстовым полем для ввода пароля, копка входа и и кнопка выхода из окна входа.
При нажатии кнопки выхода из окна входа убирается окно входа, но при повторном нажатии на кнопку на сцене флеш выдаёт ошибку:

TypeError: Error #1006: addEventListener не является функцией.
at MethodInfo-31()

И почему-то к полю ввода пароля не применяются шрифты.

Подскажите как это исправить.
Заранее спасибо.

Rzer
23.05.2013, 13:35
Вынесите функции exit и loginFunction в класс и будет вам счастье. Чтобы применить формат нужно вместо строки muu.setTextFormat(textFormat); написать строку muu.defaultTextFormat = textFormat;

PesaDelo
23.05.2013, 13:47
Шрифты пременились. Спасибо. А со слушателем проблема.
Сделал как вы сказали:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class btnInputMl1 extends MovieClip
{
public function btnInputMl1()
{
this.addEventListener(MouseEvent.CLICK, clickHandler);
}
public function clickHandler(e:MouseEvent):void
{
pasword();
}
public function pasword()
{
this.removeEventListener(MouseEvent.CLICK,clickHandler);
var textFormat:TextFormat = new TextFormat();
textFormat.font = "Calibri";
textFormat.color = 0x000000;
textFormat.size = 30;
var w:qwerty = new qwerty();
addChild(w);
var r:window = new window();
addChild(r);
var t:winpass = new winpass();
t.x = 65;
t.y = -100;
addChild(t);
var u:PassTxt = new PassTxt();
u.x = -120;
u.y = -100;
addChild(u);
var muu:TextField = new TextField();
muu.defaultTextFormat = textFormat;
addChild(muu);
muu.type = TextFieldType.INPUT;
muu.height = 42;
muu.width = 167;
muu.x = -20;
muu.y = -122;
muu.displayAsPassword = true;
//muu.border = true;
var a:vx = new vx();
a.x = 0;
a.y = 0;
a.buttonMode = true;
addChild(a);
var wx:bbbtttnnn = new bbbtttnnn();
addChild(wx);
wx.x = 190;
wx.y = -157;
wx.addEventListener(MouseEvent.CLICK, exit);

a.addEventListener(MouseEvent.CLICK, loginFunction);


}
public function exit(e:MouseEvent):void
{
removeChild(w);
removeChild(r);
removeChild(t);
removeChild(u);
removeChild(muu);
removeChild(a);
removeChild(wx);
this.addEventListener(MouseEvent.CLICK, nnn);
function nnn(e:MouseEvent):void
{
pasword();
this.removeEventListener(MouseEvent.CLICK, nnn);
}
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);

trace("1");
}
public function loginFunction(e:MouseEvent):void
{
if (muu.text == "1")
{

trace("Complit!");
}
else
{
trace("неверный пароль");
}
}

}
}
Теперь он выдает такие ошибки:
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 63 1120: Обращение несуществующего свойства w.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 64 1120: Обращение несуществующего свойства r.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 65 1120: Обращение несуществующего свойства t.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 66 1120: Обращение несуществующего свойства u.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 67 1120: Обращение несуществующего свойства muu.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 68 1120: Обращение несуществующего свойства a.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 69 1120: Обращение несуществующего свойства wx.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 76 1120: Обращение несуществующего свойства wx.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 77 1120: Обращение несуществующего свойства a.
C:\Users\Mixail\Desktop\es\btnInputMl1.as, строка 83 1120: Обращение несуществующего свойства muu.

СлаваRa
23.05.2013, 13:52
Конечно, откуда у вас в методе exit возьмутся локальные переменные из метода pasword.
Плюс к этому в методах типа nnn, this нет и не было, тоже будет ошибка.

PesaDelo
23.05.2013, 14:04
Как исправить то.
Можно ли добавить как-то в метод типа nnn this.

Rzer
23.05.2013, 16:31
Видимо ты раньше кодил на js. Во Flash все переменные, которые ты планируешь использовать в нескольких местах нужно объявлять в начале класса. Почитай про области видимости переменных. Функции внутри функций лучше не создавать. Их нужно объявлять на одном уровне - уровне класса.

PesaDelo
23.05.2013, 17:20
Объявил переменные на уровне класса:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class btnInputMl1 extends MovieClip
{
public static var e:qwerty;
public static var r:window;
public static var t:winpass;
public static var u:PassTxt;
public static var muu:TextField;
public static var a:vx;
public static var wx:bbbtttnnn;

public function btnInputMl1()
{
this.addEventListener(MouseEvent.CLICK, clickHandler);

}
public function clickHandler(e:MouseEvent):void
{
pasword();
}
public function pasword()
{
this.removeEventListener(MouseEvent.CLICK,clickHandler);
var textFormat:TextFormat = new TextFormat();
textFormat.font = "Calibri";
textFormat.color = 0x000000;
textFormat.size = 30;
btnInputMl1.e = new qwerty();
addChild(btnInputMl1.e);
btnInputMl1.r = new window();
addChild(btnInputMl1.r);
btnInputMl1.t = new winpass();
btnInputMl1.t.x = 65;
btnInputMl1.t.y = -100;
addChild(btnInputMl1.t);
btnInputMl1.u = new PassTxt();
btnInputMl1.u.x = -120;
btnInputMl1.u.y = -100;
addChild(btnInputMl1.u);
btnInputMl1.muu = new TextField();
muu.defaultTextFormat = textFormat;
addChild(muu);
muu.type = TextFieldType.INPUT;
muu.height = 42;
muu.width = 167;
muu.x = -20;
muu.y = -122;
muu.displayAsPassword = true;
btnInputMl1.a = new vx();
btnInputMl1.a.x = 0;
btnInputMl1.a.y = 0;
btnInputMl1.a.buttonMode = true;
addChild(btnInputMl1.a);
btnInputMl1.wx = new bbbtttnnn();
addChild(btnInputMl1.wx);
btnInputMl1.wx.x = 190;
btnInputMl1.wx.y = -157;
btnInputMl1.wx.addEventListener(MouseEvent.CLICK, exit);
btnInputMl1.a.addEventListener(MouseEvent.CLICK, loginFunction);
}
public function exit(e:MouseEvent):void
{
removeChild(btnInputMl1.e);
removeChild(btnInputMl1.r);
removeChild(btnInputMl1.t);
removeChild(btnInputMl1.u);
removeChild(btnInputMl1.muu);
removeChild(btnInputMl1.a);
removeChild(btnInputMl1.wx);
this.addEventListener(MouseEvent.CLICK, nnn);
function nnn(e:MouseEvent):void
{
pasword();
this.removeEventListener(MouseEvent.CLICK,nnn);
}
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);
trace("myau!!!!!");
}
public function loginFunction(e:MouseEvent):void
{
if (muu.text == "qwerty")
{
trace("Complit!");
}
else
{
var lkj:qwerty = new qwerty();
addChild(lkj);
var ghj:ancorrectPassword = new ancorrectPassword();
addChild(ghj);
var ert:bbbtttnnn = new bbbtttnnn();
addChild(ert);
ert.x = 150;
ert.y = -70;
ert.addEventListener(MouseEvent.CLICK, kkk);
function kkk(e:MouseEvent):void
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
ert.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
function onKeyboardDown(event:KeyboardEvent):void
{
if (event.keyCode == 27)
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
}
}
}
}
}
Но всё равно появляется ошибка:
TypeError: Error #1006: removeEventListener не является функцией.
at MethodInfo-31()

как в nnn добавить this?

а если сделать так:
public function exit(e:MouseEvent):void
{
removeChild(btnInputMl1.e);
removeChild(btnInputMl1.r);
removeChild(btnInputMl1.t);
removeChild(btnInputMl1.u);
removeChild(btnInputMl1.muu);
removeChild(btnInputMl1.a);
removeChild(btnInputMl1.wx);
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);
trace("myau!!!!!");
this.addEventListener(MouseEvent.CLICK, nnn);
}
public function nnn(e:MouseEvent):void
{
pasword();
this.removeEventListener(MouseEvent.CLICK,nnn);
}
то при нажимании на кнопку закрытия окна входа ничего не происходит.

СлаваRa
23.05.2013, 17:30
Где у вас ошибка с лога не понятно, разбираться в этом ужасе желания нет.
как в nnn добавить this?
Можно не добавлять его туда вообще, сработает как надо и без this.
Анонимки\замыкания не надо! использовать в подписках на события мыша.
Имена типа bbbtttnnn - это просто ужас, как можно работать с таким кодом, непонятно(
И this'ы у вас не по месту используются, лучше уберите их совсем

PesaDelo
23.05.2013, 18:03
Убрал this:
public function exit(e:MouseEvent):void
{
removeChild(btnInputMl1.e);
removeChild(btnInputMl1.r);
removeChild(btnInputMl1.t);
removeChild(btnInputMl1.u);
removeChild(btnInputMl1.muu);
removeChild(btnInputMl1.a);
removeChild(btnInputMl1.wx);
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);
trace("myau!!!!!");
addEventListener(MouseEvent.CLICK, clickHandler);
}
public function clickHandler(e:MouseEvent):void
{
pasword();
removeEventListener(MouseEvent.CLICK,clickHandler);
}
Всё равно при нажимании на кнопку закрытия окна входа, ничего не происходит.

СлаваRa
23.05.2013, 18:06
а trace("myau!!!!!"); срабатывает?


addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent):void
{
pasword();
removeEventListener(MouseEvent.CLICK,clickHandler);
}

можно заменить на

addEventListener(MouseEvent.CLICK, clickHandler);

убрав никчемную локальную функцию

PesaDelo
23.05.2013, 18:08
Да срабатывает.

Добавлено через 24 минуты
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;

public class btnInputMl1 extends MovieClip
{
public static var e:qwerty;
public static var r:window;
public static var t:winpass;
public static var u:PassTxt;
public static var muu:TextField;
public static var a:vx;
public static var wx:bbbtttnnn;

public function btnInputMl1()
{
addEventListener(MouseEvent.CLICK, clickHandler);

}
public function clickHandler(e:MouseEvent):void
{
pasword();
removeEventListener(MouseEvent.CLICK,clickHandler);
}
public function pasword()
{

btnInputMl1.wx.addEventListener(MouseEvent.CLICK, exit);
btnInputMl1.a.addEventListener(MouseEvent.CLICK, loginFunction);
}
public function exit(e:MouseEvent):void
{
removeChild(btnInputMl1.e);
removeChild(btnInputMl1.r);
removeChild(btnInputMl1.t);
removeChild(btnInputMl1.u);
removeChild(btnInputMl1.muu);
removeChild(btnInputMl1.a);
removeChild(btnInputMl1.wx);
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);
trace("myau!!!!!");
addEventListener(MouseEvent.CLICK, clickHandler);
}

public function loginFunction(e:MouseEvent):void
{
if (muu.text == "qwerty")
{
trace("Complit!");
}
else
{
var lkj:qwerty = new qwerty();
addChild(lkj);
var ghj:ancorrectPassword = new ancorrectPassword();
addChild(ghj);
var ert:bbbtttnnn = new bbbtttnnn();
addChild(ert);
ert.x = 150;
ert.y = -70;
ert.addEventListener(MouseEvent.CLICK, kkk);
function kkk(e:MouseEvent):void
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
ert.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
function onKeyboardDown(event:KeyboardEvent):void
{
if (event.keyCode == 27)
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
}
}
}
}
}
Тоже самое(((
при нажимании на кнопку закрытия окна входа, ничего не происходит.
только trace("myau!!!!!"); срабатывает.

СлаваRa
23.05.2013, 20:11
А что должно происходить?

PesaDelo
24.05.2013, 15:12
Получилось:yahoo: ! ! !
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;

public class btnInputMl1 extends MovieClip
{
public static var e:qwerty;
public static var r:window;
public static var t:winpass;
public static var u:PassTxt;
public static var muu:TextField;
public static var a:vx;
public static var wx:bbbtttnnn;

public function btnInputMl1()
{
addEventListener(MouseEvent.CLICK, clickHandler);


}
public function clickHandler(e:MouseEvent):void
{
pasword();
removeEventListener(MouseEvent.CLICK,clickHandler);
}
public function pasword()
{
var textFormat:TextFormat = new TextFormat();
textFormat.font = "Calibri";
textFormat.color = 0x000000;
textFormat.size = 30;
btnInputMl1.e = new qwerty();
addChild(btnInputMl1.e);
btnInputMl1.r = new window();
addChild(btnInputMl1.r);
btnInputMl1.t = new winpass();
btnInputMl1.t.x = 65;
btnInputMl1.t.y = -100;
addChild(btnInputMl1.t);
btnInputMl1.u = new PassTxt();
btnInputMl1.u.x = -120;
btnInputMl1.u.y = -100;
addChild(btnInputMl1.u);
btnInputMl1.muu = new TextField();
muu.defaultTextFormat = textFormat;
addChild(muu);
muu.type = TextFieldType.INPUT;
muu.height = 42;
muu.width = 167;
muu.x = -20;
muu.y = -122;
muu.displayAsPassword = true;
btnInputMl1.a = new vx();
btnInputMl1.a.x = 0;
btnInputMl1.a.y = 0;
btnInputMl1.a.buttonMode = true;
addChild(btnInputMl1.a);
btnInputMl1.wx = new bbbtttnnn();
addChild(btnInputMl1.wx);
btnInputMl1.wx.x = 190;
btnInputMl1.wx.y = -157;
btnInputMl1.wx.addEventListener(MouseEvent.CLICK, exit);
btnInputMl1.a.addEventListener(MouseEvent.CLICK, loginFunction);
}
public function exit(e:MouseEvent):void
{
removeChild(btnInputMl1.e);
removeChild(btnInputMl1.r);
removeChild(btnInputMl1.t);
removeChild(btnInputMl1.u);
removeChild(btnInputMl1.muu);
removeChild(btnInputMl1.a);
removeChild(btnInputMl1.wx);
wx.removeEventListener(MouseEvent.CLICK, exit);
a.removeEventListener(MouseEvent.CLICK, loginFunction);
var delay:int = 2;
var repeat:int = 1;
var t:Timer = new Timer(delay,repeat);
t.addEventListener(TimerEvent.TIMER_COMPLETE, sleepingFunction);
//
function sleepingFunction(event:TimerEvent):void
{
addEventListener(MouseEvent.CLICK, clickHandler);
}
//
t.start();
}

public function loginFunction(e:MouseEvent):void
{
if (muu.text == "qwerty")
{
trace("Complit!");
}
else
{

}
}
public function complitPassword()
{

}
public function badPassword()
{
var lkj:qwerty = new qwerty();
addChild(lkj);
var ghj:ancorrectPassword = new ancorrectPassword();
addChild(ghj);
var ert:bbbtttnnn = new bbbtttnnn();
addChild(ert);
ert.x = 150;
ert.y = -70;
ert.addEventListener(MouseEvent.CLICK, kkk);
function kkk(e:MouseEvent):void
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
ert.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
function onKeyboardDown(event:KeyboardEvent):void
{
if (event.keyCode == 27)
{
removeChild(lkj);
removeChild(ghj);
removeChild(ert);
ert.removeEventListener(MouseEvent.CLICK,kkk);
ert.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
}
}
}
}
}
Я просто добавил таймер на выполнение функции
addEventListener(MouseEvent.CLICK, clickHandler);

Александр Мостовой
25.05.2013, 02:15
Получилось :yahoo:! ! !
Я просто добавил таймер на выполнение функции

Ядерная зима уравновесила парниковый эффект и средняя температура по больнице стала нормальной?

В смысле не разобравшись в логике повдения кода такие решения - бомба замедленного действия. Сложно вам что-то подсказать по коду так как не ясно что за класс, bbbtttnnn, например и другие. К тому же MovieClip в отличие от Sprite имеет динамический тип допускающий обращение к несуществующим свойствам поэтому одни баги могли просто накладываться на другие. ПОведение флеша строго детерменировано и если что-то не работало, то это не значит что где-то у баузера был баг, а значит что где-то что-то упустили о чем вам и пытался подсказать компилятор.
Рекомендую вернуться назад и найти в чем причина иначе неприрывно будете ловить призраки невидимых багов.
К тому же рекомендую все свойства и метода по умолчанию писать в приват и открывать их лишь по мере необходимости.
Ну и самое главное соблюдать соглашения по написанию кода. http://sourceforge.net/adobe/flexsdk/wiki/Coding%20Conventions/ Начать хотя бы с именования классов с больших букв иначе окружающим сложно будет вам подсказать что-то по делу. Ей богу лучше бы уж переменные были названы цифрами по порядку чем в результате случайного нажатия ghj lkj