TypeError: jQuery(…).fancybox is not a function в карточке товара Virtuemart 2

Собственно, это может произойти не только в Virtuemart, этим может заболеть любой сайт, когда в нем накручивается много разных  плагинов jQuery от разных фреймворков. Например, у меня (одного из моих клиентов) такая бяка полезла после того, как в шаблоне, сгенерированном Artisteer, начало конфликтовать практически все, что могло (Joomla 1.5 + Virtuemart 2.0 + шаблон от Artisteer = [closed censorship]).

Короче. Если вываливается что-то типа «.fancybox is not a function» — это говорит только о том, что где-то что-то конфликтует.

Для исправления подобных недоразумений придумано это:

jQuery.noConflict();

В Artisteer это даже вынесено в отдельный файл. Убивал бы, да кодекс не дает…

Также существует большая вероятность того, что где-то переподключается jQuery или какой-то другой фреймворк. Такие дублированные подключения надо пресекать (найдите, убейте сами — тут все сильно индивидуально).

Итак, в моем случае, я, пофиксив дублирующиеся подключения фреймворков и путаницу в порядке подключения плагинов (убив, таким образом, другие попутные проблемы), добрался до файла /components/com_virtuemart/views/productdetails/tmpl/default_images.php

Там в строке 24 начинается следующее буйство:

$imageJS = '
jQuery(document).ready(function() {
	jQuery("a[rel=vm-additional-images]").fancybox({
		"titlePosition" 	: "inside",
		"transitionIn"	:	"elastic",
		"transitionOut"	:	"elastic"
	});
});
';

Тут делаем следующий АП:

$imageJS = '
var j$ = jQuery.noConflict();
j$(document).ready(function() {
	j$("a[rel=vm-additional-images]").fancybox({
		"titlePosition" 	: "inside",
		"transitionIn"	:	"elastic",
		"transitionOut"	:	"elastic"
	});
});
';

То есть, мы добавляем свой noConflict, с бэкджеком и разными тетями и его юзаем в своих корыстных целях. Добавляем

var j$ = jQuery.noConflict();

Заменяем jQuery на j$

Ну, вот, как-то так оно и происходит… В общем, если что-то где-то «is not a function» — это значит, что что-то где-то неправильно подключено, или конфликтует с соседями (юзаем noConflict).

0

TypeError: jQuery(…).fancybox is not a function в карточке товара Virtuemart 2: 1 комментарий

Добавить комментарий