input点击后placeholder中的提示消息消失

html中,placeholder作为input的一个属性,起到了在输入框中占位并提示的作用。

但是有一些浏览器,如chrome,当鼠标点击输入框时,placeholder的值不消失,只有输入数据才消失,会使前端用户体验大打折扣。

看了很多大神的方法,写了长长的js,看着有点吃力,就想到了下面这种最傻的方法解决了这个问题。

html代码:

?
1
<input type= "text" placeholder= "多个关键词空格隔开" >

鼠标点击input时,placeholder中的提示信息消失:

?
1
<input type= "text" placeholder= "多个关键词空格隔开" onfocus= "this.placeholder=‘‘" onblur= "this.placeholder=‘多个关键词空格隔开‘" >

PlaceHolder的两种实现方式

placeholder属性是HTML5 中为input添加的。在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示。

?
1
<input type= "text" name= "loginName" placeholder= "邮箱/手机号/QQ号" >

目前浏览器的支持情况

然而,虽然IE10+支持placeholder属性,它的表现与其它浏览器也不一致
•IE10+里鼠标点击时(获取焦点)placeholder文本消失
•Firefox/Chrome/Safari点击不消失,而是键盘输入时文本消失

这相当恶心,如果使用了placeholder属性。产品经理还是不依不饶,会讲为什么IE里是点击的时候提示文本消失,Chrome里却是键盘输入的时候提示文本消失。要求前端工程师改成一样的表现形式。鉴于此,以下两种实现方式均不采用原生的placeholder属性。

两种方式的思路

1.(方式一)使用input的value作为显示文本

2.(方式二)不使用value,添加一个额外的标签(span)到body里然后绝对定位覆盖到input上面

两种方式各有优缺点,方式一占用了input的value属性,表单提交时需要额外做一些判断工作,方式二则使用了额外的标签。

方式一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* PlaceHolder组件
* $(input).placeholder({
* word: // @string 提示文本
* color: // @string 文本颜色
* evtType: // @string focus|keydown 触发placeholder的事件类型
* })
*
* NOTE:
* evtType默认是focus,即鼠标点击到输入域时默认文本消失,keydown则模拟HTML5 placeholder属性在Firefox/Chrome里的特征,光标定位到输入域后键盘输入时默认文本才消失。
* 此外,对于HTML5 placeholder属性,IE10+和Firefox/Chrome/Safari的表现形式也不一致,因此内部实现不采用原生placeholder属性
*/
$.fn.placeholder = function (option, callback) {
var settings = $.extend({
word: '' ,
color: '#ccc' ,
evtType: 'focus'
}, option)
function bootstrap($that) {
// some alias
var word = settings.word
var color = settings.color
var evtType = settings.evtType
// default
var defColor = $that.css( 'color' )
var defVal = $that.val()
if (defVal == '' || defVal == word) {
$that.css({color: color}).val(word)
} else {
$that.css({color: defColor})
}
function switchStatus(isDef) {
if (isDef) {
$that.val( '' ).css({color: defColor})
} else {
$that.val(word).css({color: color})
}
}
function asFocus() {
$that.bind(evtType, function () {
var txt = $that.val()
if (txt == word) {
switchStatus( true )
}
}).bind( 'blur' , function () {
var txt = $that.val()
if (txt == '' ) {
switchStatus( false )
}
})
}
function asKeydown() {
$that.bind( 'focus' , function () {
var elem = $that[0]
var val = $that.val()
if (val == word) {
setTimeout( function () {
// 光标定位到首位
$that.setCursorPosition({index: 0})
}, 10)
}
})
}
if (evtType == 'focus' ) {
asFocus()
} else if (evtType == 'keydown' ) {
asKeydown()
}
// keydown事件里处理placeholder
$that.keydown( function () {
var val = $that.val()
if (val == word) {
switchStatus( true )
}
}).keyup( function () {
var val = $that.val()
if (val == '' ) {
switchStatus( false )
$that.setCursorPosition({index: 0})
}
})
}
return this .each( function () {
var $elem = $( this )
bootstrap($elem)
if ($.isFunction(callback)) callback($elem)
})
}

