Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.10.2008, 18:59
Новичок на форуме
Отправить личное сообщение для avtor01 Посмотреть профиль Найти все сообщения от avtor01
 
Регистрация: 28.10.2008
Сообщений: 6

Последовательное выполнение кода
Здравствуйте, уважаемые...

Возникла проблема такого рода.
При выполнении данного кода Firefox не дожидается окончания выполнения функции BackReplice(), а продолжает выполнять код.
var xmlHttp;
var t;

function click_and_edit (nl) 
{
if (t != null)
{
	BackReplice(); //Если уже открыта для редактирования строка таблицы, то вызывается функция BackReplice(), которая ее должна предварительно закрыть перед тем, как можно будет редактировать новую строку.

}
t = n;
color=col;
id = i_d;
quer = q_uer;
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
 {
 alert ("Browser does not support HTTP Request")
 return
 }
var row = 'row'+n;
xmlHttp.onreadystatechange=stateChangedEditOn; 
xmlHttp.open("post","ajax_edit.php",true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send("quer="+quer+"&id="+id);
}


Подскажите, возможно ли как-то заставить сначала выполниться код функции BackReplice(), а только потом остальной код функции click_and_edit()?

PS: С помощью данных функций (могу привести их листинг, если потребуется), я редактирую строки таблицы без перезагрузки всей страницы. При этом данные вносятся в MySQL с помощью php скрипта. И в данной реализации мне необходимо перед редактированием следующей строки таблицы закрыть предыдущую (если пользователь этого сам не сделал)
Ответить с цитированием
  #2 (permalink)  
Старый 28.10.2008, 19:01
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

по приведённому коду - должен ждать
Что там в BackReplice, давай показывай...
Ответить с цитированием
  #3 (permalink)  
Старый 28.10.2008, 22:51
Новичок на форуме
Отправить личное сообщение для avtor01 Посмотреть профиль Найти все сообщения от avtor01
 
Регистрация: 28.10.2008
Сообщений: 6

Вот
function BackReplice()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null)
 {
 alert ("Browser does not support HTTP Request")
 return
 }
xmlHttp.onreadystatechange=stateChangedEditOff;
xmlHttp.open("post","ajax_select.php",false);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send("quer="+quer+"&id="+id);
}


А так же функция обработки ответа сервера
function stateChangedEditOff()
{
if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
 { 
	var xmlDoc=xmlHttp.responseXML;
	var n = window.t;
	var row = 'row'+n;
	var data = xmlDoc.getElementsByTagName("data")[0];
	var tbody = document.getElementById('tbody_id'); //Определяем родительский объект для новой (и старой строки)
	var tr_old = document.getElementById(row); //определяем индекс строки таблицы, которую нужно заменить	
	var tr = document.createElement('tr');
		tr.setAttribute('id',row);
		tr.setAttribute('bgcolor',color);
	var len = data.childNodes.length;  
	for (var i=0;i < len;i++)  
	{
		var td = document.createElement('td');
		var atr = tr_old.cells[i].getAttribute("align");
			td.setAttribute('align',atr);
		var atr = tr_old.cells[i].getAttribute("class");
			td.setAttribute('class',atr);
		var val = data.childNodes[i].firstChild.nodeValue;
		tr.appendChild(td);
		td.innerHTML = val;
	}
	tbody.replaceChild(tr,tr_old);
 } 
}


И функция GetXmlHttpObject(), с помощью которой создаётся объект xmlHttp (на всякий случай):
function GetXmlHttpObject()
{
var xmlHttp=null;
try
 {
 // Firefox, Opera 8.0+, Safari
 xmlHttp=new XMLHttpRequest();
 }
catch (e)
 {
 //Internet Explorer
 try
  {
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }
 catch (e)
  {
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }
return xmlHttp;
}
Ответить с цитированием
  #4 (permalink)  
Старый 29.10.2008, 12:44
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Если я правильно понял вы пользуетесь аяксом.

Вам либо надо делать синхронный аякс - т.е. пока не прийдет ответ с сервера скрипт дальше выполняться не будет (но это чревато подвисанием браузера на время ожидания ответа), либо делать callback. Т.е. все что у вас идет после функции BackReplice(); надо заделать в одну функцию и вызвать эту функцию после получения ответа.
Ответить с цитированием
  #5 (permalink)  
Старый 29.10.2008, 14:08
Новичок на форуме
Отправить личное сообщение для avtor01 Посмотреть профиль Найти все сообщения от avtor01
 
Регистрация: 28.10.2008
Сообщений: 6

Сообщение от Snipe Посмотреть сообщение
Если я правильно понял вы пользуетесь аяксом.

Вам либо надо делать синхронный аякс - т.е. пока не прийдет ответ с сервера скрипт дальше выполняться не будет (но это чревато подвисанием браузера на время ожидания ответа), либо делать callback. Т.е. все что у вас идет после функции BackReplice(); надо заделать в одну функцию и вызвать эту функцию после получения ответа.
Первый вариант (синхронный аякс) я попробовал сделать в функции BackReplice(). И это помогло IE и Opera. Но с Firefox проблема сохранилась.
А можно по подробнее на счёт callback. Я так понял, что это функция, которая будет собирать ответы сервера, и в зависимости от результата - выполнять те или иные действия. Я правильно думаю?
Ответить с цитированием
  #6 (permalink)  
Старый 29.10.2008, 14:31
Аватар для Snipe
Профессор
Отправить личное сообщение для Snipe Посмотреть профиль Найти все сообщения от Snipe
 
Регистрация: 06.05.2008
Сообщений: 765

Сообщение от avtor01 Посмотреть сообщение
А можно по подробнее на счёт callback. Я так понял, что это функция, которая будет собирать ответы сервера, и в зависимости от результата - выполнять те или иные действия. Я правильно думаю?
У Вас уже есть функция обработки ответа с сервера.
В нее можно передавать переменной функцию, которая будет исполнена после получния ответа с сервера.

Например:
function test() {
  alert('test');
}

function stateChangedEditOff(callback)
{
...
if (callback) callback();
}

xmlHttp.onreadystatechange=function() {stateChangedEditOff(test);};


Это очень приблизительно, м.б. кто-то напишет более подробно.
Ответить с цитированием
  #7 (permalink)  
Старый 29.10.2008, 19:06
Новичок на форуме
Отправить личное сообщение для avtor01 Посмотреть профиль Найти все сообщения от avtor01
 
Регистрация: 28.10.2008
Сообщений: 6

Большое спасибо за помощь. Идею понял, пробую внедрять
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расшифровка кода, генерируемого flash. ГостьФорума Общие вопросы Javascript 6 02.02.2011 01:26
Остановить выполнение скрипта Nonam Общие вопросы Javascript 22 04.05.2009 01:45
Подсветка кода Kolyaj Сайт Javascript.ru 6 14.10.2008 17:28
Авто выполнение функции Itachi Общие вопросы Javascript 18 03.10.2008 16:48
Правильность кода baal1988 Общие вопросы Javascript 7 06.09.2008 08:58