Доброго времени суток, всем коллегам.
Прошу помощи в описанной ниже ситуации.
Есть страница интернет-магазина с товаром (магазин на 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);
}
});
});