【问题标题】:Change to plural if value in textbox is greater than 1如果文本框中的值大于 1,则更改为复数
【发布时间】:2013-03-26 22:29:46
【问题描述】:

我有一个这样的文本框和一个选择框:

<h3>Recipe Yield</h3>
<input style='width:100px' type="text" name="yield" class="small" />
<select name='yieldType'>
    <option value='Servings'>Serving(s)</option>
    <option value='Cups'>Cup(s)</option>
    <option value='Loaves (Loaf)'>Loaves (Loaf)</option>
</select>

这是一个 JSFiddle:http://jsfiddle.net/T3Sxb/

如您所见,选择选项的形式为word(s)

但我想有一个脚本在什么时候

  • 如果输入框中的数字为1,则选项中的值是word的形式
  • 如果输入框中的数字大于 1,则选项中的值为复数。

这可能吗?我怎样才能做到这一点?感谢大家的帮助!

【问题讨论】:

    标签: javascript jquery html forms


    【解决方案1】:

    我正在使用数据属性,以便您可以为每个项目声明正确的单数/复数形式。在很多情况下,简单地添加“s”是行不通的。

    另请注意,零项通常(总是?)采用复数形式。

    HTML

    <input style='width:100px' type="text" id="yield" class="small" />
    <select id='yieldType'>
        <option value='Servings' data-single="Serving" data-other="Servings"></option>
        <option value='Cups' data-single="Cup" data-other="Cups"></option>
        <option value='Loaves (Loaf)' data-single="Loaf" data-other="Loaves"></option>
    </select>
    

    JavaScript

    var yield = $("#yield");
    var yieldType = $("#yieldType");
    
    function evaluate(){
        var single = parseInt(yield.val(), 10) === 1;
        $("option", yieldType ).each(function(){
            var option = $(this);
            if(single){
                option.text(option.attr("data-single"));
            }else{
                option.text(option.attr("data-other"));
            }
        });
    }
    
    // whatever events you want to trigger the change should go here
    yield.on("keyup", evaluate);
    
    // evaluate onload
    evaluate();
    

    【讨论】:

    • 我一直在玩你的 jsfiddle,一遍又一遍。太酷了,感谢您的出色回答
    • 没问题;这是一个有趣的问题。
    • 如果我有多个输入和选择,有没有办法可以使用它?
    • 当然...让我创建一个示例。
    • 给你:jsfiddle.net/T3Sxb/17。我还为输入添加了样式,因此大小不会随着值的变化而跳跃。
    【解决方案2】:

    你可以试试这个:http://jsfiddle.net/T3Sxb/7/

    var plural = {
        Serving: "Servings",
        Cup: "Cups",
        Loaf: "Loaves"
    };
    
    var singular = {
        Servings: "Serving",
        Cups: "Cup",
        Loaves: "Loaf"
    };
    
    $( "#pluralizer" ).on( "keyup keydown change", function() {
        var obj = parseInt( $( this ).val() ) === 1 ? singular : plural;
        $( "#YieldType option" ).each( function() {
            var html = $( this ).html();
            if ( html in obj ) {
                $( this ).html( obj[html] );
            }
        });
    });
    

    【讨论】:

    • @KingKongFrog 如果输入为空白,则不是无限​​循环。为什么投反对票?
    • +1 来自我...我没有看到无限循环,我喜欢数组的想法(可能对本地化有用)。
    • @KingKongFrog 您将收到 6 个警报。 3个来自keydown循环,3个来自keyup循环。不是无限的。
    【解决方案3】:

    从用户体验的角度来看,我认为(s) 是完全可以接受的。但无论如何,这样怎么样:

    <option value='Servings' data-singular="Serving" data-plural="Servings">Servings</option>
    

    然后:

    // you should really use IDs ;)
    $('input[name="yield"]').on('change', function () {
        var singular = parseInt($(this).val(), 10) === 1;
        $('select[name="yieldType"]').each(function () {
            if (singular) {
                $(this).val($(this.attr('data-singular')));
            } else {
                $(this).val($(this.attr('data-plural')));
            }
        });
    });
    

    【讨论】:

    • +1 表示同时显示单数/复数可能很好,并为 parseInt() 添加基数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多