代码之家  ›  专栏  ›  技术社区  ›  David Murdoch

代码评审:高效?它能用吗?

  •  3
  • David Murdoch  · 技术社区  · 14 年前

    澄清

    这是脚本的一部分,用于检查用户是否 改变 以及形式上的值。如果用户在更改某个值后试图离开页面,则会通过onbeforeunload收到警报,并提供离开页面或停留的选项。

    棘手的部分是确定一个(多个)选择列表的更改状态…这是这个问题适用的地方。我只是想看看是否有人可以发现任何潜在的问题,它正在做的方式。

    有人提到,总是使用默认值进行比较可能没有意义。然而,在这种情况下,它确实是有意义的。如果用户在离开页面之前更改了某个值,然后继续将其更改回原始值,那么他们可能不希望看到“您更改了页面上的内容,离开或停留?”警报弹出。


    下面的代码用于检查选择列表( <select> )查看“选定”属性是否与默认的“选定”属性相同。它应该适用于多个选择列表以及单个选项选择列表。

    功能 IsSelectChanged' should return if the selected option(s) are not the same as the default and false`如果所选选项与默认选项相同。

    代码:

    <select>
        <option selected="selected">Opt 1</option>
        <option>Opt 2</option>
    </select>
    <script>
        // the code:
        function IsSelectChanged(select){
            var options = select.options,
                i = 0,
                l = options.length;
            // collect current selected and defaultSelected
            for (; i < l; i++) {
                var option = options[i];
                // if it was selected by default but now it is not
                if (option.defaultSelected && !option.selected) {
                    return true;
                }
                // if it is selected now but it was not by default
                if (option.selected && !option.defaultSelected) {
                    return true;
                }
            }
            return false;
        }
    
        // implementation:
        $("select").change(function(){
            doSomethingWithValue( IsSelectChanged(this) );
        });
    </script>
    

    该代码应该同时适用于 select 允许多个选择/初始选择和单个选择变体的列表(如上所示)。

    有人能在这里发现任何潜在的缺陷或效率低下的地方吗?或者知道更好的方法吗?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  1
  •   user113716    14 年前

    false && true true && false !== return true

    if(option.defaultSelected !== option.selected) {
        return true;
    }
    

    while

    var options = select.options,
        l = options.length;
    while ( l-- ) {
       ...
    

        2
  •  5
  •   Community Lee Campbell    7 年前

    if ((option.defaultSelected ? 1 : 0) ^ (option.selected ? 1 : 0)) { return true }
    

    @some

    if (option.defaultSelected ^ option.selected) { return true }
    

    if

        3
  •  1
  •   Matti Lyra    14 年前

    $("select option:selected").doSomething();
    $("select option.defaultSelected").doSomething();