我使用Simple State Manager并使用Bootstrap断点设置一组全局状态以匹配项目范围。我这样做是为了让我们一致地使用状态名称,并且可以轻松地使用预定义的断点。
然后我尝试找出一种方法,在页面加载和稍后使用onEnter处理程序的状态更改匹配上添加功能。基本上,我们有页面特定的javascript,它将在匹配媒体查询时添加自己的功能。
我几乎让它工作了;我的问题是我可以让函数在页面加载或状态匹配上运行,但不能同时运行。
这里是设置与我们的Bootstrap断点匹配的媒体查询状态的代码,以及为SimpleStateManager定义媒体查询:
// bootstrap variables
var screenMax = 479,
screenXsMin=480,
screenSmMin=768,
screenMdMin=992,
screenLgMin=1200,
screenXsMax=(screenSmMin - 1),
screenSmMax=(screenMdMin - 1),
screenMdMax=(screenLgMin - 1);
// Set up strings for queries. These can be used when adding states in custom.js,
var mqScreenMax= 'only screen and (max-width:'+screenMax+'px)',
// Set up an xs min, max, and only
mqXsMin= 'only screen and (min-width:'+screenXsMin+'px)',
mqXsMax= 'only screen and (max-width:'+screenXsMax+'px)',
//mqXsOnly= 'only screen and (min-width:'+screenXsMin+'px) and (max-width:'+screenXsMax+'px)',
// set up a sm min max and only
mqSmMin= 'only screen and (min-width:'+screenSmMin+'px)',
mqSmMax= 'only screen and (max-width:'+screenSmMax+'px)',
//mqSmOnly= 'only screen and (min-width:'+screenSmMin+'px) and (max-width:'+screenSmMax+'px)',
// set up a md min max and only
mqMdMin= 'only screen and (min-width:'+screenMdMin+'px)',
mqMdMax= 'only screen and (max-width:'+screenMdMax+'px)',
//mqMdOnly= 'only screen and (min-width:'+screenMdMin+'px) and (max-width:'+screenMdMax+'px)',
// finalize with a large min
mqLgMin= 'only screen and (min-width:'+screenLgMin+'px)';
// Add the different states we can test against
ssm.addStates([
{
id: 'scr-max',
query: mqScreenMax
},
{
id: 'xs-min',
query: mqXsMin
},
{
id: 'xs-max',
query: mqXsMax
},
{
id: 'sm-min',
query: mqSmMin
},
{
id: 'sm-max',
query: mqSmMax
},
{
id: 'md-min',
query: mqMdMin
},
{
id: 'md-max',
query: mqMdMax
},
{
id: 'lg-min',
query: mqLgMin
}
]);
在特定页面上,我想在匹配我们的" sm-min"时添加一些功能。媒体查询:
ssm.getState('sm-min').options.onEnter.push(
function() {
// do stuff
}
);
如果我向下调整屏幕大小并进行备份,触发onEnter私有功能,则此功能正常。但是,它不适用于页面加载,而如果我在上面的初始ssm.addStates()中定义了onEnter函数,它就会。我假设这是因为我在AFTER SSM中添加了该函数已经实例化,因此它没有运行。所以,为了解决这个问题,我尝试强制它作为IIFE运行:
ssm.getState('sm-min').options.onEnter.push(
(function() {
// do stuff
})()
);
然后按预期工作,立即运行,但在下一场比赛中再也不会运行。
我还试图添加一个函数和一个IIFE,并且无法使其工作。 (很确定这不是有效的数组代码,或使用数组):
ssm.getState('sm-min').options.onEnter.push([
(function() {
// do stuff
}()),
function() {
// do stuff
}
]);
在使用push()添加onEnter函数后,我还没弄清楚如何强制SSM重新执行自己; documentation没有涵盖(并且有点过时)。我在src / ssm.js里面挖了一下,但我认为我的javascript句柄并不是标准的,以便弄清楚如何强制它进入State或重新初始化。
任何人都知道如何添加功能并让它执行并继续执行?