问题:
我创建了一个搜索表单,要求用户在输入表单中插入字符串。该字符串是城市的名称,如果它与我包含在JSON文件中的50个城市之一匹配,则将调用某些函数。 我们可能有三个条件:
1)输入表单留空------>出现错误日志。
2)输入形式不为空,并且该字符串与JSON文件中的50个字符串之一匹配------>显示一个表。
3)输入形式不为空,但字符串与JSON文件中的50个字符串都不匹配------>显示模式窗口
我的问题是如何以及在哪里编写命令:
$(‘#Modal#).show()
换句话说,只要插入的城市与JSON文件中包含的任何内容都不匹配,我应该如何以及在何处显示模式窗口?
我有一个cycle for
:这里正在检查JSON文件中字符串的值;我不会在此处输入命令,否则模式将被调用49次:由于我有50个城市,因此其中一个与输入表单中插入的字符串匹配,而其他49个则不匹配。
我想我应该使用for loop
周期之外的函数创建一个新变量,并设置条件:“该字符串与JSON文件中的一个字符串匹配,只有一个字符串匹配”;那么条件可能在for循环内为true(然后显示表格),而在for循环外为false(即“如果找到的城市数为0”,然后显示模式窗口)。
到目前为止,我编写的代码如下:
function validateCitta() {
let text = $('#inlineFormInputCitta').val();
if (text === "") {
$("#errorLog").show();
} else {
$("#errorLog").hide();
$.ajax({
url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCity").val()) + "&format=geocodejson",
dataType: "json",
success: function(data) {
for (let i = 0; i < data.features.length; i++) {
let typeCity = data.features[i].properties.geocoding.type;
if (typeCity === "city") {
let nameCity = data.features[i].properties.geocoding.name;
for (let i = 0; i < json.tappe.length; i++) {
let tappa = json.tappe[i];
let city = json.tappe[i].city;
if (city === nameCity) {
console.log("JSON file has been activated");
$("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
$("#tabella").show();
};
};
}
}
}
})
}
};
如何设置新变量来满足上述第三个3)条件? 或者,如果满足条件(3),您还有其他建议来显示模态窗口吗?
我按如下所示编辑了代码段:
function validateCitta() {
let text = $('#inlineFormInputCitta').val();
var check = false;
if (text === "") {
$("#errorLog").show();
} else {
$("#errorLog").hide();
$.ajax({
url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCitta").val()) + "&format=geocodejson",
dataType: "json",
success: function (data) {
for (let i = 0; i < data.features.length; i++) {
let typeCity = data.features[i].properties.geocoding.type;
if (typeCity === "city") {
let nameCity = data.features[i].properties.geocoding.name;
for (let i = 0; i < json.tappe.length; i++) {
let tappa = json.tappe[i];
let city = json.tappe[i].city;
if (city === nameCity) {
var check = true;
$("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
$("#tabella").show();
}
;
}
;
}
}
}
})
if (check) {
$('#myModal').show();
}
}
};
但是它不起作用。 另一方面,如果我写
if (!check) {
$('#myModal').show();
满足条件2)时也会显示模态...
我编写了以下代码。 它可以工作,但是我不完全了解布尔标志check
的作用以及它的值在for循环内外的变化方式:
function validateCitta() {
let text = $('#inlineFormInputCitta').val();
if (text === "") {
$("#errorLog").show();
} //condition 1: no strings, no problem
else {
$.ajax({
url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCitta").val()) + "&format=geocodejson",
dataType: "json",
success: function (data) {
var check = false; //I set the flag variable outside the cycle
for (let i = 0; i < data.features.length; i++) {
let typeCity = data.features[i].properties.geocoding.type;
if (typeCity === "city") {
let nameCity = data.features[i].properties.geocoding.name;
for (let i = 0; i < json.tappe.length; i++) {
let tappa = json.tappe[i];
let city = json.tappe[i].city;
if (city === nameCity) {
check = true;
//conditon 3 is fullfilled: strings matches
$("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
$("#tabella").show();
}
;
}
;
}
}
if (!check) { //does !check means that the value of 'check' is opposite to the one set at the beginning?
$('#myModal').show(); }
}
})
}
};
var check = false
是否意味着一切都写在它之后(在本例中为for循环)为假?
!check
意味着var check = false
是不正确的,即check === true
吗?
如果是这样,为什么我应该在for循环中指定check = true
? check = true
是否与!check
相同?换句话说,check
告诉我什么?
答案 0 :(得分:1)
您可以使用一个标志来告诉您是否找到了一个城市。
例如:
if (typeCity === "city") {
let nameCity = data.features[i].properties.geocoding.name;
let IsCityFound = false; // <------------------------------- not found by default
for (let i = 0; i < json.tappe.length; i++) {
let tappa = json.tappe[i];
let city = json.tappe[i].city;
if (city === nameCity) {
IsCityFound = true; // <---------------------------- Now found
console.log("JSON file has been activated");
$("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
$("#tabella").show();
}
}
if (!IsCityFound) { // <------------------------------------ Was it NOT found ?
$('#Modal').show();
}
}
答案 1 :(得分:1)
想法是使用布尔变量作为标志,然后在循环外部检查值是否更改。
function validateCitta() {
let text = $('#inlineFormInputCitta').val();
let check = false;
if (text === "") {
$("#errorLog").show();
} else {
$("#errorLog").hide();
$.ajax({
url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCity").val()) + "&format=geocodejson",
dataType: "json",
success: function(data) {
for (let i = 0; i < data.features.length; i++) {
let typeCity = data.features[i].properties.geocoding.type;
if (typeCity === "city") {
let nameCity = data.features[i].properties.geocoding.name;
for (let i = 0; i < json.tappe.length; i++) {
let tappa = json.tappe[i];
let city = json.tappe[i].city;
if (city === nameCity) {
check = true;
};
};
}
}
}
})
}
//check if you need to display the modal
if (check)
{
console.log("JSON file has been activated");
$("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
$("#tabella").show();
}
};