Javascript 文本输入值有时不';即使没有错误,也不会改变,而且似乎有效

Javascript 文本输入值有时不';即使没有错误,也不会改变,而且似乎有效,javascript,html,Javascript,Html,因此,我有一个简单的程序,每次你模糊输入字段时,它都会改变输入字段的值。它记录数组中已使用的值,我使用该数组检查是否已使用。它实际上可以按预期工作,但经过几次尝试后,它将返回true并记录日志,但值不会改变 更新代码: var dftvalue = ['Freddy the Grocer', 'Jack the Fiddler', 'Cane the Sheep Herder', 'Arnold the Fish Monger', 'Luke the Car Salesman', 'Josh t

因此,我有一个简单的程序,每次你模糊输入字段时,它都会改变输入字段的值。它记录数组中已使用的值,我使用该数组检查是否已使用。它实际上可以按预期工作,但经过几次尝试后,它将返回true并记录日志,但值不会改变

更新代码:

var dftvalue = ['Freddy the Grocer', 'Jack the Fiddler', 'Cane the Sheep Herder', 'Arnold the Fish Monger', 'Luke the Car Salesman', 'Josh the Tailor', 'Carol the Baker', 'Tiara the Nacho Vendor', 'example@email.com', 'Your message here.'];

var logused =  new Array(); //create new array to log the used indexs

function setdftvalue() {
   var newval = dftvalue[Math.floor(Math.random() * 7)];
   if (logused.indexOf(newval) == -1) {
     this.value=newval;
     logused.push(newval);
     console.log(logused);
   } else if (logused.indexOf(newval) >= 0) {
     setdftvalue();
   }
   if (logused.length == 8) {
      for (i=0; i<=7; i++){
        logused.pop();
      }
   }
}
document.getElementById('formname').onblur=setdftvalue;
var dftvalue=['Freddy the Grocer'、'Jack the Fiddler'、'Cane the Sheep Herder'、'Arnold the Fish Monger'、'Luke the Car Sales'、'Josh the Tailor'、'Carol the Baker'、'Tiara the Nacho Vendor'、'example@email.com“,”您的留言在这里。“];
var logused=新数组()//创建新数组以记录使用的索引
函数setdftvalue(){
var newval=dftvalue[Math.floor(Math.random()*7)];
if(logused.indexOf(newval)=-1){
this.value=newval;
logused.push(newval);
console.log(logused);
}else if(logused.indexOf(newval)>=0){
setdftvalue();
}
如果(logused.length==8){

对于(i=0;i而言,您的方法是不必要的复杂。在较高的层次上,我建议您采用以下方法:

function setdftvalue() {
    if (index === (dftvalue.length - 1)) {
        // Shuffle your names array
        index = -1;
    }

    input.value = dftvalue[++index];
}
这样你就不需要使用任何递归,也不需要进行不必要的函数调用。你唯一需要随机化的时间就是当你用完所有可用的名字时

下面是一个工作示例:

原始答案


在几次调用之后,您的函数将填充
logused
数组,在这一点上再次调用它将一事无成。实际上,比什么都不做更糟糕的是,它将无休止地递归调用自己。

它仍然返回一些东西?对我来说,这更像是一个无限循环!要求是什么?预期的结果是什么?我想我没有很好地指出我的问题:D抱歉。逻辑实际上是有效的,因为它只会递归以获取一个新的值,而该值不在logused数组中。我已经更新了代码,以包含数组限制,并在使用/记录每个给定值后将其重置为默认状态。我的问题是,在运行一段时间后,代码会有效,但值sn有时并没有实际绘制到输入字段。当我检查控制台中使用的logused时,它显示代码工作正常。在代码下面,我写了“请记住,我还没有处理在数组填满所有七个索引后重置数组的问题”。从那以后,我更新了代码并添加了适当的功能。它只会递归,直到找到为止一个没有记录的值,如果它们都用完了,那么它将清空日志并从那里开始。我的问题不是真正的逻辑,而是一个奇怪的问题,即更改文本feild的值。有时它可以工作,但在一段时间后它仍然记录并保存值,只是不会更改值。对不起,从阅读您的问题中我不清楚这一点你知道你的代码的结构有问题,你在问另一个问题。当然文本字段值不会随着代码以前的方式而改变,因为一旦数组填满,if语句的那部分就永远不会到达。我做了一个小动作,所以可能问题更清楚了。我s我不太擅长解释XD也不担心会登录到控制台的Firefox递归错误。事实上……您链接到的JSFIDLE显示了我之前指出的确切问题。您的数组已满,然后您的函数不断调用自己,直到出现堆栈溢出—您说过要忽略该错误。