проблема:
Я создал поисковую форму, где пользователю предлагается вставить строку в форму ввода.Строка - это название города, и, если оно совпадает с одним из 50 городов, которые я включил в файл JSON, вызывается некоторая функция.У нас может быть три условия:
1) Форма ввода оставлена пустой ------> появляется журнал ошибок.
2) Форма ввода не пуста, и строка соответствуетодна из 50 строк в файле JSON ------> отображается таблица.
3) Форма ввода не пуста, но строка не соответствует ни одной из 50 строк в JSONфайл ------> отображается модальное окно
Моя проблема в том, как и где написать команду:
$(‘#Modal#).show()
Другими словами, как и где я должен показатьмодальное окно всякий раз, когда вставленный город не совпадает ни с одним из включенных в мой файл JSON?
У меня есть cycle for
: здесь проверяются значения строк в файле JSON;Я бы не стал вводить команду туда, иначе модал будет вызываться 49 раз: так как у меня 50 городов, один из них соответствует строке, вставленной в форму ввода, а другой 49 - нет.
Полагаю, мне следует создать новую переменную с функцией вне цикла for loop
, установив условие: «строка соответствует одной и только одной из строк в файле JSON»;тогда условие может быть истинным внутри цикла for (а затем я отображаю таблицу), тогда как оно ложно вне цикла for (т. е. «если число найденных городов равно 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
?Если так, почему я должен указывать check = true
внутри цикла for?Разве check = true
не совпадает с !check
?Другими словами, что check
говорит мне?