[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: фукция использует старые аргументы
PiratXXX
Здравствуйте знатаки!
Вообщем проблема такая (уже 5 дней бьюсь ни как не могу понять вчем дело).

Короче решил я сделать красивый выпадающий список(берущий инфу из БД), освоил технологию AJAX, сделал функцию которая создает выподающий список, и УРА все работает, и все как надо, НО радовался я не долго!!!

Проблема заключается в том когда я запускаю функцию создания списка(select) НО не один раз, а к примеру ДВА, то первай select создаеться но он пустой, второй тоже создаеться и в нем какраз инфа из первого и из второго.

вот код:

ajax.js (тут вроде все норм, но на всякий случай)

/* AJAX */
$_AJAXRequest = function(Url) {
var HTTPRequest;
var RequestMethot = function() {}; // Функция определения метода передачи
var RequestShpt = function() {}; // Функция отправки данных
var RequestState = function() {}; // Функция обработки ответа
var DataAdapt = function() {}; // Функция обработки данных
var OnLoad = function() {}; // Функция (что будет выполняться пока ждем ответа)
var OnComplete = function() {}; // Функция (что будет выполняться когда получили результат)

this.OnLoad = function(Do) { OnLoad_Do = Do; }
this.OnComplete = function(Do1) { OnComplete_Do = Do1; }



this.RequestMethot = function() {
if(window.XMLHttpRequest) {
HTTPRequest = new XMLHttpRequest();
return true;
}
else if(window.ActiveXObject) {
HTTPRequest = new ActiveXObject('Microsoft.XMLHTTP');
return true;
}
else {
return false;
}
}


this.DataAdapt = function(Data) {
if(Data instanceof Object) {
var i = 0;
var ArrData = [];
for(var Key in Data) {
ArrData[i++] = encodeURIComponent(Key)+"="+encodeURIComponent(Data[Key]);
}
return ArrData.join('&');
}
else {
return Data;
}
}


RequestState = function() {
if(HTTPRequest.readyState == 4) {
OnComplete_Do(HTTPRequest.responseText);
}
else {
OnLoad_Do();
}
}


this.RequestShpt = function(Type, Data) {
if(this.RequestMethot()) {
if(Type == 'POST') {
Data = this.DataAdapt(Data);
HTTPRequest.open('post', Url, true);
HTTPRequest.onreadystatechange = RequestState;
HTTPRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
HTTPRequest.setRequestHeader('Content-length', Data.length);
HTTPRequest.setRequestHeader('Connection', 'close');
HTTPRequest.send(Data);
}
else if(Type == 'GET') {
// передача get
}
}
}

}



вот функция создания select

/* Select */
function Select(Parent, FileUrl, ValDef, POSTAct, Pick) {
var Parent = Parent ;//родительный див в который все будет помещаться
var FileUrl = FileUrl ;//файл приемник ajax
var ValDef = ValDef ;//текст который будет отображаться на селекте
var POSTAct = POSTAct ;//массив который будет передаваться методом ajax(т.е. че и откуда будем доставать из БД)
// Pick - функция которая запускаеться когда что-то выбрано.

var _AJAX = function() {};
var OnLoadMy = function() {};
var OnCompleteMy = function() {};

$_CreateElem(Parent, "div", {"class":"SelectPlace","id":Parent+"SelectPlace"}, "", "", "");
$_CreateElem(Parent+"SelectPlace", "div", {"class":"SelectTitle","id":Parent+"SelectTitle"}, "", ValDef, "");
$_CreateElem(Parent+"SelectPlace", "div", {'class':"SelectCont", "id":Parent+"SelectCont"}, "", "", "");

EvenCon = function(r,f, ObjId) {
$_TxtStage(ObjId, r+"SelectTitle");
var Id = ObjId.split(r);
ff = function() { f(Id[1]); };
ff(Id[1]);
};

EvenDoc = function(Pick, Parent, event) {
var Pick = Pick;
var Prnt = Parent;
var ObjId = $_GEet(event);
if(ObjId == Prnt+"SelectTitle") {
if($_DGEI(Prnt+"SelectCont")) {
if(($_DGEI(Prnt+"SelectCont").style.display == "none") || ($_DGEI(Prnt+"SelectCont").style.display == "")) {
$_DGEI(Prnt+"SelectCont").style.display = "block";
}
}
}

else {
if(($_DGEI(ObjId)) && ($_DGEI(ObjId).parentNode.id)) {
if($_DGEI(ObjId).parentNode.id == Prnt+"SelectCont") {
this.EvenCon(Prnt, Pick, ObjId);
}
}

$_DGEI(Prnt+"SelectCont").style.display = "none";
}
}
;

$_EventUse(document, "click", function() { EvenDoc(Pick, Parent, event); });

OnLoadMy = function() {
/* do nothing */
};
//функция кот. будет запускаться если есть ответ от ajax
OnCompleteMy = function(Inf) {//и вот тут-то все теряеться т.е. Parent принимает значение которое было передано второй раз(и так пологаю поэтомо и заноситься все то что должно быть в первом селекте во второй) alert(Parent);
var Inf = $_JSONfrom(Inf);
if(Inf) {
var i = 0;
for(var Key in Inf) {
i++;
var InfId = Inf[Key]['id'];
var InfVal = Inf[Key]['value'];
//создаем элемент
$_CreateElem(Parent+"SelectCont", "span", {"class":"SelectElem", "id":Parent+InfId}, "", InfVal, "");
}
if(i > 10) {
$_DGEI(Parent+"SelectCont").style.overflowY = "scroll";
}
}
}
;

var AJAX = new $_AJAXRequest(FileUrl);
AJAX.RequestShpt("POST", POSTAct);
AJAX.OnLoad(OnLoadMy);
AJAX.OnComplete(OnCompleteMy);
}


а вот так вызываем

<script type="text/javascript">
ResultPerson = function() {
// ну и тут всяко разно
}
ResultCountry = function(){
// ну и тут всяко разно
}
Select('Person', 'modules/access_db.php?id=person', '- Не выбрано -', 'act=person', ResultPerson);

Select('Country', 'modules/access_db.php?id=crc', '- Не выбрано -', 'act=country', ResultCountry);

</script>


вообщем ребята помогате пожалуйста,(просто бьюсь как рыба об лед), в долгу не останусь у меня там вроде что-то на вебмани есть если надо перекину))

