Javascript 代码审查:高效?行吗? 澄清
这是脚本的一部分,用于检查用户是否已更改表单中的值。如果用户在更改值后试图离开页面,他们将通过onbeforeunload收到警报,并显示离开页面或停留的选项 棘手的部分是确定(多个)选择列表的更改状态…这就是这个问题适用的地方。我只是想看看是否有人能发现任何潜在的问题,它正在做的方式 有人提到,总是使用默认值进行比较可能没有意义。然而,在这种情况下,这是有意义的。如果用户更改了一个值,然后在离开页面之前继续将其更改回原始值,则他们可能不希望弹出“您已更改页面上的内容,离开或停留?”警报Javascript 代码审查:高效?行吗? 澄清,javascript,Javascript,这是脚本的一部分,用于检查用户是否已更改表单中的值。如果用户在更改值后试图离开页面,他们将通过onbeforeunload收到警报,并显示离开页面或停留的选项 棘手的部分是确定(多个)选择列表的更改状态…这就是这个问题适用的地方。我只是想看看是否有人能发现任何潜在的问题,它正在做的方式 有人提到,总是使用默认值进行比较可能没有意义。然而,在这种情况下,这是有意义的。如果用户更改了一个值,然后在离开页面之前继续将其更改回原始值,则他们可能不希望弹出“您已更改页面上的内容,离开或停留?”警报 下面
下面的代码用于检查选择列表(
),以查看“选定”属性是否与默认的“选定”属性相同。它应该适用于多个选择列表以及单个选项选择列表
如果所选选项与默认选项不同,则函数“IsSelectChanged”应返回true;如果所选选项与默认选项相同,则函数“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>
选择1
选择2
//守则:
功能已更改(选择){
var options=select.options,
i=0,
l=选项。长度;
//收集当前选定项和默认选定项
对于(;i
代码应适用于允许多个选择/初始选择的select
列表和单选变体(如上所示)
有人能在这里发现任何潜在的错误或低效吗?或者知道更好的方法吗
谢谢好吧,我不知道这样做会有多“高效”,但您基本上是在循环体中执行XOR(2IF语句),所以为什么不使用一个呢?IIRC,JS没有显式异或,只有按位异或(更多信息)[^。可以通过使用三元运算符将1或0的值传递给实际的异或,从而实现一种变通方法,使用按位^模拟实际的异或,例如:
if ((option.defaultSelected ? 1 : 0) ^ (option.selected ? 1 : 0)) { return true }
如果你想简明扼要(感谢你的想法,详情请参见下面的评论)
将实现与代码中的两个
if
语句相同的效果。为什么在选择器中循环使用所有选项?您不能只选择所选选项或默认所选选项吗
$("select option:selected").doSomething();
$("select option.defaultSelected").doSomething();
我不知道你想用这些东西做什么。既然你在测试
false&&true
或true&&false
,你应该能够使用!=
,因为你的想法似乎是当它们不匹配时,你想返回true
if(option.defaultSelected !== option.selected) {
return true;
}
此外,由于循环的顺序在这里似乎并不重要,因此您应该能够使用while
循环,这应该更有效一些
var options = select.options,
l = options.length;
while ( l-- ) {
...
这样就无需进行比较。您想实现什么?如果您首先选择Opt 2并在函数中得到true,然后在下一次更改时,如果设置回默认值,您是否仍希望得到false?如果是这种情况,那么我想如果您将函数命名为selectedchangedsincepageload o,您的函数可能更容易阅读r类似的。@Knubo(伙计,在QWERTY键盘上很难输入),是的,你知道了。只有当它匹配默认的
选择的属性时才有意义。唉,在我发布了澄清后,有人刚刚对“你想完成什么”的评论投了更高的票。我怎样才能让事情变得更清楚呢?哇,这是一个多么独特的问题啊(对javascript)方法。您的编码(语言)是什么背景?+1表示聪明。@amireh:我刚刚测试了FF、IE、Opera和Chrome,他们都同意:true^true==0
和true^false==1
,所以没有必要在xor之前将其转换为数字。顺便说一句,两个if语句都退出循环,这让我觉得有更好的方法。所以,谢谢!@你在跟踪我吗?haha@amireh:我只是查了一下:JS只有一个按位异或,这是对的。但是它实现为(伪):返回leftSide.GetValue().ToInt32()或rightSide.GetValue().ToInt32()
。请参阅ECMA-262第五版中的第10.11节:jQuery(呃,Sizzle)最有可能的方法是遍历所有选项以确定哪些选项与我的代码一样被选中。defaultSelected
不是CSS类;它是option元素的属性。但是,在查看jQuery代码后,Safari似乎错误地报告了选项的默认selected属性。使用jQuery返回选定的元素可能是最佳选择+1@David-不客气。我还添加了一条关于使用while
循环的说明。只要可以接受反向顺序循环,我就会使用它们。:o)没错,如果我们必须在所有对象上循环,则反向循环会更快。但是,选择列表中的第一个选项通常是默认的选定选项。当然这只是猜测。另外,请检查;基准测试结果可能会让您感到惊讶。@David-非常好的一点。我认为您是对的,默认选定的选项通常位于因此,一个正向循环是有意义的。谢谢你的链接。对我来说,反向w
var options = select.options,
l = options.length;
while ( l-- ) {
...