jQuery单个脚本文件不是特定于*this*页面-显示“;undefined不是函数”;


jQuery single script-file not specific to *this* page - showing "undefined is not a function"

我知道jQuery noConflict包装器,以及使用wp_enqueue_script()加载脚本。在下划线(_s)开始主题之后,我将在页脚中对脚本(example.js)的依赖项jQuery进行排队。为了避免"Render Blocking javascript"警告,我将所有单独的jQuery代码粘贴到了那个文件中。

假设

  • 我在那里有一个特定于front-page.php的滑块功能
  • 但是TinyNav功能在那里特定于网站的所有页面
  • 和仅适用于Portfolio页面的同位素功能

example.js

jQuery(document).ready(function($) {
    //add .js to html
    $('html').removeClass('no-js').addClass('js');
    //front-page slider code
    //$('container').doSlider();
    //portfolio page isotope code
    //$('container').activeIsotope();
});

所有代码都运行良好,彼此之间没有冲突。他们也得到了jQuery。因此,同位素部分在公文包页面中运行良好,没有错误,但在不存在同位素容器的其他页面中显示错误。即使使用document.ready包装,它也显示了错误。

//portfolio page isotope code
$(document).ready(function(){
    var container = $('#portfolio-holder');
    container.imagesLoaded( function(){
        container.isotope({
            itemSelector    : '.portfolio-item',
            layoutMode      : 'fitRows',
            animationEngine : 'jquery'
        });
        /* ---- Filtering ----- */
        $('#portfolio-filter li').click(function(){
            var $this = $(this);
            if ( $this.hasClass('selected') ) {
                return false;
            } else {
                $('#portfolio-filter .selected').removeClass('selected');
                var filterValue = $(this).attr('data-filter');
                container.isotope({ filter: filterValue });
                $this.addClass('selected');
                return false;
            }
        });
    });
});

错误为:

未捕获类型错误:未定义不是函数

错误指向:

container.imagesLoaded( function(){

同样的问题也发生在我的另一个项目中,它显示了flexslider的错误。然后,我将插件代码分离到另一个文件中,并加载该文件,该文件仅特定于滑块所在的页面。

但是,在没有DOM的情况下,如何从一个没有冲突且没有错误的文件中加载所有java脚本呢?

只需检查容器和函数是否存在,然后调用它:

$(document).ready(function(){
    var container = $('#portfolio-holder');
    if (typeof container.imagesLoaded == 'function' && container.length > 0) { 
        container.imagesLoaded( function(){
            container.isotope({
                itemSelector    : '.portfolio-item',
                layoutMode      : 'fitRows',
                animationEngine : 'jquery'
            });
            /* ---- Filtering ----- */
            $('#portfolio-filter li').click(function(){
                var $this = $(this);
                if ( $this.hasClass('selected') ) {
                    return false;
                } else {
                    $('#portfolio-filter .selected').removeClass('selected');
                    var filterValue = $(this).attr('data-filter');
                    container.isotope({ filter: filterValue });
                    $this.addClass('selected');
                    return false;
                }
            });
        });
    }
});