Подтвердить что ты не робот

Обязательный атрибут Не работает в браузере Safari

Я пробовал следующий код для того, чтобы обязательное поле уведомило нужное поле, но не работало в браузере Safari. Код:

 <form action="" method="POST">
        <input  required />Your name:
        <br />
        <input type="submit" />
    </form>

Над кодом работает firefox. http://jsfiddle.net/X8UXQ/179/

Можете ли вы сообщить мне код javascript или любой рабочий стол? Я новичок в javascript

Спасибо

4b9b3361

Ответ 1

Safari не поддерживает этот атрибут, вам нужно использовать JavaScript. Эта страница содержит хакерское решение, которое должно добавить желаемую функциональность:

http://www.html5rocks.com/en/tutorials/forms/constraintvalidation/#toc-safari

HTML:

<form action="" method="POST" id="formID">
    Your name: <input  required = "true"/>
    <br />
    <input type="submit" />
</form>

JavaScript:

var form = document.getElementById('formID'); // form has to have ID: <form id="formID">
form.noValidate = true;
form.addEventListener('submit', function(event) { // listen for form submitting
        if (!event.target.checkValidity()) {
            event.preventDefault(); // dismiss the default functionality
            alert('Please, fill the form'); // error message
        }
    }, false);

Вы можете заменить предупреждение каким-то менее уродливым предупреждением, например показать DIV с сообщением об ошибке:

document.getElementById('errorMessageDiv').style.display = 'block';

и в HTML:

<div id="errorMessageDiv" style="display:block;">Please, fill the form.</div>

(содержимое атрибута style должно быть в файле CSS)

Единственным недостатком этого подхода является то, что он не обрабатывает точный ввод, который необходимо заполнить. Для этого потребуется петля на всех входах в форме и проверка значения (и лучше, проверьте наличие "обязательного" атрибута).

Ответ 2

Если вы перейдете с jQuery, то код ниже намного лучше. Просто поместите этот код внизу файла jquery.min.js и он будет работать для каждой формы.

Просто поместите этот код в свой обычный .js файл и вставьте его после этого файла jquery.js или jquery.min.js

$("form").submit(function(e) {

    var ref = $(this).find("[required]");

    $(ref).each(function(){
        if ( $(this).val() == '' )
        {
            alert("Required field should not be blank.");

            $(this).focus();

            e.preventDefault();
            return false;
        }
    });  return true;
});

Этот код работает с тем браузером, который не поддерживает требуемый атрибут (html5)

Иметь друзей друзей в формате кодирования.

Ответ 3

У меня была такая же проблема с Safari, и я могу только просить вас всех взглянуть на Webshim!

Я нашел решения для этого вопроса и для этого один очень полезен, но если вы хотите "имитировать" собственную проверку ввода HTML5 для Safari, Webshim сохраняет вы много времени.

Webshim предоставляет некоторые "обновления" для Safari и помогает ему обрабатывать такие вещи, как датпикер HMTL5 или подтверждение формы. Это не просто реализовать, но и выглядит достаточно хорошо, чтобы сразу использовать его.

Также полезный ответ на SO для начальной настройки для webshim здесь! Копия связанного сообщения:

В настоящее время Safari не поддерживает "требуемый" входной атрибут. http://caniuse.com/#search=required

Чтобы использовать атрибут 'required' в Safari, вы можете использовать 'webshim'

1 - Загрузить webshim

2 - Поместите этот код:

<head>
    <script src="js/jquery.js"></script>
    <script src="js-webshim/minified/polyfiller.js"></script>
    <script> 
        webshim.activeLang('en');
        webshims.polyfill('forms');
        webshims.cfg.no$Switch = true;
    </script>
</head>

Ответ 4

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

CSS

/* .invalid class prevents CSS from automatically applying */
.invalid input:required:invalid {
    background: #BE4C54;
}
.invalid textarea:required:invalid {
    background: #BE4C54;
}
.invalid select:required:invalid {
    background: #BE4C54;
}
/* Mark valid inputs during .invalid state */
.invalid input:required:valid {
    background: #17D654 ;
}
.invalid textarea:required:valid {
    background: #17D654 ;
}
.invalid select:required:valid {
    background: #17D654 ;
}

