这是脚本的一部分,用于检查用户是否已更改表单中的值和值.如果用户在更改值后尝试离开页面,则会通过onbeforeunload收到警报,并显示离开页面或停留的选项.
棘手的部分是确定(多个)选择列表的更改状态...这是该问题适用的地方.我只是想看看是否有人能够发现任何潜在的问题.
有人提到,总是使用默认值进行比较可能没有意义.但是,在这种情况下确实有意义.如果用户更改了值,然后在离开页面之前将其更改回原始值,他们可能不希望"您在页面上更改了soemthing,离开还是留下?" 警报弹出.
下面的代码用于检查选择列表(<select>)以查看"selected"属性是否与默认的"selected"属性相同.它应该适用于多选列表以及单选项选择列表.
如果所选选项与默认选项相同,则该函数为IsSelectChanged' should returntrue if the selected option(s) are not the same as the default andfalse.
代码:
<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>
Run Code Online (Sandbox Code Playgroud)
代码应该适用于select允许多个选择/初始选择的列表和单选变体(如上所示).
任何人都可以发现任何潜在的错误或效率低下吗?或者知道更好的方法吗?
谢谢
好吧,我不知道它会变得多么"高效",但你基本上在循环体中做了一个异或(2 if语句),那么为什么不使用一个呢?IIRC,JS没有明确的XOR只有一点点(更多信息)[^ https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators].通过使用三元运算符传递1或0的值,可以实现使用按位^来模拟实际XOR的变通方法,例如:
if ((option.defaultSelected ? 1 : 0) ^ (option.selected ? 1 : 0)) { return true }
Run Code Online (Sandbox Code Playgroud)
如果您的目的是为了简洁(感谢@some的想法,请参阅下面的评论以获取详细信息);
if (option.defaultSelected ^ option.selected) { return true }
Run Code Online (Sandbox Code Playgroud)
将获得与if代码中的两个语句相同的效果.