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

  • Автор темы jadovitaja
  • 36
  • Обновлено
  • 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

Тем
1

Постов
2

Баллов
12
  • 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

Тем
0

Постов
2

Баллов
2
  • 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

Тем
2

Постов
4

Баллов
24
  • 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

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966

Интересно