我知道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;
}
});
});
}
});