jquery:修复 if() 的第一次失火

jquery: fix first misfire of if()

本文关键字:第一次 失火 修复 if jquery      更新时间:2023-09-26

My js fiddle is here:http://jsfiddle.net/brvnhg1w/

(请先运行上面的小提琴)如果你双击这三个点,它会变成一个文本框,一旦你点击退出按回车键,它就会恢复为文本。这工作正常。

如果文本已更改,我想通过 ajax 调用在数据库中进行更新,但是第一次更改文本(例如:从三个点更改为例如"111"),如果您在控制台中查看,它会显示"未更改"而不是"已更改",如果您查看以下行:console.log("Id: "+this.id+ " Value: " +this.value+ " OldValue:" +v );在控制台中打印, 出于某种原因,它采用新值并将其打印为上一个值:(

所以基本上:如果我在"更改"部分有我的 ajax 代码,客户端第一次更改文本框时 - 它不会触发...... :(

问题似乎出在代码的这一部分:

  var n = prev.ix.indexOf(this.id);
  var v=prev.val[n];

  if(this.value!=v){
      //value changed
      console.log("changed");
      prev.val[n]=this.value;//update existing value
      // do .ajax - update the DB
  }else{
      console.log("unchanged");
  }
console.log("Id: "+this.id+ " Value: " +this.value+ " OldValue:" +v );

问题是当您检查当前输入是否在数组中时,您设置了值。因此,一旦您达到条件,该值将始终与第一次相同。

为了解决这个问题,不要在数组中推送一个值,而是将一个空字符串推送''

  if($.inArray(this.id,prev.ix) == -1){
      prev.ix.push(this.id);
      prev.val.push('');
  }

小提琴 : http://jsfiddle.net/brvnhg1w/5/

当函数第一次触发时(以及每个后续时间),您将值推送到数组中 prev .但这是与值进行比较的数组,因此它将第一个值与自身进行比较并记录"不变"。您可能需要为初始运行编写边缘情况:

var n = prev.ix.indexOf(this.id);
var v=prev.val[n];
var flag = true;
if(this.value!=v || flag){
    //value changed
    console.log("changed");
    prev.val[n]=this.value;//update existing value
    // do .ajax - update the DB
    //set flag to false, initial run over
    flag = false;
}else{
    console.log("unchanged");
}

console.log("Id: "+this.id+ " 值: " +this.value+ " OldValue:" +v );

http://jsfiddle.net/5eru6mt2/1/