Ложное значение передается в вызове ajax

  • Автор темы Jadovitaja
  • Обновлено
  • 13, May 2024
  • #1
У меня есть вызов Ajax, который проходит через файл json со следующим кодом:

Он вызывает функцию в теге формы следующим образом:

 function myFunction() {
var x;
x = document.getElementById('numb').value;
alert(x);//this prints 0 every time
if ( isNaN(x) || (x < 0) || (x > 10)) {
alert("Quantity must be a positive number less than 10.");
event.preventDefault();
return false;
} else {
alert("Input OK");
}
}


Код (javascript): Когда я пытаюсь проверить количество, чтобы убедиться, что оно положительное число меньше десяти, я использую следующий javascript:

 <form method='POST' action='cart.php' id='cartForm' onsubmit='return myFunction();'>


Код (javascript): Проблема в том, что он не получает значение $_POST текстового поля, он получает нулевое значение, как и то, как текстовое поле инициализируется каждый раз.

Jadovitaja


Рег
01 Jan, 2011

Тем
68

Постов
189

Баллов
569
  • 18, May 2024
  • #2
Мой друг-программист отметил, что он проходит через цикл идентификаторов, и идентификатор одинаков для каждого ввода текста, поэтому я изменил его на:

и я изменил свою функцию на:

 function myFunction() {
 var x, i, y;
 for (i = 1; i < 7; i++) {
 y = 'numb_' + i;
 x = document.getElementById(y).value;
 //alert(y);

 if ( isNaN(x) || (x < 0) || (x > 10)) {
 alert("Quantity must be a positive number less than 10.");
 event.preventDefault();
 return false;
 } else {
 alert("Input OK");
 }
}
}


Код (Javascript): предупреждение (y); каждый раз выводит numb_1, поэтому он не зацикливается должным образом.

Как я могу улучшить свой цикл?
 

Musika


Рег
25 Nov, 2013

Тем
99

Постов
204

Баллов
719
  • 01, Jun 2024
  • #3
С помощью участника другого форума мне удалось найти решение. Это выглядит так:
 function myFunction() {
var x, y;
var elements = document.querySelectorAll('[id^="numb_"]');

for (var i = 1; i < elements.length; i++) {

 y = elements[I].id;

 x = document.getElementById(y).value;

 if ( isNaN(x) || (x < 1) || (x > 10)) {
 alert("Quantity must be a positive number less than 10.");
 event.preventDefault();
 return false;
 } else {
 return true;
}
}
}
Код (Javascript):
 

Gloomhein


Рег
17 Jul, 2015

Тем
63

Постов
181

Баллов
516
  • 13, Jun 2024
  • #4
Код вашего «решения» не имеет никакого смысла, поскольку он НИКОГДА не будет зацикливаться.

Поскольку у вас есть возврат else, он останавливается на этом месте, поэтому, если имеется более одного элемента, он просто останавливается, даже не успев зайти так далеко.

ПРАВИЛЬНОЕ форматирование показывает следующее:

 
document.getElementById('cartForm').addEventListener('submit', function(e) {
var elements = document.querySelectorAll('[id^="numb_"]');
for (var i = 1, id; id = elements[i]; i++) {
var value = d.getElementById(id).value;
if ( isNaN(value) || (value < 1) || (value > 10)) {
alert("Quantity must be a positive number less than 10.");
event.preventDefault(); // is 'event' global?
return;
}
}
}, false);


Код (разметка): Видите проблему? Это невозможно зациклить.

В коде также есть проблема с пустыми переменными, и сам цикл можно было бы сделать более жестким, а отсутствие передачи события означает, что вы используете устаревший атрибут onsubmit вместо того, чтобы перехватывать элемент, как добрый маленький дурачок.

Я думаю, это то, что вы хотели сделать: Сначала давайте исправим ваш тег FORM.
 <form method="POST" action="cart.php" id="cartForm">
Код (разметка): Примечание: использование одинарных кавычек в разметке обычно указывает на то, что ваш серверный код представляет собой дымящуюся кучу.

затем для сценария:

 function myFunction() { var x, y; var elements = document.querySelectorAll('[id^="numb_"]'); for (var i = 1; i < elements.length; i++) { y = elements[I].id; x = document.getElementById(y).value; if ( isNaN(x) || (x < 1) || (x > 10)) { alert("Quantity must be a positive number less than 10."); event.preventDefault(); return false; // exits function } else { return true; // exits function } } }


Код (разметка): ХОТЯ мне придется увидеть разметку, поскольку я подозреваю, что будет более эффективный/быстрый способ сделать это, чем querySelectorAll, например, обход DOM.

Любая из функций поиска --querySelector, querySelectorAll, getElementsByХХХ и т. д. и т. п. — они чрезвычайно медленны, и их следует/должна обходить, когда это возможно. НЕ то, что все это больше является переворачиванием работы JavaScript, если только вам действительно не нужна поддержка IE9/более ранних версий.

поскольку у нас есть: Чтобы позаботиться о том, что вы пытаетесь сделать здесь.

Черт возьми, вы даже можете установить шаг = 1, чтобы заставить его принимать целое число.
 

Darina4ess


Рег
01 Jan, 2011

Тем
71

Постов
179

Баллов
554
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно