Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Отмена отправки формы. Фигня какаято :( (https://javascript.ru/forum/dom-window/25066-otmena-otpravki-formy-fignya-kakayato.html)

lolka84 24.01.2012 12:50

Отмена отправки формы. Фигня какаято :(
 
Привет. Есть следующее:
<form onSubmit="return func('1');">
...
</form>


function func(x) {
  switch(x) {

    .....

    case "1":
      ...
      if(...) { return false; }
      break;

    .....

  }
}


Непойму, почему при срабатывании "if(...)" форма все равно отправляется ?:(

melky 24.01.2012 13:16

используйте другие способы отмены действия по-умолчанию, ваш способ устарел.

lolka84 24.01.2012 13:20

Какие методы используете Вы ?:)

melky 24.01.2012 16:28

form.attachEvent \ form.addEventListener.

но можно и ограничиться form.onclick

lolka84 24.01.2012 18:05

Отлично, обязательно почитаю о новых прогрессивных методах, но все-таки жду помощи по моему примеру, на самом деле, что не так то с ним ?

FINoM 24.01.2012 18:23

Цитата:

Сообщение от melky
ваш способ устарел.

Эм? Я понимаю, что человек не прав с пиханием кода в атрибут, но чем такой подход устарел в общем?
form.addEventListener('submit', function(){return false;});

NoResponse 24.01.2012 22:00

кажись поэтому
<form onsubmit="return func('1');">

FINoM 24.01.2012 22:43

Цитата:

Сообщение от NoResponse
кажись поэтому

HTML не регистрозависимый.

melky 25.01.2012 00:35

http://jsfiddle.net/WUa4Y/

сами протестите. работает. выкладывайте полный код на jsfiddle.

lolka84 25.01.2012 08:47

Блин, неоднократно взорвал себе мозг, нечего не понимаю, офигеть я чайник :(

В функции запускается ajax запрос, условие if() - это выдергивание нужного ответа сервера, т.е.
function func(x) {

  switch(x) {

    .....

    case "1":
      ...

      XMLHttp.onreadystatechange = function() {
        if (XMLHttp.readyState == 4) {
          if (XMLHttp.status == 200) {
            if (XMLHttp.responseText == "FAIL") { 
              alert("Ошибка"); return false;  
            }
          }
        }
      }

      break;

    .....

  }

}

Alert вылазит, но форма все равно отправляется, как будто return false; вовсе нет.

Попробывал так:
function func(x) {

  switch(x) {

    .....

    case "1":
      ...

      XMLHttp.onreadystatechange = function() {
        if (XMLHttp.readyState == 4) {
          if (XMLHttp.status == 200) {
            if (XMLHttp.responseText == "FAIL") { 
              alert("Ошибка"); x = false;  
            }
            else { x = true; }
          }
        }
      }

      break;

    .....

  }
  return x;
}

Но за пределами XMLHttp.onreadystatechange = function() переменная x неопределена :(

Как заставить работать эту конструкцию ? :(

melky 25.01.2012 12:49

Цитата:

Сообщение от lolka84 (Сообщение 152708)
function func(x) {

  switch(x) {

    .....

    case "1":
      ...

      XMLHttp.onreadystatechange = function() {
        if (XMLHttp.readyState == 4) {
          if (XMLHttp.status == 200) {
            if (XMLHttp.responseText == "FAIL") { 
              alert("Ошибка"); return false;  
            }
          }
        }
      }

      break;

    .....

  }

}

функция, в которой return false, исполняется после совершения запроса. вам нужно, чтобы она возвращала false до запроса. вы плохо знаете ajax. я бы кинул пару ссылок на мануалы, но не помню ни одного :(

Цитата:

Сообщение от lolka84 (Сообщение 152708)
function func(x) {

  switch(x) {

    .....

    case "1":
      ...

      XMLHttp.onreadystatechange = function() {
        if (XMLHttp.readyState == 4) {
          if (XMLHttp.status == 200) {
            if (XMLHttp.responseText == "FAIL") { 
              alert("Ошибка"); x = false;  
            }
            else { x = true; }
          }
        }
      }

      break;

    .....

  }
  return x;
}

Она же асинхронная!

lolka84 25.01.2012 13:48

Цитата:

Сообщение от melky (Сообщение 152751)
вы плохо знаете ajax.

Обратного и не утверждаю :) Ламер пока, да.
Как заставить конструкцию то работать все-таки ?

melky 25.01.2012 15:15

XMLHttp.onreadystatechange = function() {
        if (XMLHttp.readyState == 4) {
          if (XMLHttp.status == 200) {
            if (XMLHttp.responseText == "FAIL") { 
              alert("Ошибка");
            }
          }
        }
      }
      return false;

mnestrahno 03.01.2014 10:40

onsubmit="return false" :dance:

kostyanet 09.01.2014 02:33

Цитата:

Сообщение от lolka84
Привет. Есть следующее:
<form onSubmit="return func('1');">

По-моему возврат фолсов давным давно не работает. Ну может в старых браузерах еще. В которых наверно не работают методы

e.preventDefault();

и

e.stopPropagation().

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

Вам надо на форму повесить прерывание на submit и задать вектор на e.preventDefault(); с проверкой условия, которое и снимет ваш асинхронный ахакс.

Например вот так

addEvent(form, "submit", function(e) {
		if(cancel_default_submit && e.preventDefault)
                     e.preventDefault();
		return cancel_default_submit;
	});

Vlasenko Fedor 09.01.2014 02:57

lolka84,
вам при любых значениях нужно возвращать return false иначе форма будет отправлятся
onsubmit="func('a'); return false;"


Часовой пояс GMT +3, время: 06:02.