方式二

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
$.fn.placeholder = function (option, callback) {
var settings = $.extend({
word: '' ,
color: '#999' ,
evtType: 'focus' ,
zIndex: 20,
diffPaddingLeft: 3
}, option)
function bootstrap($that) {
// some alias
var word = settings.word
var color = settings.color
var evtType = settings.evtType
var zIndex = settings.zIndex
var diffPaddingLeft = settings.diffPaddingLeft
// default css
var width = $that.outerWidth()
var height = $that.outerHeight()
var fontSize = $that.css( 'font-size' )
var fontFamily = $that.css( 'font-family' )
var paddingLeft = $that.css( 'padding-left' )
// process
paddingLeft = parseInt(paddingLeft, 10) + diffPaddingLeft
// redner
var $placeholder = $( '<span class="placeholder">' )
$placeholder.css({
position: 'absolute' ,
zIndex: '20' ,
color: color,
width: (width - paddingLeft) + 'px' ,
height: height + 'px' ,
fontSize: fontSize,
paddingLeft: paddingLeft + 'px' ,
fontFamily: fontFamily
}).text(word).hide()
// 位置调整
move()
// textarea 不加line-heihgt属性
if ($that.is( 'input' )) {
$placeholder.css({
lineHeight: height + 'px'
})
}
$placeholder.appendTo(document.body)
// 内容为空时才显示,比如刷新页面输入域已经填入了内容时
var val = $that.val()
if ( val == '' && $that.is( ':visible' ) ) {
$placeholder.show()
}
function hideAndFocus() {
$placeholder.hide()
$that[0].focus()
}
function move() {
var offset = $that.offset()
var top = offset.top
var left = offset.left
$placeholder.css({
top: top,
left: left
})
}
function asFocus() {
$placeholder.click( function () {
hideAndFocus()
// 盖住后无法触发input的click事件,需要模拟点击下
setTimeout( function (){
$that.click()
}, 100)
})
// IE有些bug,原本不用加此句
$that.click(hideAndFocus)
$that.blur( function () {
var txt = $that.val()
if (txt == '' ) {
$placeholder.show()
}
})
}
function asKeydown() {
$placeholder.click( function () {
$that[0].focus()
})
}
if (evtType == 'focus' ) {
asFocus()
} else if (evtType == 'keydown' ) {
asKeydown()
}
$that.keyup( function () {
var txt = $that.val()
if (txt == '' ) {
$placeholder.show()
} else {
$placeholder.hide()
}
})
// 窗口缩放时处理
$(window).resize( function () {
move()
})
// cache
$that.data( 'el' , $placeholder)
$that.data( 'move' , move)
}
return this .each( function () {
var $elem = $( this )
bootstrap($elem)
if ($.isFunction(callback)) callback($elem)
})
}

方式2 对于以下场景不适合

1. input初始隐藏

  此时无法取到input的offset,继而无法定位span到input上面。

2. 包含input的页面dom结构发生变化

  比如页面里删除了一些元素或添加了一些元素,导致input向上或向下偏移,而此时span则没有偏移(span相对body定位)。这比较恶心,可以考虑把span作为input的兄弟元素,即相对内层div定位(而不是body)。但这样必须强制给外层div添加position:relative,添加后可能会对页面布局产生一定影响。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: inputplaceholder位置是指在输入框显示的提示文本的位置。通常位于输入框内部,以灰色字体显示,用于提示用户输入该输入框所需的内容。当用户开始输入时,placeholder文本会自动消失,直到用户再次清空输入框时才会重新出现。 ### 回答2: 在网页设计placeholder是指在表单输入区域或搜索框出现的提示信息。它是一种文本占位符,通常用于帮助用户识别何种类型的信息应该输入到文本框placeholder在表单输入区域占据输入区域内部的一部分空间,它在用户输入信息时动态地消失或改变,以示用户应该输入哪些信息或填写哪些表单。 在页面设计placeholder的位置非常重要。正确使用占位符,可以帮助用户更好地理解他们应该输入何种信息,提高表单的易用性和用户体验。一般来说,占位符应该出现在输入区域的左侧或上方,它们可以使用文本和/或图像,并应该清晰明了地描述所需输入的信息类型。 其他一些重要提示包括: 1.占位符应该是短小精悍的,并且只描述需要的信息类型,不应太复杂。 2.占位符内容应该与输入区域的类型匹配,并且应该与表单的设计和主题相吻合。 3. 占位符应该在字段输入后立即消失,或者变成灰色扭曲的文本,以便用户能够区分它们和用户输入的文本。 4. 占位符应该适当使用,过度使用会影响用户体验,使用户误解其用途和功能。 在设计表单时,占位符位置的选择是至关重要的。正确地使用占位符,可以提高表单的易用性和用户体验,这对于网站或在线应用程序的成功和流行至关重要。 ### 回答3: placeholder是一个在input的占位符文本,通常用于描述输入内容的预期值或提示用户输入内容的格式。在输入字段的空白区域显示placeholder,它通常比输入内容小、灰色显示,因此不会被用户误认为真正的输入值。 placeholder通常是通过HTML标记的"placeholder"属性来添加。它在不同的浏览器的表现略有不同,但在大多数情况下都以灰色文本形式出现。当用户开始输入文本时,placeholder文本会自动消失placeholder文本的位置通常在输入字段内部的左上角或者心列位置。 在实际应用,我们需要考虑到placeholder的位置和充分利用它的功能。placeholder的位置要足够明显和易于寻找,但也不宜过大,以免它占用了过多的输入空间。对于熟练用户,placeholder可以给出更具体的提示,从而使他们的输入更加快速和准确。对于不太熟练的用户,也可以通过更直观和易于理解的文字和示例来帮助他们更好地完成输入。 总之,placeholder是一个非常有用的功能,可以让用户更加准确和高效地完成输入。通过合理地设置它的位置和样式,我们可以使应用程序更加用户友好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值