【问题标题】:jquery spinner with strings as input以字符串作为输入的 jquery 微调器
【发布时间】:2026-02-04 22:00:02
【问题描述】:

嗨,我搜索了,但我没有找到这样的解决方案。是否可以使用 jquery 创建一个微调器,它具有文本值(字符串)作为输入而不是数字。或者换句话说,与 http://jsfiddle.net/yaQSP/ 相同,但取而代之的是..-1,0,1.. 从字符串列表或数组中旋转文本值。

【问题讨论】:

    标签: jquery spinner


    【解决方案1】:

    上一个答案不起作用。我在给定的 chrome 和 firefox 链接下对其进行了测试。

    查看here 寻找其他解决方案。

    您需要覆盖微调器小部件的 _parse 和 _format 函数。

    这是一个简单的类布尔微调器的示例:

    $.widget("ui.boolspinner", $.ui.spinner, {
        options: {
            min: 0,
            max: 1,
            start: 1
        },
        _parse: function (value) {
            if (typeof value === "string") {
                return (value.toLowerCase() == "ja")?1:0;
            }
            return value;
        },
        _format: function (value) {
            return (value == 1)?"Ja":"Nein";
        }
    });
    
    $(function() {
        $("#spinner-testprint").boolspinner();
    });
    

    http://jsfiddle.net/k46bA/

    我完成了自己的小部件。它使用字符串数组作为输入。

    $.widget("ui.formatSpinner", $.ui.spinner, {
        options: {
        },
        _parse: function (value) {
            if (typeof value === "string") {                
                return this.options.values.indexOf(value);
            }
            return value;            
        },
        _format: function (value) {
            //wrap around
            if (value < 0) {
                value = this.options.values.length-1;
            }
            if (value > this.options.values.length-1) {
                value = 0;
            }
            var format = this.options.values[value];
            return format;
        },          
    }); 
    

    用法:

    //paper type spinner
    var arrPaperTypes = ["Standard 80g", "Standard 100g", "Gloss 100g", "Gloss 120g"];
    
    $(function() {
        $("#spinner-paper").formatSpinner({
            values: arrPaperTypes
        });
    }); 
    

    【讨论】:

    • 这太棒了。注意:你真的不需要'count',你可以使用this.options.values.length。
    • @rocketsarefast 谢谢你的信息。我将相应地更改上面的代码。
    【解决方案2】:

    以 Bojan 的回答为基础,稍加修饰,并通过覆盖 _adjustValue,可以获得更清洁的解决方案:

    $.widget("ui.textSpinner", $.ui.spinner, {
        options: {
            wrap: true
        },
        _parse: function (value) {
            if ((value === '') || isNaN(value)) {
                value = this.options.values.indexOf(value);
                if (value === -1) {
                    value = 0;
                }
            }
            if (value < 0) {
                value = this.options.wrap ? (this.options.values.length -1) : 0;
            } else if (value >= this.options.values.length) {
                value = this.options.wrap ? 0 : (this.options.values.length - 1);
            }
            return value;
        },
        _format: function (value) {
            return this.options.values[value];
        },
        _adjustValue: function (value) {
            if (value < 0) {
                value = this.options.wrap ? (this.options.values.length - 1) : 0;
            } else if (value >= this.options.values.length) {
                value = this.options.wrap ? 0 : (this.options.values.length - 1);
            }
            return value;
        }
    }); 
    
    var arrText = ["John", "Paul", "George", "Ringo"];
    
    $(function() {
        $("#spinner-text").textSpinner({
            values: arrText,
            spin: function( event, ui ) {
               $( "#spinner-value" ).text(ui.value);
            }
        });
        $("#spinner-text-nowrap").textSpinner({
            values: arrText,
            wrap: false,
            spin: function( event, ui ) {
               $( "#spinner-value-nowrap" ).text(ui.value);
            }
        });
    });
    <link href="http://code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="http://code.jquery.com/ui/1.11.1/jquery-ui.js"></script>
    <p>
    Wrapping <input id="spinner-text" value="3" readonly /><br />
    Value: <span id="spinner-value">3</span>
    </p>
    <p>
    No wrapping <input id="spinner-text-nowrap" value="3" readonly /><br />
    Value: <span id="spinner-value-nowrap">3</span>
    </p>

    也可以在这里找到:http://jsfiddle.net/MartynDavis/gzmvc2ds/

    【讨论】:

    • 太好了!你能发布一个不依赖 jQueryUI 的版本吗?谢谢。
    • 效果很好,只是想知道这个解决方案有什么更干净的地方。谢谢!
    • @showdev 它处理旋转(从最后一个循环到第一个,反之亦然)和非旋转(仅从第一个到最后一个) - 已经有一段时间了
    • 明白了,谢谢。是的,很抱歉挖了一个旧帖子,但我确实觉得它很有用。
    【解决方案3】:

    更新

    刚刚清理了一下http://jsfiddle.net/yaQSP/25/


    见:http://jsfiddle.net/yaQSP/23/

    你可以像这样有点hacky:创建你的数组。

    设置:

    $('#spinner').spinner({
        step: 1,
        numberformat: "n"
    });​
    

    并在输入字段上绑定更改事件。然后这样称呼它->

    yourArr[i]
    

    i 是输入字段的值。

    【讨论】: