Задержка в HTML5 :недействительных псевдо-класса до первого случая

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

<style>
input:invalid { background-color: pink; color: white; }
input:valid { background-color: white; color: black; }
</style>
…
<input name="foo" required />

Тогда ваша страница будет загружаться с пустой розовой входной элемент на нем. Проведя проверку, встроенный в HTML5-это здорово, но я не'т думаю, что большинство пользователей ожидают форме для проверки, прежде чем они'вэ был шанс ввести какие-либо значения вообще. Есть ли способ, чтобы задержать применения псевдо-класса до первого события, затрагивающие этот элемент (отправка формы, размытие, изменение, что's необходимости)? Можно ли сделать это без JavaScript?

Комментарии к вопросу (1)
Решение

http://www.alistapart.com/articles/forward-thinking-form-validation/

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

Следуя этой логике, ваш код будет выглядеть что-то вроде этого...


    input:focus:required:invalid {background-color: pink; color: white;}
    input:required:valid {background-color: white; color: black; }

Создал скрипку здесь: http://jsfiddle.net/tbERP/

Как вы'd не думаю, и как вы'll увидеть со скрипкой, этот метод показывает лишь проверка укладки, когда элемент имеет фокус. Как только вы переместите фокус, стайлинг удаляется, независимо от того, является ли он действительным или нет. Не идеально любыми средствами.

Комментарии (5)

Это не возможно в чистом CSS, но может быть сделано с помощью JavaScript. Это [пример работы с jQuery](http://jsfiddle.net/kaleb/9pyMz/):

в

// use $.fn.one here to fire the event only once.
$(':required').one('blur keydown', function() {
  console.log('touched', this);
  $(this).addClass('touched');
});
/**
 * All required inputs initially are yellow.
 */
:required {
  background-color: lightyellow;
}

/**
 * If a required input has been touched and is valid, it should be white.
 */
.touched:required:valid {
  background-color: white;
}

/**
 * If a required input has been touched and is invalid, it should be pink.
 */
.touched:required:invalid {
  background-color: pink;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>

    Name:
    <input type="text" required> *required

</p>
<p>
  Age:
    <input type="text">

</p>

в

Комментарии (2)

Эти ответы устарели. Теперь вы можете сделать это, проверяя для заполнителя псевдо-класс в CSS.

в

input:not(:placeholder-shown):invalid {
    background-color: salmon;
}
form:invalid button {
    background-color: salmon;
    pointer-events: none;
}

    <input type="email" placeholder="me@example.com" required>
    Submit

в

Она начинается с нормальным фоном и розовеет, как вы вводите вы неполный адрес электронной почты в нем.

Комментарии (3)

В Mozilla заботится об этом с их собственных :-МОЗ-ИП-инвалид псевдокласса, который применяется только для форм после того, как они'вэ были взаимодействовать. МДН не рекомендуем использовать это из-за отсутствия поддержки. Однако, вы можете изменить его для Firefox.

Там'ы Уровень 4 спецификаций для :пользователей-недопустимые точечка на горизонте, которые будут предлагать подобное поведение.

Извините, если это не'т помочь, но я надеюсь, что это предлагает некоторый контекст.

Комментарии (0)

Я создал небольшую прокладку, чтобы справиться с этим в моем коде. Я просто начинаю с моим <форма/> элемента, имеющего novalidate собственность вместе с данными-проверять-на=на"размытие"в атрибут. Это часы для первого мероприятия такого рода. Таким образом, вы можете использовать селекторы родной:недопустимый` CSS для формы укладки.

$(function () {
    $('[data-validate-on]').each(function () {
        var $form = $(this);
        var event_name = $form.data('validate-on');

        $form.one(event_name, ':input', function (event) {
            $form.removeAttr('novalidate');
        });
    });
});
Комментарии (1)

Это VanillaJS (не jQuery) и версии КЖответ

в

{
  let f = function() {
    this.classList.add('touched')
  }
  document
    .querySelectorAll('input')
    .forEach((e) => {
      e.addEventListener('blur', f, false)
      e.addEventListener('keydown', f, false)
    })
}
/**
 * All required inputs initially are yellow.
 */
:required {
  background-color: lightyellow;
}

/**
 * If a required input has been touched and is valid, it should be white.
 */
.touched:required:valid {
  background-color: white;
}

/**
 * If a required input has been touched and is invalid, it should be pink.
 */
.touched:required:invalid {
  background-color: pink;
}
<p>
  Name:
  <input type="text" required> *required
</p>
<p>Age:
  <input type="text">
</p>

в

Комментарии (1)

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

Слушайте "инвалид" событие, чтобы добавить класс 'неверный' в форму. С 'неверный' классе добавлен, вы можете пойти в город с моделированием ваших форм с помощью CSS3 :селекторы псевдо.

Например:

// where myformid is the ID of your form
var myForm = document.forms.myformid;

var checkCustomValidity = function(field, msg) {
    if('setCustomValidity' in field) {
        field.setCustomValidity(msg);
    } else {
        field.validationMessage = msg;
    }
};

var validateForm = function() {

    // here, we're testing the field with an ID of 'name'
    checkCustomValidity(myForm.name, '');

    if(myForm.name.value.length < 4) {
        checkCustomValidity(
            // alerts fields error message response
            myForm.name, 'Please enter a valid Full Name, here.'
        );
    }
};

/* here, we are handling your question above, by adding an invalid
   class to the form if it returns invalid.  Below, you'll notice
   our attached listener for a form state of invalid */
var styleInvalidForm = function() {
    myForm.className = myForm.className += ' invalid';
}

myForm.addEventListener('input', validateForm, false);
myForm.addEventListener('keyup', validateForm, false);
myForm.addEventListener('invalid', styleInvalidForm, true);

Теперь, просто стиль вашей форме, как вы считаете нужным, основываясь на 'неверный' классе мы'добавленные пять.

Например:

form.invalid input:invalid,
form.invalid textarea:invalid {
    background: rgba(255, 0, 0, .05);
    border-color: #ff6d6d;
    -webkit-box-shadow: 0 0 6px rgba(255, 0, 0, .35);
    box-shadow: 0 0 6px rgba(255, 0, 0, .35);
}
Комментарии (1)

Есть события в HTML5 "инвалид", что пожары на элементы формы, прежде чем "отправить" событие возникает для каждого элемента, который не проходит checkValidity. Вы можете использовать это событие, чтобы применить например класс для окружающих форме и дисплей :недопустимый стили только после того, как это событие происходит.

 $("form input, form select, form textarea").on("invalid", function() {
     $(this).closest('form').addClass('invalid');
 });

Тогда ваш CSS будет выглядеть примерно так:

:invalid { box-shadow: none; }
.invalid input:invalid,
.invalid textarea:invalid,
.invalid select:invalid { border: 1px solid #A90909 !important; background-color: #EEC2C2; }

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

Комментарии (0)

Хороший способ-это абстрактное `:недопустимый, действует с CSS-классами и затем некоторые JavaScript, чтобы проверить, если поле ввода было сфокусировано или нет.

Усс:

input.dirty:invalid{ color: red; }
input.dirty:valid{ color: green; }

ДШ:

// Function to add class to target element
function makeDirty(e){
  e.target.classList.toggle('dirty');
}

// get form inputs
var inputs = document.forms[0].elements;

// bind events to all inputs
for(let input of inputs){
  input.addEventListener('invalid', makeDirty);
  input.addEventListener('blur', makeDirty);
  input.addEventListener('valid', makeDirty);
}

[Демо][1]

Комментарии (0)

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

Что-то вроде:


  input.touched:invalid { background-color: pink; color: white; }
  input.touched:valid { background-color: white; color: black; }

<script>
  document.addEventListener('DOMContentLoaded', function() {
    var required = document.querySelectorAll('input:required');
    for (var i = 0; i < required.length; ++i) {
      (function(elem) {
        function removeClass(name) {
          if (elem.classList) elem.classList.remove(name);
          else
            elem.className = elem.className.replace(
              RegExp('(^|\\s)\\s*' + name + '(?:\\s+|$)'),
              function (match, leading) {return leading;}
          );
        }

        function addClass(name) {
          removeClass(name);
          if (elem.classList) elem.classList.add(name);
          else elem.className += ' ' + name;
        }

        // If you require a class, and you use JS to add it, you end up
        // not showing pink at all if JS is disabled.
        // One workaround is to have the class on all your elements anyway,
        // and remove it when you set up proper validation.
        // The main problem with that is that without JS, you see what you're
        // already seeing, and stuff looks hideous.
        // Unfortunately, you kinda have to pick one or the other.

        // Let non-blank elements stay "touched", if they are already,
        // so other stuff can make the element :invalid if need be
        if (elem.value == '') addClass('touched');

        elem.addEventListener('blur', function() {
          addClass('touched');
        });

        // Oh, and when the form submits, they need to know about everything
        if (elem.form) {
          elem.form.addEventListener('submit', function() {
            addClass('touched');
          });
        };
      })(required[i]);
    }
  });
</script>

И конечно, он выиграл'т работать как в IE8 или ниже, а (а) DOMContentLoaded является относительно новым и был'т стандарт, когда в IE8 вышел, (б) в IE8 использует attachEvent, а не дом-стандартный метод addEventListener, и (C) в IE8 это&#39;т будет заботиться о:необходимо в любом случае, как это не'т технически поддерживают HTML 5.

Комментарии (0)

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


input.focused:required:invalid { background-color: pink; color: white; }
input:valid { background-color: white; color: black; }

…
<input name="foo" class="notfocused" onFocus="document.activeElement.className='focused';" required />

Попробуйте сами ниже:

в

input.focused:required:invalid {
  background-color: pink;
  color: white;
}

input:required:valid {
  background-color: darkseagreen;
  color: black;
}
At least 1 charater:<br />
<input type="text" name="foo" class="notfocused" onFocus="document.activeElement.className='focused';" required />

в

Комментарии (0)

Я могу'т комментарий, но, чтобы пойти с @Карл's очень полезный ответ о том, что :нет (заполнитель-показано). А еще упомянул, это еще покажет недопустимое состояние, если у вас нет заполнителя (как некоторые конструкции форма вызова для).

Чтобы решить эту проблему, просто добавьте пустой местозаполнитель, как так

<input type="text" name="username" placeholder=" " required>

Тогда ваш CSS, что-то вроде

:not(:placeholder-shown):invalid{ background-color: #ff000038; }

Работал для меня!

Комментарии (0)

Исходя из agousehидеей, вы можете иметь немного JavaScript, чтобы сказать, когда кнопка "Отправить" была ориентирована, и проверки показывают в это время.

JavaScript будет добавить класс (например, `представить-ориентацией) в поле формы, когда кнопку "Отправить" ориентирована или нажатии на которые затем CSS, чтобы стилизовать недопустимых входных данных.

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

в

document
  .querySelector('input[type=submit]')
  .onfocus = function() {
    this
      .closest('form')
      .classList
      .add('submit-focussed');
  };
form.submit-focussed input:invalid {
  border: thin solid red;
}

  Email <input type="email" required="" />
  <input type="submit" />

в

альтернатива на jQuery

в JavaScript (функция($) { $(&#39;вход[тип=отправить]&#39;).на(&#39;фокус&#39;, функция() { $(этот) .родитель(&#39;форма&#39;) .добавление(&#39;представить приоритеты&#39;); }); })(jQuery) и; /* в WordPress совместимый */

Комментарии (0)