我想使用一个简单的函数在移动设备上隐藏/显示内容只有。
函数本身非常简单。我在这里使用此代码为:
$('.toggleMobile').click(function() {
var hideableContent = $(this).parent().find('.hideable');
hideableContent.slideToggle('medium');
});
所以...没有什么特别的,我知道。
当我尝试检测浏览器视口时,它变得更加复杂。
我想我照顾了,通过使用以下行(你可能会想办法改进它):
function whatMedia() {
var viewport = $(window).width();
var mediaType;
if (viewport < 767)
mediaType = 'mobile';
else if ((viewport >= 767) && (viewport < 991))
mediaType = 'tablet';
else
mediaType = 'desktop';
return mediaType;
}
现在我只是需要一个被触发功能只有当视域是mobile
(也许问题出在这里?):
function toggleMobile(mediaType) {
if (mediaType === 'mobile') {
$('.toggleMobile').click(function() {
var hideableContent = $(this).parent().find('.hideable');
hideableContent.slideToggle('medium');
});
}
}
我没有问题在第一次加载页面时检查视口。 我只是用这个(代码非常简单位):
// Check media type and activate accordingly
var mT = whatMedia();
toggleMobile(mT);
到目前为止好。现在来了有趣的部分:
我希望能够检测用户是否调整浏览器窗口大小并相应地激活/禁用toggleMobile()
函数。。
我可以这样做:
$(window).resize(function() {
var mT = whatMedia();
toggleMobile(mT);
}
正如你可能已经知道了,这$(window).resize
事情让WebKit和其他浏览器去有点疯狂,只要用户调整窗口重复的功能。
这取决于你对它的好坏。
我个人不希望这样的事情发生,所以我用this function i found on the forums:
var waitForFinalEvent = (function() {
var timers = {};
return function (callback, ms, uniqueId) {
if (!uniqueId) {
uniqueId = "Don't call this twice without a uniqueId";
}
if (timers[uniqueId]) {
clearTimeout (timers[uniqueId]);
}
timers[uniqueId] = setTimeout(callback, ms);
}
})();
我的resize事件是这样的:
$(window).resize(function() {
waitForFinalEvent(function() {
var mT = whatMedia();
toggleMobile(mT);
}, 500, '1');
}
这肯定不会耽误上调整浏览器窗口的计算但我不能使它内部的功能工作。
我不知道是什么问题:(
钍功能被触发两次或更多次,甚至当视确认为desktop
或tablet
。
我想你应该看看[Modernizr](http://www.modernizr.com/)。 – Pointy
每次调用'toggleMobile'时,都会添加另一个'click'事件处理程序(如果'mediaType'是'mobile'),而不删除旧的。你应该只有一个事件处理程序,并检查其中的'mediaType'。 – sje397
@Pointy我没有意识到Modernizr的这个特性。肯定会检查出来。 –