Heim >Web-Frontend >js-Tutorial >Die Eingabeaufforderungsmeldung im Platzhalter verschwindet, nachdem auf die Eingabe geklickt wurde_Javascript-Kenntnisse

Die Eingabeaufforderungsmeldung im Platzhalter verschwindet, nachdem auf die Eingabe geklickt wurde_Javascript-Kenntnisse

不言
不言Original
2018-05-28 15:23:293310Durchsuche

In HTML spielt der Platzhalter als Attribut der Eingabe die Rolle, einen Platz im Eingabefeld einzunehmen und Eingabeaufforderungen bereitzustellen.

In einigen Browsern wie Chrome verschwindet der Platzhalterwert jedoch nicht, wenn die Maus auf das Eingabefeld klickt. Er verschwindet nur, wenn die Daten eingegeben werden, was die Front-End-Benutzererfahrung erheblich beeinträchtigt .

Nachdem ich die Methoden vieler Experten gelesen und lange JS geschrieben hatte, war es etwas schwierig, also dachte ich mir die folgende dümmste Methode zur Lösung dieses Problems.

HTML-Code:

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

Wenn die Maus auf die Eingabe klickt, verschwindet die Eingabeaufforderung im Platzhalter:

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

Zwei Möglichkeiten, PlaceHolder zu implementieren

Das Platzhalterattribut ist Eingabe in HTML5 hinzugefügt. Geben Sie einen Platzhalter für die Eingabe an, der einen Hinweis (Hinweis) auf den erwarteten Wert des Eingabefelds in Textform anzeigt. Das Feld wird angezeigt, wenn die Eingabe leer ist.

Zum Beispiel

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

Aktuelle Browserunterstützung

Obwohl IE10 das Platzhalterattribut unterstützt, seine Leistung stimmt nicht mit der anderer Browser überein
•In IE10 verschwindet der Platzhaltertext, wenn mit der Maus geklickt wird (erhält den Fokus)
•Firefox/Chrome/Safari verschwindet nicht, wenn geklickt wird, aber der Text verschwindet, wenn die Tastatur eingegeben wird

Das ist ziemlich ekelhaft, wenn das Platzhalterattribut verwendet wird. Der Produktmanager gibt immer noch nicht auf und erklärt, warum der Eingabeaufforderungstext verschwindet, wenn er im IE darauf klickt, der Eingabeaufforderungstext jedoch verschwindet, wenn er in Chrome auf der Tastatur tippt. Bitten Sie den Front-End-Ingenieur, es in die gleiche Ausdrucksform zu ändern. Aus diesem Grund verwenden die folgenden beiden Implementierungen nicht das native Platzhalterattribut.

Zwei Denkweisen

1 (Methode 1) Verwenden Sie den Wert der Eingabe als Anzeigetext

2. Verwenden Sie keinen Wert, fügen Sie dem Körper ein zusätzliches Tag (Span) hinzu und bedecken Sie es dann mit der absoluten Positionierung auf der Eingabe.

Beide Methoden haben ihre eigenen Vor- und Nachteile. Methode eins belegt das Wertattribut von Die Eingabe, die beim Absenden des Formulars erforderlich ist, verwendet die zweite Methode, um zusätzliche Beurteilungsarbeit zu leisten.

Methode 1

