Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   AJAX удаление записи из БД (https://javascript.ru/forum/jquery/14411-ajax-udalenie-zapisi-iz-bd.html)

javascript 14.01.2011 23:37

AJAX удаление записи из БД
 
Господа эксперты, мне ошенамана нужна ваша помощь.
Задача собственно следующая, удалить записи из БД через ajax.

код такой:
$(document).ready(function(){
	
	function delete_row(link)
	{
			var ajax_url = "/delete/" + link + "/";
			alert(ajax_url);
			var confirmDel = confirm("Вы подтверждаете удаление?");
			if (confirmDel == true) 
			{
				alert($(this));
				$(this).parents('TR').addClass('overlay');
				$(this).parents('TR').parent().prepend('<div id="load" align="center"><img src="/img/loading.gif" width="28" height="28" align="absmiddle"> Обработка...</div>');;
				var commentContainer = $(this).parents('TR');
				
				// получаем значение элемента
				var id = $(this).attr("id");
				var string = 'id='+ id ;
				$.ajax({
					type: "POST",
					// файл-обработчик
					url: ajax_url,
					data: string,
					cache: false,
					// сворачиваем строку на которую кликнули
					success: function(msg){
						commentContainer.slideUp('slow', function() {
							$(this).remove();
						});
						$('#load').fadeOut();
						alert(msg);
					}
				});
				return false;
			}	
	};

$(".delete").click(
		function() 
		{
			//alert(this);
			delete_row("ajax_pr_delete");
		}
	);

});


При клике на элементе порсле сообщения о подтверждение о удаление ничего не происходит. Все работает если содержимое функции delete_row вставить в обработчик click.

x-yuri 15.01.2011 15:49

что выдает console.log([confirmDel, typeof confirmDel]) ?

javascript 18.01.2011 08:55

если поставить сразу после if (confirmDel == true), то
[true, "boolean"]
если после $(".delete").click(function(){delete_row("ajax_pr_ delete"); , то
confirmDel is not defined

x-yuri 18.01.2011 10:07

на вкладке Сеть firebug'а ajax-запрос отправляется? В консоли firebug'а появляются ошибки?

javascript 29.01.2011 01:17

Проблему решил, нужно было в function delete_row(link) добавить аргумент , например selector - function delete_row(selector, link). И соответственно все $(this) заменить на $(selector).
Также заменить
$(".delete").click(
function(){delete_row("ajax_pr_delete");
}
на
$(".delete").click(
function() { delete_row(this, "ajax_pr_delete"); }
);

Как я понимаю, иначе(без аргумента selector) при вызове функции jquery не может отследить на каком элементе произошел клик и собстна тогда this внутри функции не имеет никакого значения.....вообщем если не правильно понял то плз поправьте....ну а главное что все работает как надо )

x-yuri 29.01.2011 02:03

this в обработчике click - это DOM-элемент, на котором произошел клик мышью. Если ты его не передаешь в функцию delete_row, то, естественно, он сам туда не передастся, а получит контекст по умолчанию (window):
var obj = {};

function f1(){
    alert( this === obj );
    f2( this );
}

function f2( arg ){
    alert([ this === window, arg === obj ]);
}

f1.call(obj);

вызвать функцию с тем же объектом в качестве this можно так
var obj = {};

function f1(){
    alert( this === obj );
    f2.call( this );
}

function f2(){
    alert( this === obj );
}

f1.call(obj);

а можно просто упрощенно говоря "назначить" функции this
Function.prototype.of = function( o ){
    var f = this;
    return function(){
        return f.apply(o, arguments);
    };
};

var obj = {};

function f1(){
    alert( this === obj );
    f2.of(this)();
    f3( f2.of(this) );
}

function f2(){
    alert( this === obj );
}

function f3( f ){
    f();
}

f1.call(obj);


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