JS:

$(function () {
    if (hasHtml5Validation()) {
        $('.validate-form').submit(function (e) {
            if (!this.checkValidity()) {
                // Prevent default stops form from firing
                e.preventDefault();
                $(this).addClass('invalid');
                $('#status').html('invalid');
            }
            else {
                $(this).removeClass('invalid');
                $('#status').html('submitted');
            }
        });
    }
});

function hasHtml5Validation () {
    return typeof document.createElement('input').checkValidity === 'function';
}

Кредит: http://blueashes.com/2013/web-development/html5-form-validation-fallback/

(Примечание: я расширил CSS из сообщения, чтобы покрыть textarea и выбрать поля)

Ответ 5

Я построил решение поверх @Roni одного.

Кажется, что Webshim обесценивает, поскольку он не будет совместим с jquery 3.0.

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

При этом checkValidity() реализуется в Safari и возвращает false, если требуемая подача не выполняется.

Итак, чтобы "исправить", а также отобразить сообщение об ошибке с минимальным вмешательством (без дополнительного Div для хранения сообщений об ошибках) и никакой дополнительной библиотеки (кроме jQuery, но я уверен, что это можно сделать на простом javascript)., Я получил этот маленький взлом с помощью заполнителя, чтобы отображать стандартные сообщения об ошибках.

$("form").submit(function(e) {

  if (!e.target.checkValidity()) {
    console.log("I am Safari"); // Safari continues with form regardless of checkValidity being false
    e.preventDefault(); // dismiss the default functionality

    $('#yourFormId :input:visible[required="required"]').each(function () {
      if (!this.validity.valid) {
        $(this).focus();
        $(this).attr("placeholder", this.validationMessage).addClass('placeholderError');
        $(this).val(''); // clear value so it shows error message on Placeholder.
        return false;
      }
    });
    return; // its invalid, don't continue with submission
  }

  e.preventDefault(); // have to add it again as Chrome, Firefox will never see above
}

Ответ 6

Я использую это решение и прекрасно работаю

$('#idForm').click(function(e) {
    e.preventDefault();
    var sendModalForm = true;
    $('[required]').each(function() {
        if ($(this).val() == '') {
            sendModalForm = false;
            alert("Required field should not be blank."); // or $('.error-message').show();
        }
    });

    if (sendModalForm) {
        $('#idForm').submit();
    }
});

Ответ 7

Вы можете добавить этот обработчик событий в свою форму:

// Chrome and Firefox will not submit invalid forms
// so this code is for other browsers only (e.g. Safari). 
form.addEventListener('submit', function(event) {
    if (!event.target.checkValidity()) {
        event.preventDefault();
        var inputFields = form.querySelectorAll('input');
        for (i=0; i < inputFields.length; i++) {
            if (!inputFields[i].validity.valid) {
                inputFields[i].focus(); // set cursor to first invalid input field
                return false;
            }
        }
    }
}, false);

Ответ 8

Внутри каждой функции() я нашел все элементы DOM текстового ввода в старой версии ПК Safari, я думаю, что этот код полезен для более новых версий на MAC с использованием объекта itemobj ['prpertyname'] для получения всех свойств и значений:

    $('form').find("[required]").each(function(index, inputobj) {
        if (inputobj['required'] == true) { // check all required fields within the form
            currentValue = $(this).val();
            if (currentValue.length == 0) {
                // $.each((inputobj), function(input, obj) { alert(input + ' - ' + obj); }); // uncomment this row to alert names and values of DOM object
                var currentName = inputobj['placeholder']; // use for alerts
                return false // here is an empty input
            }
        }
    });

Ответ 9

Новый Safari 10.1, выпущенный 26 марта 2017 года, теперь поддерживает атрибут "required".

http://caniuse.com/#search=required