Почему onsubmit не работает и если я вызываю функцию в консоли, она запускается?

У меня есть этот html:

<!doctype html>
<html class = "no-js" lang = "">

<head>
<meta charset = "utf-8">

<script src = "js/filename.js"></script>
</head>

<body>
    <form id = "dp5" action = ""  method = "POST" onsubmit = "Write_Text()">
      <h3>5- Do you know any browsers?</h3>
      <input id = "No" type = "radio" name = "dp5N" value = "false">
      <label for = "No">No </label>

      <input id = "yes" type = "radio" name = "dp5S" value = "true">
      <label for = "yes">Yes</label>

      <label for = "text">6 - Which?</label>
      <input id = "text" type = "text" name = "dp5text" value = "">
    </form>

    <div id = "next">
      <input id = "sub" type = "submit" name = "submit" value = "Next">
    </div>
</body>
</html>

И это javascript "имя файла":

function Write_Text() {
let x = document.forms["dp5"]["No"].value;

if (x === "false") {
    document.getElementById("text").disabled=true;
    document.getElementById("text").value = "";
} else {
    document.getElementById("text").disabled =false;
}

}

Текстовое поле должно начинаться с отключения и быть доступным только тогда, когда пользователь выберет вариант «да». Функция вообще не работает.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
52
4

Ответы 4

Как только вы исправите проблема, на которую указал Sreekanth MK, у вас появится новая проблема:

Ничто не препятствует действию по умолчанию отправки формы, которое заключается в отправке данных формы на URL-адрес action (в вашем случае это будет собственный URL-адрес страницы) и заменять текущей страницы с тем, что возвращает этот URL-адрес.

Вам нужно предотвратить действие по умолчанию. Минимальный способ:

<form id = "dp5" action = ""  method = "POST" onsubmit = "Write_Text(); return false">

или

<form id = "dp5" action = ""  method = "POST" onsubmit = "event.preventDefault(); Write_Text();">

... но я рекомендую вместо этого использовать современную обработку событий, удалив атрибут onsubmit и изменив JavaScript следующим образом:

function Write_Text(event) {
    event.preventDefault();
    let x = document.forms["dp5"]["No"].value;

    if (x === "false") {
        document.getElementById("text").disabled=true;
        document.getElementById("text").value = "";
    } else {
        document.getElementById("text").disabled =false;
    }
}
document.getElementById("dp5").addEventListener("submit", Write_Text);

Обратите внимание, что вам нужно переместить тег script. Включение script в head - это антипаттерн. Скрипты идут в конце страницы, прямо перед закрывающим тегом </body>.


Боковое примечание: вы можете делать все, что захотите, в своем собственном коде, но FWIW, соглашение подавляющий в JavaScript заключается в том, что имена функций начинаются с буквы нижнего регистра и используют camelCase, кроме конструкторов, которые вместо этого использовали изначально ограниченный CamelCase. Так что writeText, а не Write_Text.

Я выложу, ошибка

Adath Skyderson 07.11.2018 11:04

@AdathSkyderson - последний работает нормально, если ваш script находится в нужном месте (в конце body, непосредственно перед закрывающим тегом </body>).

T.J. Crowder 07.11.2018 11:05

У меня есть файл .js

Adath Skyderson 07.11.2018 11:07

@AdathSkyderson - неважно, это отдельный файл или встроенный скрипт. Важно расположение тега script относительно элементов, с которыми он работает. Пожалуйста, посмотрите конец ответа, а также страницу, на которую он ссылается.

T.J. Crowder 07.11.2018 11:13

@AdathSkyderson - Да. Я сказал это в ответе и связал с чем-то, что тоже вам об этом говорит.

T.J. Crowder 07.11.2018 11:34

Ваша кнопка отправки находится за пределами формы. Поместите его внутрь формы, и он будет работать.

<form id = "dp5" action = ""  method = "POST" onsubmit = "Write_Text(); return false">
  <h3>5- Do you know any browsers?</h3>
  <input id = "No" type = "radio" name = "dp5N" value = "false">
  <label for = "No">No </label>

  <input id = "yes" type = "radio" name = "dp5S" value = "true">
  <label for = "yes">Yes</label>

  <label for = "text">6 - Which?</label>
  <input id = "text" type = "text" name = "dp5text" value = "">

  <div id = "next">
    <input id = "sub" type = "submit" name = "submit" value = "Next">
  </div>
</form>

Что ж, это не сработает так сильно, что выйдет из строя по-другому. :-) См. Мой (сейчас) ответ вики сообщества о том, почему и что с этим делать: stackoverflow.com/a/53187046/157247

T.J. Crowder 07.11.2018 10:56

Ах .. забыл о предотвращении поведения формы по умолчанию. Спасибо, что указали.

Sreekanth MK 07.11.2018 11:00

вам нужно использовать здесь объект события, чтобы предотвратить Default, потому что страница обновляется при отправке, а затем отправляет форму в вашей функции Write_Text ()

function Write_Text(event) {
//This will prevent Default Behaviour
event.preventDefault();

let x = document.forms["dp5"]["No"].value;

if (x === "false") {
    document.getElementById("text").disabled=true;
    document.getElementById("text").value = "";
} else {
    document.getElementById("text").disabled =false;
}

// then submit using JS
}

Прежде всего, проблему отправки можно легко решить, переместив кнопку в форме и предотвратив поведение по умолчанию.

Что касается проблемы отправки, я думаю, что ваш код можно было бы значительно улучшить, решив также следующую проблему: вы можете выбрать оба радио входа: заключить их в набор полей и использовать для них одно и то же имя; Почему? получить выбранный ответ проще, и его можно расширить до нескольких входов.

Ниже у вас есть рабочий пример того, что я сказал.

Ваше здоровье!

function Write_Text(event) {
  event.preventDefault();
  
  let x = document.querySelector('input[name = "ans"]:checked').value
  console.info(x);
  
  if (x === "false") {
      document.getElementById("text").disabled=true;
    document.getElementById("text").value = "";
  } else {
     document.getElementById("text").disabled =false;
  }
}
<!doctype html>
<html class = "no-js" lang = "">

<head>
<meta charset = "utf-8">
</head>

<body>
    <h3>5- Do you know any browsers?</h3>
    <form id = "dp5" action = ""  method = "POST" onsubmit = "return Write_Text(event)">
      <fieldset>
        <input id = "No" type = "radio" name = "ans" value = "false">
        <label for = "No">No </label>

        <input id = "yes" type = "radio" name = "ans" value = "true">
        <label for = "yes">Yes</label>
      </fieldset>
      
      <label for = "text">6 - Which?</label>
      <input id = "text" type = "text" name = "dp5text" disabled value = "">
      
      <div id = "next">
        <input id = "sub" type = "submit" name = "submit" value = "Next">
      </div>
    </form>
</body>
</html>

Другие вопросы по теме