2013-04-23 129 views
0

我一直在努力解决这个问题整个下午疯狂,但我想我只是不知道足够的Javascript来看看该怎么做。通读大量的帖子,包括这里,但我仍然无法弄清楚该怎么做。WordPress的JS冲突(?) - PrettyPhoto,jQuery

我目前使用的是我从设计师处购买的Wordpress主题,此后主题消失,并且未回复有关主题的任何消息。

在这个主题上,我已经使用了一年多的简单优雅的“PrettyPhoto”灯箱插件(http://www.no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/)。

一切都很好,但今天我突然发现,“灯箱”效果现在取消:现在每张照片都在主页面下打开,而不是在浮动窗口中弹出 - 而且看起来确实如此,真的很难看(请看这里的例子)。

从我的理解可能是在我的主题内发生的一种JavaScript冲突,但我不能把它放在手指上。我的JS目录中有一个jQuery 1.8.2文件,但用1.9.1版替换它并没有带来任何好处。

萤火虫给我下面的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冲突,但我找不到它的来源。如果任何人有线索,所有的帮助将不胜感激!

干杯, D-

+0

为什么这个文件混合使用'$()'和'jQuery()'?选择一个,并与它一起去,听起来像问题是由其他接管'$'字符引起的。 – Chad 2013-04-23 13:38:39

+1

[Wordpress Jquery Confliction with Plugin]可能重复(http://stackoverflow.com/questions/4845483/wordpress-jquery-confliction-with-plugin) – undefined 2013-04-23 13:39:45

+0

你可以试试'jQuery(document).ready(function($) {$( “doAnything”);});'。这也在[文档](http://api.jquery.com/ready/)中描述。 – Eich 2013-04-23 13:42:57

回答

0

的JavaSript错误是告诉你到底是什么问题 - TypeError: $ is not a function
,所以脚本失败。

在WordPress中,你需要使用jQuery,而不是$,所以你的代码

jQuery('#navigation ul.menu') 

更换

$('#navigation ul.menu') 

,并在其他功能类似的替代呼叫在使用$

这是为什么?jQuery通常定义$函数,但为了防止与其他库使用$冲突,它可以在.noconflict()模式下运行。

another plugin's文档

The jQuery library included with WordPress is set to the noConflict() mode (see wp-includes/js/jquery/jquery.js). This is to prevent compatibility problems with other JavaScript libraries that WordPress can link

也可参阅wordpress.stackexchange.com答案。