uncaught typeError: cannot read property 'querySelectorAll' of null
uncaught typeError: cannot read property 'querySelectorAll' of null
我正在尝试在网站上使用此移动菜单。
http://tympanus.net/codrops/2013/08/13/multi-level-push-menu/comment-page-8/#comment-466199
我可以正常工作,但一位 ie11 用户报告错误,我在控制台中看到以下错误
未捕获的类型错误:无法读取 nullmlPushMenu._init 的 属性 'querySelectorAll' @ mlpushmenu.js:89mlPushMenu @ mlpushmenu.js:67(匿名函数)@(索引):1062
这是有问题的 js 文件的片段
function mlPushMenu( el, trigger, options ) {
this.el = el;
this.trigger = trigger;
this.options = extend( this.defaults, options );
// support 3d transforms
this.support = Modernizr.csstransforms3d;
if( this.support ) {
this._init();
}
}
mlPushMenu.prototype = {
defaults : {
// overlap: there will be a gap between open levels
// cover: the open levels will be on top of any previous open level
type : 'overlap', // overlap || cover
// space between each overlaped level
levelSpacing : 40,
// classname for the element (if any) that when clicked closes the current level
backClass : 'mp-back'
},
_init : function() {
// if menu is open or not
this.open = false;
// level depth
this.level = 0;
// the moving wrapper
this.wrapper = document.getElementById( 'mp-pusher' );
// the mp-level elements
this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );
// save the depth of each of these mp-level elements
var self = this;
this.levels.forEach( function( el, i ) { el.setAttribute( 'data-level', getLevelDepth( el, self.el.id, 'mp-level' ) ); } );
// the menu items
this.menuItems = Array.prototype.slice.call( this.el.querySelectorAll( 'li' ) );
// if type == "cover" these will serve as hooks to move back to the previous level
this.levelBack = Array.prototype.slice.call( this.el.querySelectorAll( '.' + this.options.backClass ) );
// event type (if mobile use touch events)
this.eventtype = mobilecheck() ? 'touchstart' : 'click';
// add the class mp-overlap or mp-cover to the main element depending on options.type
classie.add( this.el, 'mp-' + this.options.type );
// initialize / bind the necessary events
this._initEvents();
},
具体的第 89 行在中间,所以在这里拉出来是为了您的方向
this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );
然后我在页脚中调用了插件实例(索引行 1082
那个电话看起来像这样
<script>
new mlPushMenu(
document.getElementById( 'mp-menu' ),
document.getElementById( 'trigger' ),
{ type : 'cover' }
);
</script>
您的桌面版网站没有 ID 为“mp-menu”的元素。当您调用 getElementById 方法时,您将得到 null
作为响应。然后将其分配给对象的 el
属性。当您尝试调用 querySelectorAll 时,您是在尝试从空值调用。
根据对上述问题的评论,mp-menu 元素仅出现在 移动站点 上。如果是这种情况,此代码也应该 仅在移动设备上加载。
问题是 JS 文件在所有平台、桌面和移动设备上都被调用。而使用 mlPushMenu 的移动菜单仅在移动设备上调用。使 JS 文件仅在移动设备上调用解决了桌面浏览器的问题。
我正在尝试在网站上使用此移动菜单。 http://tympanus.net/codrops/2013/08/13/multi-level-push-menu/comment-page-8/#comment-466199
我可以正常工作,但一位 ie11 用户报告错误,我在控制台中看到以下错误 未捕获的类型错误:无法读取 nullmlPushMenu._init 的 属性 'querySelectorAll' @ mlpushmenu.js:89mlPushMenu @ mlpushmenu.js:67(匿名函数)@(索引):1062
这是有问题的 js 文件的片段
function mlPushMenu( el, trigger, options ) {
this.el = el;
this.trigger = trigger;
this.options = extend( this.defaults, options );
// support 3d transforms
this.support = Modernizr.csstransforms3d;
if( this.support ) {
this._init();
}
}
mlPushMenu.prototype = {
defaults : {
// overlap: there will be a gap between open levels
// cover: the open levels will be on top of any previous open level
type : 'overlap', // overlap || cover
// space between each overlaped level
levelSpacing : 40,
// classname for the element (if any) that when clicked closes the current level
backClass : 'mp-back'
},
_init : function() {
// if menu is open or not
this.open = false;
// level depth
this.level = 0;
// the moving wrapper
this.wrapper = document.getElementById( 'mp-pusher' );
// the mp-level elements
this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );
// save the depth of each of these mp-level elements
var self = this;
this.levels.forEach( function( el, i ) { el.setAttribute( 'data-level', getLevelDepth( el, self.el.id, 'mp-level' ) ); } );
// the menu items
this.menuItems = Array.prototype.slice.call( this.el.querySelectorAll( 'li' ) );
// if type == "cover" these will serve as hooks to move back to the previous level
this.levelBack = Array.prototype.slice.call( this.el.querySelectorAll( '.' + this.options.backClass ) );
// event type (if mobile use touch events)
this.eventtype = mobilecheck() ? 'touchstart' : 'click';
// add the class mp-overlap or mp-cover to the main element depending on options.type
classie.add( this.el, 'mp-' + this.options.type );
// initialize / bind the necessary events
this._initEvents();
},
具体的第 89 行在中间,所以在这里拉出来是为了您的方向
this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );
然后我在页脚中调用了插件实例(索引行 1082
那个电话看起来像这样
<script>
new mlPushMenu(
document.getElementById( 'mp-menu' ),
document.getElementById( 'trigger' ),
{ type : 'cover' }
);
</script>
您的桌面版网站没有 ID 为“mp-menu”的元素。当您调用 getElementById 方法时,您将得到 null
作为响应。然后将其分配给对象的 el
属性。当您尝试调用 querySelectorAll 时,您是在尝试从空值调用。
根据对上述问题的评论,mp-menu 元素仅出现在 移动站点 上。如果是这种情况,此代码也应该 仅在移动设备上加载。
问题是 JS 文件在所有平台、桌面和移动设备上都被调用。而使用 mlPushMenu 的移动菜单仅在移动设备上调用。使 JS 文件仅在移动设备上调用解决了桌面浏览器的问题。