Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Области видимости (https://javascript.ru/forum/jquery/32679-oblasti-vidimosti.html)

project1 25.10.2012 16:38

Решил проблему заданием синхронного запроса. Всё равно нельзя будет добавить страницу если alias существует, поэтому временное подвисание на пару секунд не играет никакого значения, иначе для чего вообще существует синхронный запрос?
function aliasExists(alias, args) {
	var ret;
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		async: false,
		dataType: 'json',
		type: 'GET',
		success: function(data, textStatus) {
			ret = data;
		}
	});
	return ret;
}

Skipp 25.10.2012 16:51

Цитата:

Сообщение от project1
иначе для чего вообще существует синхронный запрос?

Уж не для такого, поверь.
Через время поймёшь через какую ты задницу всё это делаешь, не в обиду, сам когда-то таким был, да и до сих пор остаюсь, в некоторых областях.

project1 25.10.2012 16:57

Skipp,
Понимаю :) Просто пока я не вижу других путей, чтобы запретить дальшейшее выполнение кода, пока я не получу нужный мне ответ. Так как результат этого выполнения зависит от AJAX ответа...

Skipp 26.10.2012 09:28

Так callback функция как раз для этого нужна, она сделает всё что нужно именно после того как придёт ответ.

project1 26.10.2012 10:15

У меня идёт проверка формы. И перед тем, как её запостить, обязательно нужно проверить наличие одного поля в базе. Если же я буду делать проверку в callback функции, то, пока выполняется запрос, дальнейший код проверки формы уже завершит действие и, если условия проверки будут удовлетворены (кроме наличия одного поля из базы), форма отправится и только потом сработает callback функция.

Skipp 26.10.2012 10:23

Так зачем тогда return?
function(){
    //Проверка формы, если всё верно отправляем запрос
    $.ajax(.....,function(data){
        //Все действия которые необходимо делать после получения ответа.
    })
}

project1 26.10.2012 11:08

Просто я люблю распределять всё по функциям и не городить всё в одном месте. Поэтому проверку ссылки я вынес в отдельную функцию.
Придётся привести весь код:
//запускаю проверку по нажатии на ссылку
var form = $('form:first');
$('a[href*="/insert/"]').click(function(){
	var href = $(this).attr('href');
	if (checkForm(href)) {
		form.attr('action', href);
		form.submit();
	}
	return false;
});

function checkForm(href) {
	var ret = true, alias;
	$('input.must,textarea.must,select.must').each(function(){
		$(this).removeClass('input-error');
		if ($(this).attr('name') == 'alias') {
			alias = $(this).attr('value', this.value.replace(/\s|_/g, '-').replace(/-{2,}/g, '-').replace(/[^a-z-\dа-я]/gi, '').toLowerCase());
			if (href) {
				if (alias[0].value) {
					if (aliasExists(alias[0].value, getAssocArray(href))) {
						ret = false;
						$(this).addClass('input-error');
					}
				}
			}
		}
		if ($.trim(this.value) == '') {
			ret = false;
			$(this).addClass('input-error');
			$('#tabs').tabs({ selected: 0 });
		}
	});
	return ret;
}

function aliasExists(alias, args) {
	var ret;
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		async: false,
		success: function(data, textStatus) {
			ret = data;
		}
	});
	return ret;
}

Может это как-нибудь прояснит ситуацию...

Skipp 26.10.2012 11:15

...
aliasExists(alias[0].value, getAssocArray(href), this)
...						

function aliasExists(alias, args, obj) {
	$.ajax({
		url: '/cp/ajax/alias_exists.php',
		data: {'alias': alias, 'args': args},
		success: function(data, textStatus) {
			if(!Boolean(data))
				$(obj).addClass('input-error');
		}
	});

}

project1 26.10.2012 11:25

Это понятно...
Как я писал выше, пока запрос выполняется, остальной код ява скрипта пробежит до конца и форма запостится, так и не дождавшись ответа от сервера и вызова callback функции :)

Skipp 26.10.2012 11:39

В общем, потом разберёшься.


Часовой пояс GMT +3, время: 11:13.