我正在尝试输入一些文件,并且只有在前一个文件被填充时才显示它们。这也可以使用css 3。是否有一个CSS选择器来检测输入是否有选定的文本文件?
回答
要选择空字段,你可以尝试
input[type=file][value=""] {
background-color: red;
}
我测试的jsfiddle。有至少,我需要输入标签定义一个空值属性,它的工作
<input type="file" id="test" value="">
使用“+”操作符与您在您的例子做会匹配两个单独的文件输入,一个向右之后。它不会检查您看起来想要的相同标记的两个属性。
要扩展Yi Jiang的评论,针对“value”属性的选择器不会注意到“value”属性的更改。 “价值”属性绑定到"defaultValue" property,而"value" property没有绑定到任何属性(感谢porneL指出了这一点)。
请注意,与“checked”属性和“defaultChecked”和“checked”属性有类似的关系;如果您使用属性选择器[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”属性,所以更新前者通过用户输入将传播到后者(编程设置“值”属性不会导致改变事件) 。
在检查文件输入前后的JS属性(通过使用下面的脚本)时,唯一有可改变的是“value”。从这个角度来看,我怀疑是否有其他的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和:visited伪类,以确定用户未经用户访问了哪些网站同意。
因此,UA可能会将所有链接视为未访问链接,或实施其他措施以保护用户隐私,同时呈现不同访问和未访问链接。
您可能能够使用其他元素上的其他选择器来破解一些东西,但我怀疑这不能干净地完成。
澄清:匹配'value'属性*的选择符总是在'value' *属性*改变时动态地重新评估,并且它支持所有支持CSS2选择器的浏览器。 CSS在这里不会例外。令人困惑的部分是''value * *属性*'**未更新**以响应''的变化。 'value' * attribute *映射到'defaultValue' DOM * property *,'value' * property *没有相应的DOM *属性*。 JS和HTML/CSS是两个不同的世界。 – Kornel 2010-11-14 16:55:59
那么,如果'defaultValue'通过JavaScript更新(简化jQuery):'jQuery('input [type = file]').change(function(e){this.defaultValue = this.value;}) ;' – feeela 2012-09-26 18:55:46
一个例子值得十万字:Display X input, one at a time
的想法很简单,如果根据需要设置的输入是空的,它是无效的。从那里,你所要做的就是根据需要设置所有输入,并使用:无效伪类。应该与标签一起工作。
- 1. 什么是选择器来检查输入标签是否输入了文本?
- 2. 检查CSS选择器是否有效
- 3. 检测是否选择了输入法
- 4. 检查JFileChooser是否有一个或多个文件选择
- 5. 是否有文本节点的CSS选择器?
- 6. 检测是否已指定选择器
- 7. 是否有指针选择html输入中文本的开头?
- 8. PHP检查是否有人选择了一个文件
- 9. 如何使用JQuery检测文件输入是否有文件被选中?
- 10. 在CSS中是否有任何伪选择器来选择一个字母:hover?
- 11. 是否有第一个孩子的CSS选择器,考虑到文本节点?
- 12. 是否有一个JS库根据特异性命令CSS选择器文本?
- 13. 是否有“是后代还是有类”的sass/css选择器?
- 14. 如何检查是否选择任一框或文本输入是空的jQuery
- 15. 检查输入是否带有CSS的文本/值
- 16. 是否有一个CSS文本重置?
- 17. 如何检查是否在文件输入选择什么
- 18. CSS:文件输入 - 目标文本“没有选择文件”
- 19. 如何检查是否选定的文本是一个有效的字
- 20. JS检查是否有一个值在选择多种选择
- 21. 选择多个文本框来检查它是否为空
- 22. 是否有一个用于溢出的css伪选择器?
- 23. 检查选定的文本是否在给定的CSS类中?
- 24. CSS是否有一个选择器用于选择何时在多个类中?
- 25. 检查选择器是否
- 26. 是否有一个Django的选择选择窗体小部件,允许一个可选的文本字段
- 27. 是否有一个CSS选择器包含类似于^和$
- 28. 是否有一个CSS'兄弟包含'选择器?
- 29. 如何检测(在js中)是否在HTML5多输入中选择文件?
- 30. 是否有必要在一个ID内有一个ID的CSS选择器?
我想要的只是首先显示1个输入,然后一旦有一个文件被选中,显示第二个,依此类推。我测试了你的建议,一旦文件被选中,它就不会改变。它只查看“value”属性的初始值,当它改变时什么都不做。 – manixrock 2010-11-13 23:57:09
@manixrock CSS不能像这样使用 - 选择器只在加载页面时评估一次,就是这样。您需要使用Javascript才能做到这一点 – 2010-11-14 00:15:04
@Yi Jiang - 这不是真的:'input {margin-left:10px; } input:checked {margin-left:20px; }';添加一个复选框的输入,当你检查它会移动到右侧;取消选中它,它会移动到左侧;这证明css是在运行时在页面上进行评估的,而不仅仅是在加载时。我正在寻找这样的东西,但适合文件输入。 – manixrock 2010-11-14 00:23:43