Почему кнопка ввода типа работает как кнопка отправки? [Дубликат]

Подчеркивание (_) в Python

Ниже приведены разные места, где _ используется в Python:

Single Underscore:

  • In Interpreter
  • После имени
  • Перед именем

Double Underscore:

  • __ leading_double_underscore
  • ] before_after
  • Single Underscore

В интерпретаторе:

_ возвращает значение последнего выполненного выражения в Python REPL ]

>>> a = 10
>>> b = 10
>>> _
Traceback (most recent call last):
File "", line 1, in 
NameError: name '_' is not defined
>>> a+b
20
>>> _
20
>>> _ * 2
40
>>> _
40
>>> _ / 2
20

Для игнорирования значений:

Несколько раз мы не хотим, чтобы возвращаемые значения в это время присваивали эти значения wnderscore. Он использовался как переменная throwaway.

# Ignore a value of specific location/index
for _ in rang(10)
    print "Test"

# Ignore a value when unpacking
a,b,_,_ = my_method(var1)

После имени

Python имеет свои ключевые слова по умолчанию, которые мы не можем использовать в качестве имени переменной. Чтобы избежать такого конфликта между ключевыми словами и переменной python, мы используем символ подчеркивания после имени

Пример:

>>> class MyClass():
...     def __init__(self):
...             print "OWK"

>>> def my_defination(var1 = 1, class_ = MyClass):
...     print var1
...     print class_

>>> my_defination()
1
__main__.MyClass
>>>

Перед именем

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

Здесь префикс имени by underscore рассматривается как непубличный. Если указать из Import *, все имя начинается с _, то не будет импортироваться.

Python не указывает действительно закрытый, так что это могут быть вызовы непосредственно из других модулей, если они указаны во всех, Мы также называем это слабым Частный

class Prefix:
...     def __init__(self):
...             self.public = 10
...             self._private = 12
>>> test = Prefix()
>>> test.public
10
>>> test._private
12
Python class_file.py

def public_api():
    print "public api"

def _private_api():
    print "private api"

Вызов файла из REPL

>>> from class_file import *
>>> public_api()
public api

>>> _private_api()
Traceback (most recent call last):
File "", line 1, in 
NameError: name '_private_api' is not defined

>>> import class_file
>>> class_file.public_api()
public api
>>> class_file._private_api()
private api
Double Underscore(__)

__ leading_double_underscore

Ведущий двойной подчеркивание говорит интерпретатору python, чтобы переписать имя, чтобы избежать конфликта в подклассе. Интерпретатор изменяет имя переменной с расширением класса и эту функцию, известную как Mangling. testFile.py

class Myclass():
    def __init__(self):
        self.__variable = 10

Вызов из REPL

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.__variable
Traceback (most recent call last):
File "", line 1, in
AttributeError: Myclass instance has no attribute '__variable'
nce has no attribute 'Myclass'
>>> obj._Myclass__variable
10

В Mangling интерпретатор python измените имя переменной на ___. Таким образом, множественное время используется как частный член, потому что другой класс не может напрямую обращаться к этой переменной. Основной целью __ является использование переменной / метода только в классе. Если вы хотите использовать его вне класса, вы можете сделать общедоступным api

class Myclass():
    def __init__(self):
        self.__variable = 10
    def func(self)
        print self.__variable

Вызов из REPL

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.func()
10

__ BEFORE_AFTER __

Имя с началом с __ и заканчивается тем же, что и специальные методы в Python. Python предоставляет эти методы для использования в качестве перегрузки оператора в зависимости от пользователя.

Python предоставляет это соглашение для различения определяемой пользователем функции с функцией модуля

class Myclass():
    def __add__(self,a,b):
        print a*b

. Вызов из REPL

>>> import testFile
>>> obj = testFile.Myclass()
>>> obj.__add__(1,2)
2
>>> obj.__add__(5,2)
10

Ссылка

409
задан alex 25 June 2012 в 12:29
поделиться

7 ответов

Значением по умолчанию для атрибута type элементов button является "submit".

<button type=button>Submit</button>
887
ответ дан Josh Lee 21 August 2018 в 12:34
поделиться
  • 1
    Согласно w3schools, это неверно для IE . – R0MANARMY 23 July 2010 в 03:38
  • 2
    @ R0MANARMY: Да, на IE & lt; 8, button является значением по умолчанию type ... – CMS 23 July 2010 в 05:09
  • 3
    Это просто потрясающий дизайн. – octern 12 February 2015 в 18:45
  • 4
    @octern Если он был первоначально предназначен для отправки, а затем решил, что он также должен быть стандартной кнопкой, то что вы можете сделать? – alex 4 February 2016 в 09:44
  • 5
    @ josh-lee Почему не type="button" с цитатой? Это то же самое? – Rafnuss 9 December 2016 в 12:41

Честно говоря, мне нравятся другие ответы. Легко и не нужно входить в JS. Но я заметил, что вы спрашивали о jQuery. Итак, для полноты, в jQuery, если вы вернете false с обработчиком .click (), это будет отрицать действие виджета по умолчанию.

См. Здесь пример (и больше лакомства тоже). Вот также документация .

в двух словах с вашим примером кода:

<script type="text/javascript">
    $('button[type!=submit]').click(function(){
        // code to cancel changes
        return false;
    });
</script>

<a href="index.html"><button>Cancel changes</button></a>
<button type="submit">Submit</button>

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

