我知道它被多次询问但我似乎无法找出closure
的东西,至少我似乎无法将它应用到我自己的代码中。
这里我基于.choice
类创建了一个for循环。
<label class="choice" data-id="1"><input type="radio" name="group1" value="een">een</label>
<label class="choice" data-id="2"><input type="radio" name="group1" value="twee">twee</label>
<label class="choice" data-id="3"><input type="radio" name="group1" value="drie">drie</label>
<label class="choice" data-id="4"><input type="radio" name="group1" value="vier">vier</label>
$(document).ready(function(){
for (var i = $('.choice').length - 1; i >= 0; i--) {
var element = $('.choice')[i];
var choiceID = $(element).data('id');
var value = $(element).find('input').val();
$.ajax({
method: "POST",
url: 'api.php',
data: {
choiceID: choiceID,
value: value
},
success: function(res) {
if(value == JSON.parse(res).value) {
console.log(JSON.parse(res).value);
console.log(JSON.parse(res).count);
if(JSON.parse(res).count > 0){
$(element).addClass('full');
}
} else {
// console.log("FAILED " + JSON.parse(res).value);
// console.log("FAILED " + JSON.parse(res).count);
}
}
});
}
});
然后在api.php
文件中,我调用多个查询
$choiceID = $_POST["choiceID"];
$value = $_POST["value"];
$kolom = "choice_" . $choiceID;
$counter = 0;
$array = [];
$query = "SELECT choice_1 FROM resultaten WHERE choice_1 = '".$value."'";
$getCount = $db->query($query);
$getCount->execute(array("value"=>$value));
$results = $getCount->fetchAll(PDO::FETCH_ASSOC);
more queries and for loops
ajax成功回调
echo json_encode(array("value" => $value, "count"=> $counter, "ID" => $choiceID));
适用于choice
data-id
个1
的{{1}}课程,并且适用课程full
但是当我在console.log中value
和count
时,它会返回een 1
并在控制台中
VM1982:1 Uncaught SyntaxError: Unexpected token < in JSON at position 1
可能与data-id
的{{1}}等有关(我认为它应该都是1/2/3/4
)但是当我把它们全部放到one
时只适用于第一个。与我使用1
作为1/2/3/4
的情况相同。同样有点奇怪的是它有一些结果返回data-id
它表示它的<br />
<b>Notice</b>: Undefined index: choice_2 in <b>C:\xampp\htdocs\form\api.php</b> on line <b>47</b><br />
{"value":"use your apple","count":2,"ID":"2"}
为2,而在ajax中它表示当count
=大于0时它会给出类{{} 1}}但是它会给count
而不是
我认为这会导致主要问题
当我在full
函数内undefined index: choice_2
console.log
时,它会返回value
succes
类的een
值。
当我first
choice
变量下面的console.log
时,它会返回所有变量。
答案 0 :(得分:0)
我相信你必须改变一些事情:
$choiceID = $_POST["choiceID"];
$value = $_POST["value"];
$kolom = "choice_" . $choiceID;
$counter = 0;
$array = [];
$query = "SELECT choice_1 FROM resultaten WHERE $kolom = '".$value."'";
$getCount = $db->query($query);
$getCount->execute(array("value"=>$value));
$results = $getCount->fetchAll(PDO::FETCH_ASSOC);
if (count($results ) {
echo json_encode($results );
} else {
echo 0;
}
现在在javascript中,你应该解析非零响应。
答案 1 :(得分:0)
问题是element
,choiceID
和value
都在同步更改。当AJAX响应返回时,值与每个请求开始时的值不同。
这可能是您编写的最简单的更改
for (var i = $('.choice').length - 1; i >= 0; i--) {
(function() {
var element = $('.choice')[i];
var choiceID = $(element).data('id');
var value = $(element).find('input').val();
// rest of your loop code here...
})();
}
现在,每次循环运行时,element
,choiceID
和value
都会将其值正确绑定到闭包。
你没有使用i
迭代器,否则通常会看到传递给立即调用的函数表达式(IIFE)。
for (var i = $('.choice').length - 1; i >= 0; i--) {
(function(i) {
// your loop code here
})(i);
}
无论如何,这只是一般代码设计不良的症状。如果您使用函数来描述代码的单独操作(而不是for
循环中的一个巨型blob),那么您将永远不会遇到此问题。