Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过javascript更改其中一个值来交换值?_Javascript_Jquery - Fatal编程技术网

如何通过javascript更改其中一个值来交换值?

如何通过javascript更改其中一个值来交换值?,javascript,jquery,Javascript,Jquery,有三个字段的数字从1到3。我试图做到这一点,如果一个人只使用箭头,那么应该总是有一个“1”,一个“2”,和一个“3”。为什么它不总是起作用,我怎样才能使它起作用 jQuery(文档).ready(函数($){ var-prevNumber; $(“.numbers”).focus(函数(){ prevNumber=$(this.val(); }).change(函数(){ curNumber=$(this.val(); $('.numbers[value=“'+curNumber+'”]:不是

有三个字段的数字从1到3。我试图做到这一点,如果一个人只使用箭头,那么应该总是有一个“1”,一个“2”,和一个“3”。为什么它不总是起作用,我怎样才能使它起作用

jQuery(文档).ready(函数($){
var-prevNumber;
$(“.numbers”).focus(函数(){
prevNumber=$(this.val();
}).change(函数(){
curNumber=$(this.val();
$('.numbers[value=“'+curNumber+'”]:不是(:focus)”.first().val(prevNumber);
prevNumber=curNumber;
});
});

为什么这种方法不起作用
属性未连接到输入值。我知道这听起来很奇怪。:-)
属性是输入的默认值。它不会更改(除非您使用
setAttribute(“value”,x);
.defaultValue=x;
来更改它)

选择器使用以下属性:

因此,它将在用户未更改其值的输入上工作,但一旦用户更改了输入值,它将失败,选择错误的输入

你怎么能修好它 您可以通过同时设置
defaultValue
value
(确保在更改的值上更新
defaultValue
)来更改默认值和值,如下所示(请参见注释):

jQuery(文档).ready(函数($){
var-prevNumber;
$(“.numbers”).focus(函数(){
prevNumber=$(this.val();
}).change(函数(){
//获取元素包装器
var$this=$(this);
//获取当前值
var curNumber=$this.val();
//确保此元素的默认值已更新
this.defaultValue=curNumber;
//更新另一个上的值和默认值
//以前有此号码的输入
$('.numbers[value=“'+curNumber+”]:非(:焦点)).first().val(prevNumber).prop(“defaultValue”,prevNumber);
prevNumber=curNumber;
});
});

代码中的问题是“value”属性包含输入的初始值。使用以下选择器时:

$('.numbers[value="' + curNumber + '"]:not(:focus)')
您选择的元素最初具有给定值,但现在没有该值。 请尝试此选择器,所有选项都可以正常工作:

$('.numbers:not(:focus)').filter(function(index, element){ 
    return $(element).val() == curNumber; 
  })

这是一本书

我想向您推荐一个更详细的解决方案,它可能会随着应用程序的增长而帮助您:您应该将JS值存储在控制它的
之外(这样,添加多个
或修改代码中的值变得更容易。最重要的是,您应该拥有一个独立于DOM的可信数据存储,该存储始终处于有效状态(在这种情况下:无重复)

考虑到您的问题(值应该是唯一的,并且只能进行交换),将其作为一个纯JS问题来处理会更容易(不要尝试在jQuery中做任何事情-尽管我同意这是一个很好的库,但它不一定是所有事情的最佳工具)

以下是我的解决方案:

jQuery(文档).ready(函数($){
//此数组将显示输入的当前值
变量数=[1,2,3];
//数字不应直接修改,而应通过
//setNumber:此函数确保数字始终为零
//原始价值的交换([1,2,3])。
//设置值后,此函数返回上一个值
//价值指数
函数集合号(索引,newVal){
//查找其他索引
var prevIndex=数字。indexOf(newVal);
如果(指数<0){
警报(“无效值,请输入1、2或3”);
}
//交换
数字[索引]=数字[索引];
数字[索引]=newVal;
回归指数;
}
//此功能更新输入以确保
//它们的显示值与以数字形式存储的值相匹配
函数updateEnumbersView(){
$(“.numbers”)。每个(函数(idx,元素){
elem=$(elem);
if(parseInt(elem.val(),10)!==number[idx]){
元素值(数字[idx]);
}
});
}
$(“.numbers”).change(函数(){
var self=$(这是);
var curNumber=parseInt(self.val(),10);
var curIndex=$(“.numbers”).index(自);
if(curNumber==数字[curIndex]){
返回false;//无更改
}
//更新模型:
var changedIndex=设置编号(curIndex,CURNAMER);
//更新视图:
$('.numbers').eq(changedIndex).val(numbers[changedIndex]);
//或更通用(即,相同值的多个输入):
//updateEnumbersView();
});
});

我将通过向每个节点添加另一个属性来解决这个问题

jQuery(文档).ready(函数($){
变量$numbers=$('.numbers'),
关=假;
$numbers.每个(函数(){
this.prev=this.value;
});
$numbers.change(函数(){
var source=此;
if(off)return;//此算法已在运行
关=真;
$numbers.每个(函数(){
if(this!==source&&this.value===source.value){//if冲突
this.prev=this.value=source.prev;//与旧值交换
}
});
this.prev=this.value;//下次更新
off=false;//重新启用
});
});


“仅箭头”如浏览器内置的用于数字字段的步进箭头?请尽可能使用堆栈片段(工具栏按钮)而不是指向JSFIDLE的链接(并非总是可以,但在本例中是这样)。这一次我帮你做了。@T.J.Crowder是的,这些箭头。同样很抱歉,我在stackoverflow元中没有足够的声誉来测试代码片段是如何工作的,所以我没有使用它。不用担心。不需要在元上测试它,不过,你可以(也应该!)在写问题时测试它。@JuanMendes:我已经更新来解释为什么
$('.numbers:not(:focus)').filter(function(index, element){ 
    return $(element).val() == curNumber; 
  })