209
ответ дан alex 21 August 2018 в 12:34
поделиться
  • 1
    Можно ли это сделать на сервере (C #)? – B. Clay Shannon 19 June 2015 в 00:50
  • 2
    @ B.ClayShannon Не совсем. Вы можете использовать серверный код для возврата одной и той же страницы при нажатии кнопки, но она все равно перезагрузит страницу. В конечном счете кнопка является частью документа, и поэтому единственные способы сказать браузеру, как вы хотите, чтобы он действовал, - это HTML и JavaScript. – s4y 22 June 2015 в 18:41
  • 3
    Любопытно, что добавление e.preventDefault() не делает ничего, чтобы остановить подачу (где он начинается с function(e)). – Sablefoste 6 September 2017 в 17:47
  <form class="form-horizontal" method="post">
        <div class="control-group">

            <input type="text" name="subject_code" id="inputEmail" placeholder="Subject Code">
        </div>
        <div class="control-group">
            <input type="text" class="span8" name="title" id="inputPassword" placeholder="Subject Title" required>
        </div>
        <div class="control-group">
            <input type="text" class="span1" name="unit" id="inputPassword" required>
        </div>
            <div class="control-group">
            <label class="control-label" for="inputPassword">Semester</label>
            <div class="controls">
                <select name="semester">
                    <option></option>
                    <option>1st</option>
                    <option>2nd</option>
                </select>
            </div>
        </div>

        <div class="control-group">
            <label class="control-label" for="inputPassword">Deskripsi</label>
            <div class="controls">
                    <textarea name="description" id="ckeditor_full"></textarea>
 <script>CKEDITOR.replace('ckeditor_full');</script>
            </div>
        </div>



        <div class="control-group">
        <div class="controls">

        <button name="save" type="submit" class="btn btn-info"><i class="icon-save"></i> Simpan</button>
        </div>
        </div>
        </form>

        <?php
        if (isset($_POST['save'])){
        $subject_code = $_POST['subject_code'];
        $title = $_POST['title'];
        $unit = $_POST['unit'];
        $description = $_POST['description'];
        $semester = $_POST['semester'];


        $query = mysql_query("select * from subject where subject_code = '$subject_code' ")or die(mysql_error());
        $count = mysql_num_rows($query);

        if ($count > 0){ ?>
        <script>
        alert('Data Sudah Ada');
        </script>
        <?php
        }else{
        mysql_query("insert into subject (subject_code,subject_title,description,unit,semester) values('$subject_code','$title','$description','$unit','$semester')")or die(mysql_error());


        mysql_query("insert into activity_log (date,username,action) values(NOW(),'$user_username','Add Subject $subject_code')")or die(mysql_error());


        ?>
        <script>
        window.location = "subjects.php";
        </script>
        <?php
        }
        }

        ?>
0
ответ дан Andrew 21 August 2018 в 12:34
поделиться

Без установки атрибута type вы также можете вернуть false из вашего обработчика OnClick и объявить атрибут onclick как onclick="return onBtnClick(event)".

0
ответ дан Harun Diluka Heshan 21 August 2018 в 12:34
поделиться

Просто используйте старый добрый HTML:

<input type="button" value="Submit" />

Оберните его как объект ссылки, если хотите:

<a href="http://somewhere.com"><input type="button" value="Submit" /></a>

Или если вы решите, что хотите javascript для обеспечения некоторых других функций:

<input type="button" value="Cancel" onclick="javascript: someFunctionThatCouldIncludeRedirect();"/>
16
ответ дан Jeffrey Blake 21 August 2018 в 12:34
поделиться
  • 1
    Использование стандартного кнопочного управления с соответствующим атрибутом типа - это «старый добрый html», и создает гораздо более простую разметку. – R0MANARMY 23 July 2010 в 03:46
  • 2
    Это явно не проще, если в некоторых браузерах он имеет тип отправки по умолчанию, а в других он имеет кнопку типа по умолчанию. Черт, даже если у вас есть тип отправки по умолчанию, это усложняет ситуацию больше, чем необходимо ИМО. Там должна быть разметка, которая легко предоставляет кнопку, которая ничего не делает. И есть: <input type="button" /> – Jeffrey Blake 23 July 2010 в 04:01
  • 3
    +1 Я использовал эту точную технику много раз, и она всегда хорошо работала для меня. Один из вариантов заключается в том, что вам нужно отменить событие postback для серверной кнопки на основе некоторого расчета на стороне клиента, вы можете включить window.event.returnValue = false; в вашем коде, который выполняется в клиентском onclick-событии для вашей кнопки ... то есть, если использование настраиваемого элемента управления проверкой не вырезает горчицу для вас :) – Adam McKee 23 July 2010 в 04:05
  • 4
    @ JGB146: Просто потому, что не все браузеры по умолчанию имеют одинаковое значение, это не значит, что они не будут уважать правильный тип, если он установлен вручную (как это предлагает jleedev. Не говоря уже о том, что вопросы конкретно задают способ сделать это без JavaScript , в то время как ваш ответ не учитывает это. – R0MANARMY 23 July 2010 в 05:24
  • 5
    @ JGB146: Button - контейнер в HTML. Это позволяет размещать такие вещи, как изображения или таблицы (не уверен, почему вы это сделаете, но можете) и т. Д., В то время как input не поддерживает это. Существует разница между ними, и каждый из них имеет свой подходящий вариант использования. – R0MANARMY 23 July 2010 в 15:06
<form onsubmit="return false;">
   ...
</form>
5
ответ дан Star 21 August 2018 в 12:34
поделиться
210
ответ дан alex 1 November 2018 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: