停用按钮,直到检查完所有JavaScript条件

时间:2018-06-28 15:24:18

标签: javascript

我正在尝试发送表单之前执行不同的javascript验证,问题是我无法阻止表单提交,它检查条件并在条件不满足时发送警报,但是无论如何它都会发送表格。我希望禁用该按钮,直到一切正确为止,或者发送一条消息告诉用户,以检查提示。 提前致谢。这是我的代码:

class Company(models.Model):
    name = models.CharField(
        max_length=40, 
        verbose_name=_('Name'))
    legal_name = models.CharField(
        max_length=100, null=True, 
        blank=True, verbose_name=_('Legal name'))
    tax_id = models.CharField(
        max_length=12, null=True, 
        blank=True, verbose_name=_('Tax ID'))
    url = models.URLField(
        null=True, blank=True, verbose_name=_('URL'))
    address = models.TextField(
        max_length=400, null=True, 
        blank=True, verbose_name=_('Address'))

class Contract(models.Model):
    DOLAR = 'USD'
    EURO = 'EURO'
    PESO = 'MXN'
    CURRENCY_CHOICES = (
        (DOLAR, _('USD')),
        (EURO, _('EURO')),
        (PESO, _('MXN'))
    )

    PENDING = 'PENDING'
    SIGNED = 'SIGNED'
    DUE = 'DUE'
    CANCELLED = 'CANCELLED'
    STATUS_CHOICES = (
        (PENDING, _('Pending')),
        (SIGNED, _('Signed')),
        (DUE, _('Due')),
        (CANCELLED, _('Cancelled'))
    )

    company = models.ForeignKey(
        Company, on_delete=models.PROTECT, 
        related_name='contracts', verbose_name=_('Company'))
    representative_name = models.CharField(
        max_length=100, verbose_name=_('Representative Name'))
    representative_email = models.EmailField(
        verbose_name=_('eMail'))
    representative_phone = models.CharField(
        max_length=12, verbose_name=_('Representative Phone'))
    representative_fax = models.CharField(
        max_length=12, null=True, blank=True, 
        verbose_name=_('Representative Fax'))
    start_date = models.DateField(
        verbose_name=_('Start Date'))
    due_date = models.DateField(
        verbose_name=_('Due Date'))
    currency = models.CharField(
        max_length=10, choices=CURRENCY_CHOICES, 
        default=DOLAR, verbose_name=_('Currency'))
    days_credit = models.SmallIntegerField(
        null=True, blank=True, verbose_name=_('Days of Credit'))
    pre_pay = models.BooleanField(
        default=True, verbose_name=_('Pre-Pay'))
    advertising = models.TextField(
        null=True, blank=True, verbose_name=_('Advertising'))
    includes_comment = models.TextField(
        null=True, blank=True, verbose_name=_('Includes'))
    comment = models.TextField(
        null=True, blank=True, verbose_name=_('Comment'))
    status = models.CharField(
        max_length=9, choices=STATUS_CHOICES, 
        default=PENDING, verbose_name=_('Status'))
    room_types = models.ManyToManyField(
        RoomType, verbose_name=_('Room Types'))
    plan_types = models.ManyToManyField(
        PlanType, verbose_name=_('Plan Type'))
    ages = models.ManyToManyField(
        Ages, verbose_name=_('Ages'))
    markets = models.ManyToManyField(
        Market, verbose_name=_('Market'))

class Hotel(models.Model):
    ONE_STAR = '*'
    TWO_STARS = '**'
    THREE_STARS = '***'
    FOUR_STARS = '****'
    FIVE_STARS = '*****'
    GRAND_TOURISM = 'GRAND_TOURISM'
    NA = 'NA'
    SPECIAL = 'SPECIAL'
    ECO = 'ECO'
    BOUTIQUE = 'BOUTIQUE'

    HOTEL_CATEGORY_CHOICES = (
        (ONE_STAR, _('*')),
        (TWO_STARS, _('**')),
        (THREE_STARS, _('***')),
        (FOUR_STARS, _('****')),
        (FIVE_STARS, _('*****')),
        (GRAND_TOURISM, _('Grand Tourism')),
        (NA, _('NA')),
        (SPECIAL, _('Special')),
        (ECO, _('Eco-Hotel')),
        (BOUTIQUE, _('Boutique-Hotel'))
    )

    company = models.OneToOneField(
        Company, on_delete=models.CASCADE, 
        primary_key=True, verbose_name=_('Company'))
    code = models.CharField(
        max_length=10, verbose_name=_('Code'))
    zone = models.ForeignKey(
        Zone, on_delete=models.PROTECT, 
        related_name='hotels', verbose_name=_('Zone'))
    category = models.CharField(
        max_length=20, choices=HOTEL_CATEGORY_CHOICES, 
        verbose_name=_('Category'))
    capacity = models.IntegerField(
        verbose_name=_('Capacity'))
    position = models.DecimalField(
        max_digits=11, decimal_places=2, default=0.00, 
        verbose_name=_('Position'))
    in_pickup = models.BooleanField(
        default=False, verbose_name=_('In pickup?'))
    is_active = models.BooleanField(
        default=True, verbose_name=_('Is active?'))
    latitude = models.FloatField(
        null=True, blank=True, verbose_name=_('Latitude'))
    longitude = models.FloatField(
        null=True, blank=True, verbose_name=_('Longitude'))
    iframe = models.CharField(
        max_length=100, null=True, blank=True, 
        verbose_name=_('Google iFrame'))

class RoomType(models.Model):
    hotel = models.ForeignKey(
        Hotel, on_delete=models.PROTECT, 
        related_name='room_types', verbose_name=_('Hotel'))
    name = models.CharField(
        max_length=40, verbose_name=_('Name'))

2 个答案:

答案 0 :(得分:0)

我将表单提交按钮的类型更改为“按钮”,如果所有验证都通过了,则可以从javascript提交表单。
参见下面的代码

function compareclabe() {
  document.getElementById("myBtn").disabled = true;
  var x1 = document.getElementById("clabe").value;
  var x2 = document.getElementById("control").value;
  var x3 = x1 + x2;
  var z1 = document.getElementById("clabe2").value;
  var z2 = document.getElementById("control2").value;
  var z3 = z1 + z2;
  if (x3 != z3) {
    alert("keys are not equal");
    return false;
  } else if (x3 == z3) {
    this.someFunc(); //I want to call function someFunc and then          if the result is true, execute the next code
    if (true) {
      var cBanco = String(x3).charAt(0) + String(x3).charAt(1) + String(x3).charAt(2);
      var x = cBanco;
      switch (x) {
        case "012":
          text = "BBVA BANCOMER";
          break;
        case "014":
          text = "SANTANDER";
          break;
        case "032":
          text = "IXE";
          break;
        default:
          text = "No value found";
      }
      document.getElementById("Banco").value = text;
      document.getElementById("myBtn").disabled = false;
     

  $('#form').submit(); //submit form if all validation succeeds
     
    }

  } else {
    return false;
  }
}

function someFunc() {
  //myFunction2();
  var x = document.getElementById("clabe2").value;
  f2(x, '37137137137137137');
  //return true;

}

function f2(a, b) {
  var cad = Array.from(a, (v, i) => v * b[i] % 10).join('');
  //se suman todos los digitos del array
  var value = cad,
    sum = value
    .toString()
    .split('')
    .map(Number)
    .reduce(function(a, b) {
      return a + b;
    }, 0);
  //separate last digit from result
  var number = sum;

  // convert number to a string, then extract the first digit
  var one = String(number).charAt(1);

  // convert the first digit back to an integer
  var one_as_number = Number(one);
  var digito_control = (10 - one_as_number);

  if (digito_control === 10) {
    digito_control = 0;
    var dg = digito_control;
  } else {
    dg = digito_control;
  }
  var z = document.getElementById("control2").value;
  if (dg != z) {
    alert("checkig digit is not equal");
    return false;
  } else if (dg == z) {
    alert("checkig digit is equal");
    return true;
  }
}
<form action="<?php echo base_url();?>index.php/Datos/agregar" method="post" id="form"> <!-- I included an id to form -->

  Enter CLABE account:
  <input name="clabe" id="clabe" type="text" pattern=".{17,17}" maxlength="17" required title="17 números exactamente" />
  <input type="text" name="control" id="control" maxlength="1" size="2" required> Again:
  <input name="clabe2" id="clabe2" type="text" pattern=".{17,17}" maxlength="17" required title="17 números exactamente" />
  <input type="text" name="control2" id="control2" maxlength="1" size="2" required>
  <hr> Bank: <input type="text" name="Banco" id="Banco" readonly required onmousemove="comparaclabe();">
  <hr> Observations: <input type="text" name="Observaciones" id="Observaciones" required>
  <hr>
  <input type="button" id="myBtn" value="Guardar Cambios" onclick="return compareclabe();"><span id="msg"></span>
  <hr>
  <input type="hidden" id="cve_banco" name="cve_banco">
</form>
<hr>

但是有许多验证插件可以轻松实现。无需从头开始编写代码。请参考此示例-> https://jqueryvalidation.org/

答案 1 :(得分:0)

您可以默认禁用按钮,并将事件侦听器添加到表单中的所有输入。但是请厌倦其他提交表单的方式,例如回车键。我会添加一个onsubmit函数,以防止事件在您不希望发生的所有情况下发生。

const form = document.querySelector('form')
const inputs = [...form.querySelectorAll('input')] // convert node list to array

const isValid = () => {
  let valid = false
  disableButton()
  // handle your conditions here
  if (valid) enableButton()
  return valid;
}

inputs.forEach( input => input.addEventListener('input', isValid))
form.onsubmit = event => if (!isValid()) event.preventDefault()

如果愿意,可以使用ES5:

var form = document.querySelector('form');
var inputNodes = form.querySelectorAll('input');
var inputs = Array.prototype.call.slice(inputNodes); // convert node list to array

var isValid = function() {
  var valid = false;
  disableButton();
  // handle your conditions here
  if (valid) enableButton();
  return valid
}

inputs.forEach( function(input) {
  input.addEventListener('input', isValid);
});
form.onsubmit = function(event) {
  if (!isValid()) event.preventDefault();
};

还值得注意的是,HTML5有很多built-in validation您可以利用。