После 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); } }); }); |
Часовой пояс GMT +3, время: 00:58. |