Javascript.RU

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

После Ajax-запроса отваливается jQuery-модуль
Доброго времени суток, всем коллегам.

Прошу помощи в описанной ниже ситуации.

Есть страница интернет-магазина с товаром (магазин на Virtuemart 2.x), т.е. на страницу плиткой выводятся товары (картинка с подписью). К этой странице подключается несколько jQuery-модулей. Каждый модуль лежит в своем файле, подключается через <script> в head'е страницы, модули все кроме одного самописные, а один сторонний.

Сторонний модуль расширяет jQuery методом "product". И используется для обработки выведенных товаров (листинг см. в конце):

jQuery(".product").product()


ПРОБЛЕМА: На странице с товаром есть фильтр, который использует ajax и с его помощью обновляет список показанного на странице товара. Когда страница грузится впервые, все модули цепляются и все работает как часики (сторонний тоже). Ajax обновляет на странице плитку выведенных товаров (удаляет старые товары и выводит так же полученные с сервера). Товары с сервера приходят в виде куска html-кода, никакие скрипты не подгружаются ajax'ом.

После ajax-запроса все мои модули продолжают работать, а вот сторонний модуль "отваливается", т.е. после попытки обработать полученные с сервера товары
jQuery(".product").product()


в консоль падает

Uncaught TypeError: Object [object Object] has no method 'product'


Не могу понять куда девается этот метод, ведь он расширяет jQuery в head странице и должен быть доступен постоянно?

Вот листинг стороннего файла
(function($) {
	$.fn.product = function(options) {
		this.each(function(){
			var cart = $(this),
			addtocart = cart.find('input.addtocart-button'),
			plus   = cart.find('.quantity-plus'),
			minus  = cart.find('.quantity-minus'),
			select = cart.find('select'),
			radio = cart.find('input:radio'),
			virtuemart_product_id = cart.find('input[name="virtuemart_product_id[]"]').val(),
			quantity = cart.find('.quantity-input');

            // vaedit
            var priceBlock = cart.parent().parent().parent().find("span.PricesalesPrice");
            var price = priceBlock.text().split(" ");
            // /vaedit

			addtocart.click(function(e) {
				sendtocart(cart);
				return false;
			});

            // vaedit
            quantity.change(function(){
                var Qtt = parseInt($(this).val());
                if (isNaN(Qtt)){
                    $(this).val(1);
                    priceBlock.text(price.join(" "));
                }else{
                    var v = Math.abs(Qtt);
                    $(this).val(v);
                    priceBlock.text(v * price[0] + " " + price[1]);
                     }
            })
             // /vaedit

			plus.click(function() {
				var Qtt = parseInt(quantity.val());
				if (Qtt != NaN) {
					quantity.val(Qtt + 1);
                    priceBlock.text(quantity.val() * price[0] + " " + price[1]); // vaedit
				$.setproducttype(cart,virtuemart_product_id);
				}
				
			});
			minus.click(function() {
				var Qtt = parseInt(quantity.val());
				if (Qtt != NaN && Qtt>0) {
					quantity.val(Qtt - 1);
                    priceBlock.text(quantity.val() * price[0] + " " + price[1]);
				$.setproducttype(cart,virtuemart_product_id);
				}
			});
			select.change(function() {
				$.setproducttype(cart,virtuemart_product_id);
			});
			radio.change(function() {
				$.setproducttype(cart,virtuemart_product_id);
			});
			quantity.keyup(function() {
				$.setproducttype(cart,virtuemart_product_id);
			});
		});

		function sendtocart(form){
			
			$.ajaxSetup({ cache: false })
			var datas = form.serialize();
			$.getJSON(vmSiteurl+'index.php?option=com_virtuemart&nosef=1&view=cart&task=addJS&format=json'+vmLang,encodeURIComponent(datas),
				function(datas, textStatus) {
					if(datas.stat ==1){
						//var value = form.find('.quantity-input').val() ;
						var txt = form.find(".pname").val()+' '+vmCartText;
                                                $.facebox.settings.closeImage = closeImage;
                                                $.facebox.settings.loadingImage = loadingImage;
                                                $.facebox.settings.faceboxHtml = faceboxHtml;
						$.facebox({ text: datas.msg +"<H4>"+txt+"</H4>" }, 'my-groovy-style');
					} else if(datas.stat ==2){
						var value = form.find('.quantity-input').val() ;
						var txt = form.find(".pname").val();
                                                $.facebox.settings.closeImage = closeImage;
                                                $.facebox.settings.loadingImage = loadingImage;
                                                $.facebox.settings.faceboxHtml = faceboxHtml;
						$.facebox({ text: datas.msg +"<H4>"+txt+"</H4>" }, 'my-groovy-style');
					} else {
                                                $.facebox.settings.closeImage = closeImage;
                                                $.facebox.settings.loadingImage = loadingImage;
                                                $.facebox.settings.faceboxHtml = faceboxHtml;
						$.facebox({ text: "<H4>"+vmCartError+"</H4>"+datas.msg }, 'my-groovy-style');
					}
					if ($(".vmCartModule")[0]) {
						$(".vmCartModule").productUpdate();
					}
				});
				$.ajaxSetup({ cache: true });
		};


	}
	$.setproducttype = function(form,id){
		form.view = null ;
		var datas = form.serialize(),
		prices = $("#productPrice"+id);
		datas = datas.replace("&view=cart", "");
		prices.fadeTo("fast", 0.75);
		$.getJSON(vmSiteurl+'index.php?option=com_virtuemart&nosef=1&view=productdetails&task=recalculate&format=json'+vmLang,encodeURIComponent(datas),
			function(datas, textStatus) {
				prices.fadeTo("fast", 1);
				// refresh price
				for(key in datas) {
					var value = datas[key];
					if (value!=0) prices.find("span.Price"+key).show().html(value);
					else prices.find(".Price"+key).html(0).hide();
				}
			});
		return false; // prevent reload
	};	
	$.fn.productUpdate = function() {
	mod = $(this);
		$.getJSON(vmSiteurl+"index.php?option=com_virtuemart&nosef=1&view=cart&task=viewJS&format=json"+vmLang,
			function(datas, textStatus) {
				if (datas.totalProduct >0) {
					mod.find(".vm_cart_products").html("");
					$.each(datas.products, function(key, val) {
						$("#hiddencontainer .container").clone().appendTo(".vmCartModule .vm_cart_products");
						$.each(val, function(key, val) {
							if ($("#hiddencontainer .container ."+key)) mod.find(".vm_cart_products ."+key+":last").html(val) ;
						});
					});
					mod.find(".total").html(datas.billTotal);
					mod.find(".show_cart").html(datas.cart_show);
				}
				mod.find(".total_products").html(datas.totalProductTxt);
			}
		);
	}

})(jQuery);
jQuery.noConflict();
jQuery(document).ready(function($) {

	$(".product").product();

	$("form.js-recalculate").each(function(){
		if ($(this).find(".product-fields").length) {
			var id= $(this).find('input[name="virtuemart_product_id[]"]').val();
			$.setproducttype($(this),id);
			//console.log($(this),id);
		}
	});
		
});
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery ajax отправка запроса в htpps vova_b jQuery 19 07.03.2013 18:20
Вывод тега <script> после ajax запроса в указанном div`е Dimkus AJAX и COMET 1 27.02.2012 01:41
jquery не срабатывает find после ajax versoul jQuery 7 09.09.2011 16:20
Проблема с событиями после ajax запроса Mirgorod AJAX и COMET 5 12.06.2010 18:24
Сохранение результата ajax запроса после нажатия 'back' gregOlsen AJAX и COMET 5 18.11.2009 12:23