澄清
这是脚本的一部分,用于检查用户是否已更改表单中的值和值.如果用户在更改值后尝试离开页面,则会通过onbeforeunload收到警报,并显示离开页面或停留的选项.
棘手的部分是确定(多个)选择列表的更改状态…这是该问题适用的地方.我只是想看看是否有人能够发现任何潜在的问题.
有人提到,总是使用默认值进行比较可能没有意义.但是,在这种情况下确实有意义.如果用户更改了值,然后在离开页面之前将其更改回原始值,他们可能不希望“您在页面上更改了soemthing,离开还是留下?”警报弹出.
下面的代码旨在检查选择列表(< select>)以查看“selected”属性是否与默认的“selected”属性相同.它应该适用于多选列表以及单选项选择列表.
如果所选选项与默认选项相同,则函数IsSelectChanged’应该返回所选选项与默认值和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>
代码应该适用于允许多个选择/初始选择的选择列表和单选变体(如上所示).
任何人都可以发现任何潜在的错误或效率低下吗?或者知道更好的方法吗?
谢谢
解决方法
因为你正在测试假和&&真实或真实&&是的,你应该只能使用!==因为想法似乎是你想要在不匹配时返回true.
if(option.defaultSelected !== option.selected) { return true; }
此外,由于循环的顺序在这里似乎并不重要,您应该能够使用while循环,这应该更有效.
var options = select.options,l = options.length; while ( l-- ) { ...
这样就不需要进行比较.