3

这怎么会同时发出警报,是的还是假的?

Modernizr.load([
    {
        test: Modernizr.cssgradients,
        yep: alert('Supports it!'),
        nope: alert('Oh, damn! This browser sucks!')
    }
]);

我在 OS X 上使用最新的 chrome。

4

3 回答 3

13

因为您alert()直接在那里调用,并且alert()(always undefined) 的结果被分配给yepandnope属性。您需要包装alert()一个函数并分配该函数:

Modernizr.load([
    {
        test: Modernizr.cssgradients,
        yep: function () { alert('Supports it!') },
        nope: function () { alert('Oh, damn! This browser sucks!') }
    }
]);

仍然行不通,因为这不是yepnope的工作方式。 yep并且nope应该是加载的 JS 文件的路径:

Modernizr.load([
    {
        test: Modernizr.cssgradients,
        nope: 'cssgradients-shim.js'  //-> load a JS file to draw your gradients
    }
]);

正如您自己发现的那样,如果您不想使用集成的 yepnope.js,您可以按照传统方式使用 Modernizr :

if (!Modernizr.cssgradients) {
    alert('Oh, damn! This browser sucks!');
}
于 2011-10-18T14:12:42.443 回答
3

使用 yepnope 前缀,可以运行预定义的命名函数。注意:我只在 OS X 上使用最新的 chrome 对此进行了测试。

但是,要使其工作,您将需要一个“虚拟 URL”,例如,您计划在页面上加载的图像(您的徽标是一个很好的候选者)。

此外,由于Modernizr.load只为方法设置别名yepnope.apply,因此您需要yepnope按名称引用以添加前缀。

/*globals window */
(function (Modernizr) {
    "use strict";
    window.yepnope.addPrefix('function', function (resourceObj) {
        var dummyUrl = 'static/my_logo.png';
        resourceObj.noexec = true;
        window[resourceObj.url]();
        resourceObj.url = dummyUrl;
        return resourceObj;
    });
    // predefined functions
    window.alert_support = function () {
        window.alert('Supports it!');
    };
    window.alert_damn = function () {
        window.alert('Oh, damn! This browser sucks!');
    };
    window.alert_boom = function () {
        window.alert('boom');
    };
    // Modernizer.load is an alias for yepnope. See API at http://yepnopejs.com/.
    Modernizr.load([{
        test: Modernizr.cssgradients,
        yep: 'function!alert_support',
        nope: 'function!alert_damn'
    }, {
        test: Modernizr.rgba,
        yep: 'function!alert_boom'
    }]);
}(window.Modernizr));

当然,如果你不想污染全局window命名空间,你可以把你的命名函数放在一个对象中,然后更改window[resourceObj.url]();window.MyObj[resourceObj.url]();.

这样做的真正威力是callback函数触发,命名函数也可以调用Modernizr.load,和/或您可以编写比此处显示的通用函数执行器更有目的性的前缀。

于 2012-03-04T12:47:58.397 回答
2

和参数不接受函数作为参数yepnope它们应该是一个string或一个array of strings指示脚本,以根据是test成功还是失败来加载。Modernizr.load有关更多信息,请参阅文档。

于 2011-10-18T14:24:50.327 回答