首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enquire.js -负载中的不匹配事件

Enquire.js -负载中的不匹配事件
EN

Stack Overflow用户
提问于 2014-07-07 12:50:06
回答 2查看 1.4K关注 0票数 2

看这个小提琴

代码语言:javascript
复制
enquire.register("screen and (max-width: 640px)", {
    match: function () {
        $("body").css("background","red");
    },
    unmatch: function () {
        $("body").css("background","blue");
    }
});

当浏览器窗口是640 to或更少的加载,那么背景色将被设置为红色。(即调用匹配事件)。但是,当窗口在加载时大于640 is时,什么都不会发生,即不调用不匹配事件。为什么不行?如果没有匹配的条件,是否有办法强制不匹配的事件开火?

基本上,我想要的是,查询表现为即时调用的if-else语句。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-07 19:14:53

当我设计enquire.js时,它的目的是与移动第一轮驱动一起使用。因此,它假定您正在采取一种渐进的增强方法。也就是说,当查询匹配时调用匹配,只有当匹配已经发生一次时才调用不匹配(并且查询不再匹配)。这可能看起来很奇怪,但常见的用例是“在此查询匹配时执行一些操作,当它不再匹配时将其撤消”。一个示例可能是将元素转换为大屏幕上的选项卡式区域,否则返回到堆栈元素:

代码语言:javascript
复制
enquire.register(desktopMediaQuery, {
  match : function() { 
    makeTabs(someElement);
  },
  unmatch : function() {
    makeStacked(someElement);
  }
};

如果最初调用了不匹配,当查询不匹配时,则必须将逻辑放入不匹配回调中,以检查匹配是否已经发生(更糟的是,在makeStacked中有这样的逻辑)。

如果我们要严格遵循渐进式增强,那么在您的示例中,我将在CSS中默认设置背景蓝色,并在match中添加一个类,并删除不匹配中的类:

代码语言:javascript
复制
enquire.register("screen and (max-width: 640px)", {
    match: function () {
        $("body").addClass("red-bg");
    },
    unmatch: function () {
        $("body").removeClass("red-bg");
    }
});

虽然我假设您的示例是您实际需要的简化版本。因此,另一种方法是使用安装回调来覆盖默认情况:

代码语言:javascript
复制
enquire.register("(max-width: 640px)", {
    setup : function() {
        $("body").css("background","blue");
    },
    match : function() {
        $("body").css("background","red");
    },
    unmatch : function() {
        $("body").css("background","blue");
    }
});

如果这更适合您需要做的事情,您也可以使用两个媒体查询。我认为这比使用上面的设置更能传达意图。

代码语言:javascript
复制
enquire.register("(max-width: 640px)", {
    match : function() {
        $("body").css("background","red");
    }
})
.register("(min-width: 641px)", {
    match : function() {
        $("body").css("background","blue");
    }
});

下面是演示这两种方法的小提琴:http://jsfiddle.net/7Pd3m/

票数 6
EN

Stack Overflow用户

发布于 2015-03-18 16:56:42

查询js在寄存器函数内部提供了一个名为setup的方法,该方法在调用寄存器处理程序时只触发一次(没有检测到任何媒体查询)。因此,您可以扩展代码,使其包括如下内容:

代码语言:javascript
复制
enquire.register("screen and (max-width: 640px)", {
    setup: function() {
     // do stuff here as soon as register is called.
    },
    match: function () {
        $("body").css("background","red");
    },
    unmatch: function () {
        $("body").css("background","blue");
    }
});

(参考他们的文档http://wicky.nillia.ms/enquire.js/#quick-start)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24611021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档