我正在尝试编写一个小函数来placeholder
稍微“伪造”HTML5 属性的行为。我知道已经有插件可以做到这一点,但我想自己编写它,因为我真的想在 jQuery 上做得更好。
到目前为止,这是我认为应该发生的事情。如果您发现任何不必要的东西,请告诉我。
- 在函数调用时,它会在 DOM 中搜索给定的表单,并将 CSS 类添加到任何输入字段/文本区域,省略
input[type="submit"]
和<button>
. - 如果有值,则将该值与输入/文本区域的 ID 一起放入数组或对象中,例如
#myInputID => initial value
. - 在焦点上,CSS 类被移除,并检查当前值是否存在于数组/对象中。如果找到该值,则将其删除,以便 input/textarea 为空。如果未找到,则不会发生任何事情,并且该值保持不变。
- 模糊时检查该字段是否为空或是否在数组/对象中找到当前值。如果找到或输入的/textarea 的值为空,则重新放置来自对象/数组的初始值,并重新添加 CSS 类。如果在数组或对象中找不到值,则该值将保留并且不会重新添加 CSS 类。
在可能如下所示的代码中:
function placeholder( element ) {
var values = [];
console.log( values );
$( element ).find( ":input" ).each( function() {
var $this = $( this );
// adding CSS class
$this.addClass( "light" );
if( $this.val() ){
// adding value to array
// the key is missing, maybe add an id to the elements?
values.push( $this.val() );
}
$this.focus( function(){
// remove CSS class
$this.removeClass( "light" );
// if value is in array
var i = $.inArray( $this.val() , values );
if( i != -1 ) {
$this.val( "" );
}
})// focus
$this.blur(function(){
// setting value to inital value if needed
// add CSS class
var i = $.inArray( $this.val() , values );
if( i == -1 ) {
$this.val( "initalValue" );
$this.addClass( "light" );
}
})// blur
}) // each
} // function
placeholder( "form" );
当然它还没有完成,还有几个问题(它甚至不工作......),但我无法自己解决。这些是我的主要问题:
- 我应该使用数组还是对象(哈希图?)来保存键 => 值对?我发现对此有不同的看法,即使在 SO 上也是如此。以及如何比较这些值?如何在这样的数组/对象中推送值?
- 在某些时候,缓存是个好主意
$this.val()
。最好的地方是什么? - 代码有任何主要的性能问题吗?
- 当触发模糊事件时,如果用户没有输入任何内容,则需要将值重置为其初始值。这不起作用,因为我的数组中没有任何键来识别元素。
这是一个用于快速测试的小提琴:小提琴