Есть ли селектор CSS, чтобы определить, выбран ли для ввода текстовый файл? - PullRequest
11 голосов
/ 14 ноября 2010

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

Ответы [ 3 ]

6 голосов
/ 14 ноября 2010

Чтобы развернуть комментарий И Цзяна, селекторы против атрибута «значение» не заметят изменений в свойстве «значение».Атрибут «value» привязан к свойству «defaultValue» , а свойство «value» не привязано ни к какому атрибуту (спасибо porneL за это указание).

Обратите внимание, что существует аналогичная связь с атрибутом " checked " и свойствами " defaultChecked " и " checked ";если вы используете селектор атрибута [checked], а не псевдокласс :checked, вы не увидите изменения стиля при изменении состояния флажка.В отличие от «проверенного» семейства, «value» не имеет соответствующего псевдокласса, который вы могли бы использовать.

Попробуйте следующую тестовую страницу:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Dynamic attribute selectors</title>
    <style type="text/css">
     input:not([value]), div:not([value]) {
       background-color: #F88;
     }

     input[value], div[value] {
       border: 5px solid #8F8;
     }
     input[value=""], div[value=""] {
       border: 5px solid #F8F;
     }

     input:not([value=""]), div:not([value=""]) {
       color: blue;
       border-style: dashed;
     }

     *.big {
         font-size: 200%;
     }
    </style>
    <script>
      function getElt() {
          var id=prompt("Enter ID of element", "d1");
          if (id) {
              return document.getElementById(id);
          } else {
              return {className: ''};
          }
      }

      function embiggen() {
          getElt().className="big";
          return false;
      }

      function smallify() {
          getElt().className="";
          return false;
      }
    </script>
  </head>

  <body>
    <form method="post"  enctype="multipart/form-data"> 
      <div id="d1">no value</div>
      <div id="d2" value="">empty value</div>
      <div id="d3" value="some">some value</div>
      <p><label for="foo">foo:</label> <input name="foo" id="foo" /></p> 
      <p><label for="bam">bam:</label> <input name="bam" id="bam" value="bug-AWWK" /></p> 
      <p><label for="file">File to upload:</label> <input type="file" name="file" id="file" onchange="setValueAttr(this)"/></p>
      <input type="button" value="Embiggen" onclick="return embiggen()" />
      <input type="button" value="Smallify" onclick="return smallify()" />
    </body>
</html>

Изменение значения чего-либои стиль не изменится.Измените класс чего угодно, и стиль изменится.Если добавить следующую функцию JS и связать ее с событием изменения на входе, стиль фона изменится.

      function bindValue(elt) {
          var oldVal=elt.getAttribute('value');
          elt.setAttribute('value', elt.value);
          var newVal=elt.getAttribute('value');
          if (oldVal != newVal) {
              alert('Had to change value from "'+oldVal+'" to "'+newVal+'"');
          }
      }

Это связывает свойство «value» с атрибутом «value», поэтому обновляетсяпервый при вводе пользователем будет распространяться на последний (программная установка свойства «value» не приведет к событию изменения).

При рассмотрении свойств JS для файловых входов до и после (с помощью следующегосценарий), единственным, с заметным изменением была «ценность».Исходя из этого, я сомневаюсь, что есть какие-либо другие атрибуты HTML, которые изменяются и, следовательно, могут использоваться в селекторе атрибутов.

<script>
  var file = {blank: {}, diff: {}};
  var fInput = document.getElementById('file');
  for (p in fInput) {
    try {
      file.blank[p] = fInput[p];
    } catch (err) {
      file.blank[p] = "Error: setting '"+p+"' resulted in '"+err+"'";          
    }
  }

  function fileDiff() {
    for (p in fInput) {
      try {
        if (file.blank[p] != fInput[p]) {
          file.diff[p] = {orig: file.blank[p], now: fInput[p]};
        }
      } catch (err) {
        //file.diff[p] = "Error: accessing '"+p+"' resulted in '"+err+"'";          
      }
    }

  }

  if (fInput.addEventListener) {
    fInput.addEventListener('change', fileDiff, false);
  } else if (fInput.attachEvent) {
    fInput.attachEvent('onchange', fileDiff);
  } else {
    fInput.onchange = fileDiff;
  }
</script>

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

<style>
 a input {
   display: none;
 }
 :not(a) + a input,
 a:visited + a input
 {
   display: block /* or "inline" */ ;
 }

</style>
...
<a href="#asuhacrpbt"><input type="file" ... /></a>
<a href="#cmupbnhhpw"><input type="file" ... /></a>
<a href="#mcltahcrlh"><input type="file" ... /></a>

Вам нужно будет генерировать не посещенные цели для ссылок каждый раз, когда страница загружается.Поскольку вам пришлось бы делать это на стороне сервера, вы не могли бы сделать это с полной уверенностью, хотя вы могли бы получить вероятность создания ранее посещенной цели, произвольно близкой к 0. Это также не работает во всех браузерах, таких какСафари.Я подозреваю, что это связано с тем, что CSS2 и CSS3 :

Примечание. Авторы таблиц стилей могут злоупотреблять: link и:посещенные псевдоклассы, чтобы определить, какие сайты посетил пользователь без согласия пользователя. Поэтому

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

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

6 голосов
/ 23 августа 2012

Пример, содержащий тысячи слов: Отображение X-ввода по одному

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

0 голосов
/ 14 ноября 2010

Для выбора пустых полей вы можете попробовать

input[type=file][value=""] {
    background-color: red;
}

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

<input type="file" id="test" value="">

Использование оператора «+», как вы сделали в вашем примере, будет соответствовать двум отдельным входным файлам, один за другим. Он не проверяет два атрибута того же тега, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...