Javascript - можете ли вы приостановить отправку формы и затем перезапустить - PullRequest
3 голосов
/ 07 сентября 2011

Без использования каких-либо библиотек JS возможно ли приостановить отправку формы, запустить какой-то код и затем перезапустить его?

Причина, по которой я спрашиваю, заключается в том, что у меня в настоящее время есть форма, которая при отправке выполняет код, который отправляетзапрос к моему поставщику аналитики.Прекрасно работает в chrome / IE, но в FF и Safari эта аналитика выпадает на 60%.

Такое ощущение, что отправка выполняется до выполнения сценариев, поэтому мы пытаемся приостановитьотправить событие.

Заинтересованы услышать любые мысли или идеи

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 07 сентября 2011

Вы можете использовать событие submit, чтобы отменить отправку формы, выполнить анализ с помощью ajax, а затем отправить форму программным способом, используя метод submit для элемента form.

Например,( живая копия ):

HTML:

<form id="theForm" action="#" method="GET">
  <label>Field: <input type="text" name="theField"></label>
  <br><input type="submit" value="Submit">
</form>

JavaScript:

window.onload = function() {
  var form, counter;

  form = document.getElementById("theForm");
  form.onsubmit = function() {
    if (typeof counter === "undefined") {
      display("Starting count down (" + counter + ")");
      counter = 3;
      setTimeout(delayedSubmit, 1000);
    }
    display("Cancelling form submit");
    return false;
  };

  function delayedSubmit() {
    if (typeof counter === "number") {
      --counter;
      if (counter > 0) {
        display("Continuing count down (" + counter + ")");
        setTimeout(delayedSubmit, 1000);
      }
      else {
        display("Count down complete, submitting form");
        counter = undefined;
        form.submit();
      }
    }
  }

  function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = msg;
    document.body.appendChild(p);
  }
};

Там я использовал таймер обратного отсчета, а неоперация ajax, но принцип тот же.


Не по теме : я использовал старый стиль DOM0 для установки там обработчика событий (form.onsubmit = ...),Я не рекомендую это, но это держит пример простым.Настройка обработчиков событий является одним из мест, где библиотека, такая как jQuery , Прототип , YUI , Закрытие или любаяиз нескольких других может сгладить различия между браузерами (и предоставить дополнительную функциональность) для вас, стоит подумать об их использовании.

2 голосов
/ 07 сентября 2011

Просто поместите кнопку вместо кнопки отправки, которая запускает скрипт аналитики как функцию, затем отправьте форму с

document.forms["myform"].submit();

Смотрите этот сайт Как отправить форму через javascript .
Надеюсь, это поможет.

0 голосов
/ 07 сентября 2011

Вам необходимо прикрепить функцию для запуска по событию "onsubmit", вернуть false из обработчика события, если вы хотите отменить отправку формы, или использовать ниже:

function onSubmitHandler(evnt){

//run some code set some flag
if(flag is set) evnt.preventDefault(); else return true;

}
0 голосов
/ 07 сентября 2011

Вы можете прослушать событие submit.Что-то вроде:

(function() {
    var processed = false;

    form.onsubmit = function(event) {
        event = event || window.event;
        if(!processed) {
            if(event.preventDefault) {      // cancel default action
                event.preventDefault();
            }
            else {
                event.returnValue = false;
            }

            // run your code
            // execute the next two lines in a callback if necessary
            processed = true;
            form.submit();
        }
    };
}());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...