如何构建优雅降级的HTML5范围?

时间:2010-02-11 17:04:35

标签: javascript jquery ruby-on-rails html5 progressive-enhancement

我想将HTML5中的<input type='range' />用于支持它的浏览器,如果没有,则降级为<select />。我正在使用Ruby-on-Rails,所以其他所有方法都失败了,我可以在服务器端执行类似this的操作。

但是,我更希望通过Javascript更好地实现渐进增强的理念。如果它是JQuery,奖励积分。

2 个答案:

答案 0 :(得分:5)

查看Modernizr,它会告诉您是否支持范围。我相信该技术是创建一个范围输入并检查它的类型 - 如果它仍然是“范围”,那么它是支持的。否则,它应该报告“文本”,这是其他浏览器的后备。

答案 1 :(得分:1)

首先检测浏览器是否可以处理HTML 5,然后使用以下内容:

   $('input').each(function (i, item) {
        if ($(item).attr('min') !== undefined && $(item).attr('max') !== undefined) {
            var select = document.createElement("SELECT");
            $(select).attr('name', $(item).attr('name'));
            $(select).attr('id', $(item).attr('id'));
            $(select).attr('disabled', $(item).attr('disabled'));
            var step = 1;
            if ($(item).attr('step') !== undefined) {
                step = parseFloat($(item).attr('step'));
            }

            var min = parseFloat($(item).attr('min'));
            var max = parseFloat($(item).attr('max'));
            var selectedValue = $(item).attr('value');
            for (var x = min; x <= max; x = x + step) {
                var option = document.createElement("OPTION");
                $(option).text(x).val(x);
                if (x == selectedValue) { $(option).attr('selected', 'selected'); }
                $(select).append(option);
            };
            $(item).after(select);
            $(item).remove();
        }
    });

由于你不能使用input[type=range]选择器,我必须使用$(item).attr('min') && $(item).attr('min')方法,如果你有其他类型的输入控件具有这两个属性,这将有点奇怪。