Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 数组元素存在,但它不存在';不在那里 听输入字段中的“键控” 将“enableSubmitButton”定义为数组 做点什么 将数组元素添加到“enableSubmitButton”数组中 我从当前输入字段搜索父窗体,然后循环所有输入字段 在这个循环中,我向服务器发出请求 在“onreadystatechange”函数中,我将另一个元素推入“enableSubmitButton”数组_Javascript_Arrays - Fatal编程技术网

Javascript 数组元素存在,但它不存在';不在那里 听输入字段中的“键控” 将“enableSubmitButton”定义为数组 做点什么 将数组元素添加到“enableSubmitButton”数组中 我从当前输入字段搜索父窗体,然后循环所有输入字段 在这个循环中,我向服务器发出请求 在“onreadystatechange”函数中,我将另一个元素推入“enableSubmitButton”数组

Javascript 数组元素存在,但它不存在';不在那里 听输入字段中的“键控” 将“enableSubmitButton”定义为数组 做点什么 将数组元素添加到“enableSubmitButton”数组中 我从当前输入字段搜索父窗体,然后循环所有输入字段 在这个循环中,我向服务器发出请求 在“onreadystatechange”函数中,我将另一个元素推入“enableSubmitButton”数组,javascript,arrays,Javascript,Arrays,问题是,我在“onreadystatechange”中推送的元素实际上不在数组中。 当我使用console.log()查看数组时,元素是可见的,但是如果我使用“array.length”函数,数组元素不包括:-O $('.checkEmail, .checkPwd, .checkPwdC').bind("keyup", function() { //define enableSubmitButton as an array var enableSubmitButton = [];

问题是,我在“onreadystatechange”中推送的元素实际上不在数组中。 当我使用console.log()查看数组时,元素是可见的,但是如果我使用“array.length”函数,数组元素不包括:-O

$('.checkEmail, .checkPwd, .checkPwdC').bind("keyup", function() {
    //define enableSubmitButton as an array
    var enableSubmitButton = [];

    //loop each input field in the form
    $(this).parents("form").find(":input").each(function(index,data){

        //do some "if then else" and other stuff
        ...
        enableSubmitButton.push(true);
        ...

        // Now I make a request to the server with Ajax
        var xmlhttp = new XMLHttpRequest();                                
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                if(xmlhttp.responseText == "doesntExist"){
                    enableSubmitButton.push(true);
                }else{
                    enableSubmitButton.push(false);
                }
            }
        };

        //Request
        xmlhttp.open("GET", "ajax.php?ajaxCase=cuna&userName="+$('#fNewAccount input.checkAvailability').val(), true);
        xmlhttp.send();
    });

    // PROBLEM
    // and here we have the problem. To debugg, i use the console.log() function as follow
    var okForSubmit = true;

    console.log(enableSubmitButton);
    console.log("array length: "+enableSubmitButton.length);

    for(var i = 0 ; i < enableSubmitButton.length ; i++){
        if(enableSubmitButton[i] == false){
            okForSubmit = false;
        }
        var newTime = Math.floor(Math.random() * (100 - 1 + 1)) + 1;
        console.log(i+" - "+enableSubmitButton[i]+" - "+newTime+" - "+okForSubmit);
    }
});

有什么想法吗?

这只是JavaScript控制台本身:它记录的是实时对象和文本的混合:

stuff=[true];
console.log(stuff);
stuff.push(false);
如果在JavaScript控制台中执行此操作,您将看到如下内容

> (1) [true]
这是在推之前从原木上得到的。但如果打开“>”部分,它将显示对象的当前状态,包括推送的结果:

(1) [true]
 0: true
 1: false
 length: 2

因此,
(1)[true]
部分只是文本,它不会得到更新,但当您“打开”对象的详细信息时(使用小箭头),对象会被求值。如果再次推送某个对象,则不会发生任何更改(当然在屏幕上),但关闭重新打开详细信息可用于再次计算该对象,等等。

这是一个典型的异步性问题:HTTP请求只会在所有其他代码运行完后随响应一起出现(调用回调)

控制台显示数组中的元素是误导性的,但这是因为控制台只接收数组的引用,并且一旦您查看它,HTTP响应已经被处理,因此您可以在控制台中看到内容

要在执行
console.log
调用时真正查看数组内容,请按如下方式序列化数组:

console.log(JSON.stringify(enableSubmitButton));
现在你会看到它实际上是空的

为了解决基本问题,您可以利用jQuery为其公开的Ajax方法返回的承诺(这比
httpRequest
更容易使用)。然后,您将首先在一个数组中收集所有这些承诺,然后调用
$。此
$.when
调用的回调将仅在收到所有Ajax响应时执行,只有这样,您才能安全地创建
启用SubmitButton
数组

以下是一个简化的概念证明:

$(“按钮”)。单击(函数f(e){
e、 预防默认值();
var$inputs=$(this.parents(“表单”).find(“输入”);
var promises=$inputs.map(函数(索引、数据){
//使用jQuery发出请求,它将返回一个承诺
//我在这里使用一个测试URL;替换为您自己的URL
变量url=”https://jsonplaceholder.typicode.com/posts/“+(指数+1);
返回$.get(url).then(函数(响应){
返回响应==“DoesnTextist”;//一个布尔值
});
}).get();//承诺数组
//当所有的承诺都解决后,才得到你的数组
$.when.apply($,promises).then(函数(){
//获取参数--“then”回调返回的值:
var enableSubmitButton=[].slice.call(参数);
console.log('result',enableSubmitButton);
});
});

点击我

只是一个次要问题,您能否解释一下为什么您在URL中使用
$(“#fNewAccount input.checkAvailability”)
发出请求?它不以任何方式依赖于您正在迭代的
输入
元素,因此URL在
每个
循环的每次迭代中都是相同的URL。这不应该是
$(this)
或类似的东西吗?请注意,在登录之前,
onreadystatechange
不会在此代码中运行。这是一个事件处理程序,因此它第一次可以运行是在整个事件处理程序(keyup)完成之后。JavaScript一次处理一个事件,没有重叠。考虑将整个XHR部分用于测试,即<代码> false <代码>来自另一个地方。整个MunBo巨型计算机是完全没有意义的(加上代码片段对我不起作用),原始内容已经被记录:“(4)[真,真,真,真]部分永远不会改变,只是OP未能发现“长度:5”。在日志的活动部分。该代码段对我有效。
控制台日志
输出具有误导性,因为这也是异步发生的。确实存在异步性问题。在
console.log时(启用SubmitButton)数组不包含在Ajax响应中添加的值。如果将其记录为
console.log(enableSubmitButton.join()),则这一点很明显。这不仅仅是一个
length
问题。好吧,这个代码段在最近的桌面浏览器(Chrome、Firefox)中运行良好,它在iOS Safari上对我不起作用。Console.log会同步工作,它会在调用时字符串化并打印对象的状态。事后检查对象的可能性与控制台本身无关,而是与调试器有关。这两种输出分别是一致的,即使在问题中也是如此。第一个输出表示数组有4个元素,并列出4个true-s。然后OP“再次”检查对象,并打印5个元素,然后打印“长度:5”。就在那里,在OP的问题中,他得出结论,当数组中有5个元素时,存在一种状态,但长度报告为4。不,没有。
console.log
不同步工作(尽管没有标准),并且不会将结果字符串化为普通字符串。而是传递一个引用,该引用在调试器中作为可折叠接口显示,其中嵌套部分是异步检索的。例如,参见和。在这种情况下,数组不可能有4个元素
console.log(JSON.stringify(enableSubmitButton));