我在文本输入中使用占位符,效果很好。但我也希望在选择框中使用占位符。当然,我可以使用以下代码:
<select>
<option value="">Select your option</option>
<option value="hurr">Durr</option>
</select>
但“选择您的选项”是黑色而不是浅灰色。所以我的解决方案可能是基于CSS的。jQuery也很好。
这只会使下拉列表中的选项变灰(因此单击箭头后):
option:first {
color: #999;
}
问题是:人们如何在选择框中创建占位符?但这已经得到了回应,欢呼。
使用此选项会导致所选值始终为灰色(即使在选择实际选项后):
select {
color: #999;
}
您需要表单验证,现代浏览器从头开始就提供了这一功能。
因此,您不必担心用户无法选择字段。因为当他这样做时,浏览器验证会告诉他,这是一个错误的选择。
浏览器内置的验证函数checkValidatity()。
Bootstrap也有一个很好的例子。
HTML
<form class="needs-validation">
<select required>
<option value="">Please select an option</option>
<option value="1">Foo</option>
<option value="2">Bar</option>
</select>
<form>
Java脚本
form = document.getElementByClassName('needs-validation');
if(form.checkValidity() === true) {
//form validation succeeded
} else {
//form validation failed
}
使用类名包,这里有一个与我的React功能组件一起工作的解决方案。我的组件使用钩子,但这可能对解决方案并不重要。这种方法是基于类的解决方案的一种功能性模仿。。。https://www.derpturkey.com/select-placeholder-with-react/
组件JS。。。
function NavBar(props, prevProps) {
const ClassNames = require("classnames"); // package needs require rather than import
const [where, changeWhere] = useState(""); // my component's value
// classnames will add placeholderSelect class if chosen option's value is empty
let whereClass = ClassNames("myOtherStyleRules", {
placeholderSelect: !where,
});
...
return (
...
<div id="where">
<select
className={whereClass}
value={where}
...
>
<option value="" hidden> where? </option> // value must be empty, hidden from choice
<option value="24">Anchorage</option>
<option value="27">Birmingham</option>
<option value="28">Detroit</option>
<option value="25">Los Angeles</option>
<option value="26">Oahu</option>
<option value="29">Seattle</option>
</select>
...
组件CSS。。。
.placeholderSelect {
color: rgb(167, 167, 167);
}
我喜欢这个被接受的解决方案,而且它在没有JavaScript的情况下工作得很好。
我只想补充一下,我是如何对一个受控选择的React组件采用这个答案的,因为我花了几次时间才弄清楚。合并react select并使用它将非常简单,但除非您需要这个存储库提供的惊人功能,而我不需要这个功能,否则就不需要在我的捆绑包中添加更多的KB。注意,react select通过各种输入和html元素的复杂系统处理select中的占位符。
在React中,对于受控组件,不能将所选属性添加到选项中。React通过select本身的value属性以及一个更改处理程序来处理select的状态,其中值应该与选项本身中的一个value属性匹配。
例如
<select value={this.state.selectValue} onChange={this.handleChange} required={true}>
{options}
</select>
既然将所选属性添加到其中一个选项中是不正确的,而且实际上会引发错误,那么该怎么办?
只要你想一想,答案很简单。既然我们希望我们的第一个选项被选中、禁用和隐藏,我们需要做三件事:
将隐藏和禁用的属性添加到第一个定义的选项。将第一个选项的值设置为空字符串。将select的值初始化为空字符串。
state = { selectValue = "" } // State or props or their equivalent
// In the render function
<select value={this.state.selectValue} onChange={this.handleChange} required={true}>
<option key="someKey" value="" disabled="disabled" hidden="hidden">Select from Below</option>
{renderOptions()}
</select>
现在,您可以按照上面的指示(或通过className,如果您愿意)设置选择的样式。
select:invalid { color: gray; }