Конфликт Wordpress JS (?) - PrettyPhoto, jQuery

Весь день я сходил с ума, пытаясь решить эту проблему, но, думаю, я просто недостаточно знаю Javascript, чтобы понять, что делать. Прочитал много-много постов, в том числе и здесь, но так и не понял, что делать.

В настоящее время я использую тему Wordpress, которую купил у дизайнера, который с тех пор исчез и не отвечает ни на одно сообщение, касающееся этой темы.

В этой теме я уже больше года использую простой и элегантный плагин лайтбокса "PrettyPhoto" (http://www.no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/).

Раньше все работало нормально, но сегодня я вдруг обнаружил, что эффект «лайтбокса» теперь отменен: каждая фотография теперь открывается под главной страницей, а не всплывает в плавающем окне, и выглядит это очень, очень некрасиво (см. пример здесь).

Насколько я понимаю, это, вероятно, своего рода конфликт javascript, происходящий в моей теме, но я не могу понять это. У меня в каталоге JS был файл jQuery 1.8.2, но замена его на версию 1.9.1 не принесла радости.

Firebug выдает следующую ошибку JS:

    TypeError: $ is not a function
     $('#navigation ul.menu').supersubs({          -   seso.js (line 2)
Error: Permission denied to access property 'toString'
TypeError: $ is not a function
     $('#navigation ul.menu').supersubs({              - seso.js (line 2)
    

«Seso.js» — это файл, который поставляется с моей темой (под названием «Seso»), и код которого выглядит следующим образом:

jQuery(document).ready(function() {
    $('#navigation ul.menu').supersubs({ 
            minWidth:    15,
            maxWidth:    30,
            extraWidth:  1     
        }).superfish({ hoverClass: "sfHover", speed: 'slow', dropShadows: false, delay: 0, animation: {height:'show'}});
    $('.up a[href$="top"]').click( function() {
        $.scrollTo( $('#top'), {speed:1200} );
    })
    $('#navigation ul.menu>li>ul>li, #navigation ul.menu>li>ul>li>ul>li').hover(function() { //mouse in
        $(this).stop().animate({ paddingLeft: '5px' }, 300);
    }, function() { //mouse out
    $(this).stop().animate({ paddingLeft: 0 }, 300);
    });
    $(".socialtip").tipTip();
    jQuery(".toggle_body").hide(); 

    jQuery("h4.toggle").toggle(function(){
        jQuery(this).addClass("toggle_active");
        }, function () {
        jQuery(this).removeClass("toggle_active");
    });

    jQuery("h4.toggle").click(function(){
        jQuery(this).next(".toggle_body").slideToggle();

    });
    $("a[rel^='prettyPhoto']").prettyPhoto({animationSpeed:'slow',theme:'facebook',slideshow:5000});
    var enable_image_hover = function(image){
        if(image.is(".portfolio")){
            if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7) {} else {
                if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 9) {
                    image.hover(function(){
                        jQuery(".image_overlay",this).css("visibility", "visible");
                    },function(){
                        jQuery(".image_overlay",this).css("visibility", "hidden");
                    }).children('img').after('<span class="image_overlay"></span>');
                }else{
                    image.hover(function(){
                        jQuery(".image_overlay",this).animate({
                            opacity: '1'
                        },"fast");
                    },function(){
                        jQuery(".image_overlay",this).animate({
                            opacity: '0'
                        },"fast");
                    }).children('img').after(jQuery('<span class="image_overlay"></span>').css({opacity: '0',visibility:'visible'}));
                }
            }
        }       
    }

    $('.portfolio').preloader({
        delay:200,
        imgSelector:'.imgbg img',
        beforeShow:function(){
            $(this).closest('.image_frame').addClass('preloading');
        },
        afterShow:function(){
            var image = jQuery(this).closest('.image_frame').removeClass('preloading').children("a");
            enable_image_hover(image);
        }
    });
    $('.post').preloader({
        delay:100,
        imgSelector:'.postimage img',
        beforeShow:function(){
            $(this).closest('.postimage').addClass('preloading');
        },
        afterShow:function(){
            var image = jQuery(this).closest('.postimage').removeClass('preloading');
        }
    });
});
(function($) {

    $.fn.preloader = function(options) {
        var settings = $.extend({}, $.fn.preloader.defaults, options);


        return this.each(function() {
            settings.beforeShowAll.call(this);
            var imageHolder = $(this);

            var images = imageHolder.find(settings.imgSelector).css({opacity:0, visibility:'hidden'});  
            var count = images.length;
            var showImage = function(image,imageHolder){
                if(image.data.source != undefined){
                    imageHolder = image.data.holder;
                    image = image.data.source;  
                };

                count --;
                if(settings.delay <= 0){
                    image.css('visibility','visible').animate({opacity:1}, settings.animSpeed, function(){settings.afterShow.call(this)});
                }
                if(count == 0){
                    imageHolder.removeData('count');
                    if(settings.delay <= 0){
                        settings.afterShowAll.call(this);
                    }else{
                        if(settings.gradualDelay){
                            images.each(function(i,e){
                                var image = $(this);
                                setTimeout(function(){
                                    image.css('visibility','visible').animate({opacity:1}, settings.animSpeed, function(){settings.afterShow.call(this)});
                                },settings.delay*(i+1));
                            });
                            setTimeout(function(){settings.afterShowAll.call(imageHolder[0])}, settings.delay*images.length+settings.animSpeed);
                        }else{
                            setTimeout(function(){
                                images.each(function(i,e){
                                    $(this).css('visibility','visible').animate({opacity:1}, settings.animSpeed, function(){settings.afterShow.call(this)});
                                });
                                setTimeout(function(){settings.afterShowAll.call(imageHolder[0])}, settings.animSpeed);
                            }, settings.delay);
                        }
                    }
                }
            };


            images.each(function(i){
                settings.beforeShow.call(this);

                image = $(this);

                if(this.complete==true){
                    showImage(image,imageHolder);
                }else{
                    image.bind('error load',{source:image,holder:imageHolder}, showImage);
                    if($.browser.opera){
                        image.trigger("load");//for hidden image
                    }
                }
            });
        });
    };


    //Default settings
    $.fn.preloader.defaults = {
        delay:1000,
        gradualDelay:true,
        imgSelector:'img',
        animSpeed:500,
        beforeShowAll: function(){},
        beforeShow: function(){},
        afterShow: function(){},
        afterShowAll: function(){}
    };
})(jQuery);

Я не собирал этот JS-файл, поэтому точно не знаю, для чего нужны все его функции. Я совершенно уверен, что 90% из них мне не нужны.

Для полноты картины вот содержимое моего текущего тега заголовка WP header.php:

<head>
<meta http-equiv="Content-Type" content="<?php bloginfo('html_type') ?>; charset=<?php bloginfo('charset') ?>" />
<title><?php if (is_front_page()) { ?><?php bloginfo('name'); ?> - <?php bloginfo('description'); ?><?php } else { ?><?php wp_title($sep = ''); ?> - <?php bloginfo('name'); ?><?php } ?></title>

<link rel="stylesheet" href="<?php echo $themePath ?>/css/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php bloginfo('template_directory'); ?>/css/prettyPhoto.css" type="text/css" media="screen" charset="utf-8" />
<link rel="stylesheet" href="<?php echo $themePath ?>/css/imageflow.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo $themePath ?>/css/options.php" type="text/css" media="screen" />
<?php if(get_option_tree ('customcss', '')){ ?>
<style type="text/css">
<?php echo  get_option_tree ('customcss', ''); ?>
</style>
<?php } ?>
<?php wp_head(); ?>
<script src="<?php bloginfo('template_directory'); ?>/js/jquery.prettyPhoto.js"></script>
<script type="text/javascript">   
jQuery(document).ready(function($) {
   $("a[href$='.jpg'], a[href$='.jpeg'], a[href$='.gif'], a[href$='.png']").prettyPhoto({
    animationSpeed: 'normal', /* fast/slow/normal */
    padding: 40, /* padding for each side of the picture */
    opacity: 0.35, /* Value betwee 0 and 1 */
    showTitle: true, /* true/false */
    theme: 'pp_default' /* light_rounded / dark_rounded / light_square / dark_square / facebook */      
    }); 

})

</script>
</head>

Я пробовал использовать другие плагины для лайтбоксов, но результат тот же.

Самое странное, что PrettyPhoto работает на моем локальном сервере — основное различие между локальной и онлайн-версиями моего сайта заключается в том, что последняя является более новой версией Wordpress...

В моей теме есть глубокий конфликт JS, но я не могу найти его источник. Если у кого-то есть ключ, вся помощь будет очень признательна!

Привет, Д-


person killer_rabbit    schedule 23.04.2013    source источник
comment
Почему в этом файле смешаны $() и jQuery()? Выберите один и используйте его, похоже, проблемы вызваны тем, что что-то другое берет на себя роль персонажа $.   -  person Chad    schedule 23.04.2013
comment
возможный дубликат Конфликт Wordpress Jquery с плагином   -  person undefined    schedule 23.04.2013
comment
Вы можете попробовать jQuery(document).ready(function($) {$("doAnything");});. Это также описано в документах.   -  person Eich    schedule 23.04.2013


Ответы (1)


Ошибка JavaSript точно сообщает вам, в чем проблема - TypeError: $ is not a function
, поэтому сценарий не работает.

В WordPress вам нужно использовать jQuery, а не $, поэтому для вашего кода замените

$('#navigation ul.menu')

с участием

jQuery('#navigation ul.menu')

и аналогичным образом замените в других вызовах функций, где используется $.

Почему это? jQuery обычно определяет функцию $, но для предотвращения конфликта с другими библиотеками, использующими $, ее можно запустить в .noconflict()< /а> режим.

Из документации другого плагина

Библиотека jQuery, входящая в состав WordPress, настроена на режим noConflict() (см. wp-includes/js/jquery/jquery.js). Это сделано для предотвращения проблем совместимости с другими библиотеками JavaScript, которые WordPress может связать.

Также см. ответ на wordpress.stackexchange.com .

person andyb    schedule 23.04.2013