блин ваще в печали я((((((((((((((((((((((((

а еще люди может там какие еще ошибки есть исправте..



Спустя 1 час, 17 минут, 44 секунды (16.03.2011 - 23:40) PiratXXX написал(а):
люди помогите пожалуйста!!! я заплачу.

я сейчас кончусь((((((((

Спустя 10 минут, 41 секунда (16.03.2011 - 23:51) Игорь_Vasinsky написал(а):
Слушай друг, так охота помоч - но так сказать - AJAX - не мой конёк.
Отпиши модерам в лички, так и так... помогите.

Спустя 14 минут, 31 секунда (17.03.2011 - 00:05) PiratXXX написал(а):
Игорь_Vasinsky

да блин я просто js тока начал учить. и тут дела не в AJAX, тут я так понял проблема в структуре, как-то не так запускаю функции, или что то в этом роде...

Просто теряеться значение аргумента которое используеться в функции которая запускаеться из функции ajax.

Спустя 10 часов, 30 минут, 33 секунды (17.03.2011 - 10:36) PiratXXX написал(а):
ну ладно.

Продолжаю свое рассуждение)

Получаеться когда функция OnCompleteMy которая передаеться в ajax AJAX.OnComplete(OnCompleteMy); запускаеться в этой самой функции ajax $_AJAXRequest, а эта функция запустаеться таким образом var AJAX = new $_AJAXRequest(FileUrl); значит new как бы обрубает зону видимости аргументов из функции Select('Person', 'modules/access_db.php?id=person', '- Не выбрано -', 'act=person', ResultPerson); ??? так что ли?

Спустя 1 час, 21 минута, 27 секунд (17.03.2011 - 11:57) Игорь_Vasinsky написал(а):
вот это всё меня и пугает, когда пишешь не сам, и читаешь чужой код - php - то ok, вот именно AJAX - страшно

Спустя 19 минут, 25 секунд (17.03.2011 - 12:16) Guest написал(а):
Игорь_Vasinsky и все остальные!!!

УРА!!!

Я нашел в чем проблема всетаки Игорь_Vasinsky спасибо тебе за то что ты сделал ударение на AJAX, и я начал проверять и эксперементировать, и о да я решил эту проблему!))))))))))))))))))))))))))))))

Вообщем смотрите:


/* AJAX */
$_AJAXRequest = function(Url) {
var HTTPRequest;
var RequestMethot = function() {}; // Функция определения метода передачи
var RequestShpt = function() {}; // Функция отправки данных
var RequestState = function() {}; // Функция обработки ответа
var DataAdapt = function() {}; // Функция обработки данных
var OnLoad = function() {}; // Функция (что будет выполняться пока ждем ответа)
var OnComplete = function() {}; // Функция (что будет выполняться когда получили результат)

[color=red][size=10]var OnComplete_Do;[/size][/color]

this.OnLoad = function(Do) { OnLoad_Do = Do; }
this.OnComplete = function(Do1) { OnComplete_Do = Do1; }



this.RequestMethot = function() {
if(window.XMLHttpRequest) {
HTTPRequest = new XMLHttpRequest();
return true;
}
else if(window.ActiveXObject) {
HTTPRequest = new ActiveXObject('Microsoft.XMLHTTP');
return true;
}
else {
return false;
}
}


this.DataAdapt = function(Data) {
if(Data instanceof Object) {
var i = 0;
var ArrData = [];
for(var Key in Data) {
ArrData[i++] = encodeURIComponent(Key)+"="+encodeURIComponent(Data[Key]);
}
return ArrData.join('&');
}
else {
return Data;
}
}


RequestState = function() {
if(HTTPRequest.readyState == 4) {
OnComplete_Do(HTTPRequest.responseText);
}
else {
OnLoad_Do();
}
}


this.RequestShpt = function(Type, Data) {
if(this.RequestMethot()) {
if(Type == 'POST') {
Data = this.DataAdapt(Data);
HTTPRequest.open('post', Url, true);
HTTPRequest.onreadystatechange = RequestState;
HTTPRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
HTTPRequest.setRequestHeader('Content-length', Data.length);
HTTPRequest.setRequestHeader('Connection', 'close');
HTTPRequest.send(Data);
}
else if(Type == 'GET') {
// передача get
}
}
}

}


то что красным и огромным его не было. я поставил и все стало на свои места.

А теперь огромная прозьба, люди объясните мне что это, и почему проблему вызывает??

ну я занаю что это объявление переменной, а если этого не сделать то переменная станет глобальной, ну вообщем чет я еще больше запутался...

Объясните мне глупенькому. А вроде сделал более менее сьезную функцию(ну для моего уровня во всяком случае), а такой мелочи запоролся...

Спустя 2 минуты, 26 секунд (17.03.2011 - 12:19) PiratXXX написал(а):
ну вы поняли то я написал! задрал инет отрубаться и ip менять.

вообщем вот что надо было сделать var OnComplete_Do;

Спустя 34 минуты, 59 секунд (17.03.2011 - 12:54) Игорь_Vasinsky написал(а):
Молодец! Вот таким и должен быть программист. Упорным и настойчевым!

var OnComplete_Do;

может это значит - что ты не только её объявил, а так как она у тебя юыла - ты просто обнулил её....

а глобальной она у тебя наверно и была (ты ранее её объявлял) - поэтому в следующей функции она и попадалась с прдидущим значением..

может так (я не больно вникал в код - всё с твоих слов)

Спустя 35 секунд (17.03.2011 - 12:54) Игорь_Vasinsky написал(а):
аватар бы сменил...

Спустя 10 минут, 29 секунд (17.03.2011 - 13:05) PiratXXX написал(а):
Игорь_Vasinsky
ну да впринципи так оно и есть, обнуляю ее.
ага.

а че плохой аватар?) вот если бы я не догнал в чем ошибка, вот так как на аватаре и рассуждалбы сегодня вечером о проблеме своей))))

Спустя 1 минута, 48 секунд (17.03.2011 - 13:07) Игорь_Vasinsky написал(а):
аватар - какой то не такой., не программистский.

Ну да - по сути - обнуление переменной и спасает весь твой замысел.

Спустя 1 минута, 43 секунды (17.03.2011 - 13:08) Игорь_Vasinsky написал(а):
У тебя сайт - мой web_and_wap@mail.ru - не принимает....


_____________
http://flibro.com/
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.