#javascript
#javascript
Вопрос:
Я пытаюсь получить как минимум три ответа из 10 текстовых полей. И появится предупреждение, если общее количество ответов меньше трех. Я также пытаюсь исключить ответы, которые являются только пробелами, поэтому я использую return x.replace(/^s |s $/gm,'')
, чтобы избавиться от пробелов до и после строки.
Что мне нужно сделать, это сначала установить переменную «count» равной 0. Далее, чтобы определить, есть ли хотя бы один символ в определенном текстовом поле, и если да, добавьте 1 к «count». Затем сделайте это для всех 10 текстовых полей. После этого проверьте, больше ли «count», чем 2; если да, перейдите на следующую страницу; в противном случае появится предупреждение.
Но это не сработало.
Другой вопрос, как я могу избежать повторения процесса для всех 10 текстовых полей?
var count=0
function myTrim(x) {
return x.replace(/^s |s $/gm,'');
}
var x1 = document.getElementById("textbox1").value;
var t1 = myTrim("x1");
var n1 = t1.length;
if (n1<1){
count=count 0
} else{
count=count 1
}
var x2 = document.getElementById("textbox2").value;
var t2 = myTrim("x2");
var n2 = t2.length;
if (n2<1){
count=count 0
} else{
count=count 1
}
var x3 = document.getElementById("textbox3").value;
var t3 = myTrim("x3");
var n3 = t3.length;
if (n3<1){
count=count 0
} else{
count=count 1
}
var x4 = document.getElementById("textbox4").value;
var t4 = myTrim("x4");
var n4 = t4.length;
if (n4<1){
count=count 0
} else{
count=count 1
}
var x5 = document.getElementById("textbox5").value;
var t5 = myTrim("x5");
var n5 = t5.length;
if (n5<1){
count=count 0
} else{
count=count 1
}
var x6 = document.getElementById("textbox6").value;
var t6 = myTrim("x6");
var n6 = t6.length;
if (n6<1){
count=count 0
} else{
count=count 1
}
var x7 = document.getElementById("textbox7").value;
var t7 = myTrim("x7");
var n7 = t7.length;
if (n7<1){
count=count 0
} else{
count=count 1
}
var x8 = document.getElementById("textbox8").value;
var t8 = myTrim("x8");
var n8 = t8.length;
if (n8<1){
count=count 0
} else{
count=count 1
}
var x9 = document.getElementById("textbox9").value;
var t9 = myTrim("x9");
var n9 = t9.length;
if (n9<1){
count=count 0
} else{
count=count 1
}
var x10 = document.getElementById("textbox10").value;
var t10 = myTrim("x10");
var n10 = t10.length;
if (n10<1){
count=count 0
} else{
count=count 1
}
function checknumber() {
if (count < 3){
alert("You must enter at least 3 responses before you can continue.");
} else {
location.href="https://www.kindpng.com/imgv/hxbmxi_symbol-thumbs-up-clip-art-vector-free-clipart/" ; // if selection made, go to next page
}
}```
Комментарии:
1. Небольшая вещь, но
.trim()
( docs ) избавляет от пробелов в начале / конце строки, без необходимости писать собственное регулярное выражение.2.
count=count 0
=> но почему?3. Серьезно, это должен быть цикл. Конкретная проблема этого кода заключается в том, что
myTrim("x1")
на самом деле должно бытьmyTrim(x1)
(без кавычек).4. при вызове
myTrim("x2")
вы передаете не значение x2, а строковую константу «x2»5. @DBS Спасибо, что указали на проблему. Наверное, я думал о том, что для некоторых браузеров они не поддерживают метод trim().
Ответ №1:
Это требует циклов:
let count = 0;
for (let i = 1; i <= 10; i ) {
const textBoxValue = document.getElementById('textbox' i).value;
if (textBoxValue.trim() !== '') count ;
}
В имеющемся у вас коде не только одни и те же строки повторяются 10 раз (единственная значимая вещь, которая там меняется, — это идентификатор текстового поля), но и их значения фактически не проверяются: с myTrim('x2')
параметром, который вы передаете внутри своей функции, это буквальная строка ‘x2’, а не значение переменной x2.
В качестве примечания всегда выражайте свое намерение напрямую; если проверка выполняется по пустой строке, запишите эту проверку как есть. И да, писать свою собственную trim
реализацию на самом деле не обязательно.
На самом деле, вам не нужно проверять все значения текстового поля:
function formHasAtLeast(requiredMinimum) {
let count = 0;
for (let i = 1; i <= 10; i ) {
const textBoxValue = document.getElementById('textbox' i).value;
if (textBoxValue.trim() !== '') count ;
// this line will stop that iteration immediately,
// as there's no need to check for 4th, 5th etc. textbox
if (count === requiredMinimum) return true;
}
return false;
}
function checkForm() {
const minAnswers = 3;
if (formHasAtLeast(minAnswers)) {
location.href = "YOUR URL";
}
else {
alert(`You have to fill at least ${minAnswers} responses`);
}
}
Комментарии:
1. Возможно ли включить метод «post» в функцию «checkForm», потому что я также хочу сохранить ответы на сервере, и кажется, что я могу сделать это только с помощью метода post.
2. Не очень хорошая идея иметь слишком много обязанностей в одной функции. Что вы можете сделать, так это вызвать эту другую функцию там — и продолжить перенаправление, например, после его завершения.
Ответ №2:
Вы можете использовать селектор классов, Document.getElementsByClassName("text-box")
, сначала применить общий класс ко всем таким текстовым полям. Затем повторите цикл над результатами.
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName
Ответ №3:
Вы можете получить доступ к входным данным по имени класса и работать с результатом в виде массива:
function calculate() {
const elements = document.getElementsByClassName('value-container');
const result = Array.from(elements).map(e => e.value).filter(v => !!v amp;amp; !!v.toString().trim()).length;
document.getElementById('result').innerHTML = `Count of fields with value: ${result}`;
}
<input type="text" class="value-container" /><br/>
<input type="text" class="value-container" /><br/>
<input type="text" class="value-container" /><br/>
<input type="text" class="value-container" /><br/>
<button type="button" onclick="calculate()">Get Result</button>
<div id="result">
</div>
https://developer.mozilla.org/ru/docs/Web/API/Document/getElementsByClassName
https://developer.mozilla.org/uk/docs/Web/JavaScript/Reference/Global_Objects/Array