запретить обновление страницы при нажатии кнопки внутри формы


149

У меня есть проблема при использовании кнопок внутри формы. Я хочу, чтобы эта кнопка вызывала функцию. Это делает, но с нежелательным результатом, что он обновляет страницу.

Мой простой код выглядит так

<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

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

Что я должен сделать, чтобы предотвратить обновление страницы?


Вы должны указать параметры, если вы просто используете window.location = window.location.href; он обновит всю страницу и сбросит все ваши предыдущие запросы. пожалуйста, проверьте это: stackoverflow.com/questions/133925/…
linguini


@bunkdeath: Сосать ответ должен быть принят.
Джад Чейн

@JadChahine извините, я не понял, что не принял ответ, спасибо за указание на это. Я был новичком и не знал, что я делал или не делал тогда. Но я не приму ответ, который вы упомянули, скорее, я приму тот, который помог мне тогда :)
Bunkdeath

Ответы:


67

Давай getData()вернем ложь. Это исправит это.

<form method="POST">
    <button name="data" onclick="return getData()">Click</button>
</form>

1
На самом деле. onclickФункция должна возвращать ложь, а не getData.
Квентин

1
Это то, что я имею в виду, но хорошо, изменил ответ, чтобы он был более понятным.
JNDPNT

5
вам не нужно менять функцию - вы можете просто использовать onclick = "getData (); return false;"

2
type="button"это действительно подвох.
Deepcell

340

Добавьте type="button"к кнопке.

<button name="data" type="button" onclick="getData()">Click</button>

Значение по умолчанию typeдля кнопки - это то submit, что само публикует форму в вашем случае и делает ее похожей на обновление.


8
идеальный ответ дан здесь
тимберлейк

2
Кроме того, это предотвращает проверку формы HTML5 (например, для ввода type = "email").
2540625

2
Вы также можете добавить return false;в onclick:onclick="getData(); return false;"
JBaczuk

1
Это лучший вариант. Хотя «return false» может работать встроенно, при добавлении прослушивателей событий я не знаю такой опции. Указание type = "button" действительно экономит день.
Forever Noob

1
На самом деле это «официальное» решение проблемы такого рода. Возвращение false МОЖЕТ также работать, но кнопка типа никогда не подведет.
student0495

18

Все, что вам нужно сделать, это поставить тег типа и сделать кнопку типа.

<button id="btnId" type="button">Hide/Show</button>

Это решает проблему


2
Можете ли вы уточнить и объяснить, почему?
mjk

поведение кнопки по умолчанию имеет тип отправки, когда внутри формы, при изменении на тип кнопки, можно избежать
публикации

16

Проблема в том, что это вызывает отправку формы. Если вы сделаете getDataфункцию, return falseто она должна остановить отправку формы.

В качестве альтернативы вы также можете использовать preventDefaultметод объекта события:

function getData(e) {
    e.preventDefault();
}

Событие щелчка, которое будет передано.
JNDPNT

За исключением того, что (без дальнейших изменений) объект события не будет передан.
Квентин

<button name = "data" onclick = "getData ($ event)"> Нажмите </ button>
RoboMex

9

HTML

<form onsubmit="return false;" id="myForm">
</form>

JQuery

$('#myForm').submit(function() {
    doSomething();
});

$ ('. myForm) должно быть $ (' # myForm)
Mutant

3
<form method="POST">
    <button name="data" onclick="getData()">Click</button>
</form>

вместо тега кнопки используйте тег ввода. Как это,

<form method="POST">
    <input type = "button" name="data" onclick="getData()" value="Click">
</form>

но это не создало кнопку сbutton type='button'
Pardeep Jain

3

Если вашей кнопкой по умолчанию является «кнопка», убедитесь, что вы полностью задали атрибут type, в противном случае WebForm будет рассматривать его как отправку по умолчанию.

если вы используете JS сделать так

<form method="POST">
   <button name="data"  type="button" id="btnData" onclick="getData()">Click</button>
</form> 

**If you use jquery use like this**


<form method="POST">
   <button name="data"  type="button" id="btnData">Click</button>
</form>




$('#btnData').click(function(e){
   e.preventDefault();
   // Code goes here
getData(); // your onclick function call here

});

2

Метод JavaScript, чтобы отключить саму кнопку

document.getElementById("ID NAME").disabled = true;

Как только все поля формы соответствуют вашим критериям, вы можете снова включить кнопку

Использование Jquery будет примерно таким

$( "#ID NAME" ).prop( "disabled", true);

0

По любой причине в Firefox, хотя у меня есть return false;и myform.preventDefault();в функции, он обновляет страницу после запуска функции. И я не знаю, является ли это хорошей практикой, но она работает для меня, я вставляю javascript:this.preventDefault();в атрибут действия.

Как я уже сказал, я попробовал все остальные предложения, и они отлично работают во всех браузерах, кроме Firefox. Если у вас возникла та же проблема, попробуйте добавить событие предотвращение в атрибут действия javascript:return false;или javascript:this.preventDefault();. Не пытайтесь с javascript:void(0);чем взломать ваш код. Не спрашивай меня почему :-).

Я не думаю, что это элегантный способ сделать это, но в моем случае у меня не было другого выбора.

Обновить:

Если вы получили сообщение об ошибке ... после обработки ajax, удалите действие атрибута и в onsubmitатрибуте выполните свою функцию с последующим ложным возвратом:

onsubmit="functionToRun(); return false;"

Я не знаю, почему все эти проблемы с Firefox, но надеюсь, что это работает.


0

Функция возврата работает не во всех случаях. Я попробовал это:

<button id="Reset" class="Button-class" onclick="return Reset()">Show result</button>

Это не сработало для меня.

Я попытался вернуть false внутри функции, и это сработало для меня.

function Reset()
{
    .
    .
    .
    return false;
}

0

Я столкнулся с той же проблемой. Проблема с onclickфункцией. Там не должно быть никаких проблем с функцией getData. Это сработало, заставив onclickфункцию возвращать false.

<form method="POST">
    <button name="data" onclick="getData(); return false">Click</button>
</form>

0

Это лучшее решение:

<form  method="post"> 
    <button  type="button" name="data" onclick="getData()">Click Me</button>
</form>

Примечание: мой код очень прост.


-2

Вы можете использовать ajax и jquery для решения этой проблемы:

<script>
    function getData() {
        $.ajax({
            url : "/urlpattern",
            type : "post",
            success : function(data) {
                alert("success");
            } 
        });
    }
</script>
<form method="POST">
    <button name="data" type="button" onclick="getData()">Click</button>
</form>

Этот ответ слишком сложен, не говоря уже о том, что требуется внешняя библиотека для предотвращения проблемы ОП, где могут использоваться другие, более простые методы.
Зак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.