/**
* 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: &#39;&#39;,
color: &#39;#ccc&#39;,
evtType: &#39;focus&#39;
}, option)
function bootstrap($that) {
// some alias 
var word = settings.word
var color = settings.color
var evtType = settings.evtType
// default
var defColor = $that.css(&#39;color&#39;)
var defVal = $that.val()
if (defVal == &#39;&#39; || defVal == word) {
$that.css({color: color}).val(word)
} else {
$that.css({color: defColor})
}
function switchStatus(isDef) {
if (isDef) {
$that.val(&#39;&#39;).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(&#39;blur&#39;, function() {
var txt = $that.val()
if (txt == &#39;&#39;) {
switchStatus(false)
}
})
}
function asKeydown() {
$that.bind(&#39;focus&#39;, function() {
var elem = $that[0]
var val = $that.val()
if (val == word) {
setTimeout(function() {
// 光标定位到首位
$that.setCursorPosition({index: 0})
}, 10) 
}
})
}
if (evtType == &#39;focus&#39;) {
asFocus()
} else if (evtType == &#39;keydown&#39;) {
asKeydown()
}
// keydown事件里处理placeholder
$that.keydown(function() {
var val = $that.val()
if (val == word) {
switchStatus(true)
}
}).keyup(function() {
var val = $that.val()
if (val == &#39;&#39;) {
switchStatus(false)
$that.setCursorPosition({index: 0})
}
})
}
return this.each(function() {
var $elem = $(this)
bootstrap($elem)
if ($.isFunction(callback)) callback($elem)
})
}

Methode 2

$.fn.placeholder = function(option, callback) {
var settings = $.extend({
word: &#39;&#39;,
color: &#39;#999&#39;,
evtType: &#39;focus&#39;,
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(&#39;font-size&#39;)
var fontFamily = $that.css(&#39;font-family&#39;)
var paddingLeft = $that.css(&#39;padding-left&#39;)
// process
paddingLeft = parseInt(paddingLeft, 10) + diffPaddingLeft
// redner 
var $placeholder = $(&#39;&#39;)
$placeholder.css({
position: &#39;absolute&#39;,
zIndex: &#39;20&#39;,
color: color,
width: (width - paddingLeft) + &#39;px&#39;,
height: height + &#39;px&#39;,
fontSize: fontSize,
paddingLeft: paddingLeft + &#39;px&#39;,
fontFamily: fontFamily
}).text(word).hide()
// 位置调整 
move()
// textarea 不加line-heihgt属性
if ($that.is(&#39;input&#39;)) {
$placeholder.css({
lineHeight: height + &#39;px&#39;
})
}
$placeholder.appendTo(document.body)
// 内容为空时才显示,比如刷新页面输入域已经填入了内容时
var val = $that.val()
if ( val == &#39;&#39; && $that.is(&#39;:visible&#39;) ) {
$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 == &#39;&#39;) {
$placeholder.show()
}
})
}
function asKeydown() {
$placeholder.click(function() {
$that[0].focus()
})
}
if (evtType == &#39;focus&#39;) {
asFocus()
} else if (evtType == &#39;keydown&#39;) {
asKeydown()
}
$that.keyup(function() {
var txt = $that.val()
if (txt == &#39;&#39;) {
$placeholder.show()
} else {
$placeholder.hide()
}
})
// 窗口缩放时处理
$(window).resize(function() {
move()
})
// cache
$that.data(&#39;el&#39;, $placeholder)
$that.data(&#39;move&#39;, move)
}
return this.each(function() {
var $elem = $(this)
bootstrap($elem)
if ($.isFunction(callback)) callback($elem)
})
}

Methode 2 ist für die folgenden Szenarien nicht geeignet

Anfängliches Ausblenden der Eingabe

Zu diesem Zeitpunkt kann der Offset der Eingabe nicht ermittelt werden und die Spanne kann nicht auf der Eingabe positioniert werden.

2. Die Dom-Struktur der Seite, die die Eingabe enthält, ändert sich

Beispielsweise werden einige Elemente gelöscht oder zur Seite hinzugefügt, wodurch sich die Eingabe nach oben verschiebt oder Zu diesem Zeitpunkt weist die Spannweite keinen Versatz auf (Spannweite ist relativ zum Körper positioniert). Das ist widerlich. Sie können in Betracht ziehen, span als Geschwisterelement der Eingabe zu verwenden, das heißt relativ zum inneren p (anstelle von body) zu positionieren. Dies muss jedoch das Hinzufügen von position:relative zum äußeren p erzwingen, was einen gewissen Einfluss auf das Seitenlayout haben kann.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn