placeHolder随想
10086 ワード
html 5のplaceholderプロパティ機能は使いやすく、フォーム要素にtipを追加することができます.通常は以前はjsを使っていましたが、今では一部のブラウザがjsの悩みから抜け出しています.
例:
上にはdemoがあり、この属性をサポートするブラウザでchromeのような効果が見られますが、ieシリーズは全滅し、IE 9にもなります.
では、このプロパティをサポートしていないブラウザではどのように実現しますか?
Googleが出した多くのチュートリアルは簡単なjsを使っています.
もちろんこれはjqueyに基づいています.原理は大体:
1、初期化時にplaceholder属性の値をvalueに記入する
2、focus時にvalueの値を削除
3、blurの場合記入した値が空であればplaceholderの値を記入する
しかし、このような処理にはいくつかの問題があります.
1、初期化時にフォームがデフォルト値で上書きされる場合
2、フォーム提出はplaceholderの値を提出する
3、reset時に処理しなかった
labelを使用してより良い方法で実現することができます.
もちろんhtml 5との互換性を保つためには、外部のlabelとdivはjsを使用して動的に作成する必要があります.
kissy実装:
reset処理はできないようです.の汗.
例:
<input type="text" placeholder=" tip" />
上にはdemoがあり、この属性をサポートするブラウザでchromeのような効果が見られますが、ieシリーズは全滅し、IE 9にもなります.
では、このプロパティをサポートしていないブラウザではどのように実現しますか?
Googleが出した多くのチュートリアルは簡単なjsを使っています.
placeholder : function(placeholderClassName, attributeName) {
$("input").each(function() {
var $this = $(this);
if ($this.attr(attributeName) != undefined) {
// deactivate placeholder
$this.focus(function() {
if ($this.val() == $this.attr(attributeName)) {
$this.removeClass(placeholderClassName);
$this.val("");
}
});
// activate placeholder
$this.blur(function() {
if ($this.val() == "") {
$this.addClass(placeholderClassName);
$this.val($this.attr(attributeName));
}
});
// initialize placeholder
$this.blur();
}
});
}
もちろんこれはjqueyに基づいています.原理は大体:
1、初期化時にplaceholder属性の値をvalueに記入する
2、focus時にvalueの値を削除
3、blurの場合記入した値が空であればplaceholderの値を記入する
しかし、このような処理にはいくつかの問題があります.
1、初期化時にフォームがデフォルト値で上書きされる場合
2、フォーム提出はplaceholderの値を提出する
3、reset時に処理しなかった
labelを使用してより良い方法で実現することができます.
<div style="position: relative;" class="placeholder">
<label> , </label>
<textarea id="guestbook" name="guestbook" placeholder=" , "></textarea>
</div>
もちろんhtml 5との互換性を保つためには、外部のlabelとdivはjsを使用して動的に作成する必要があります.
kissy実装:
KISSY.add('util/placeholder', function(S) {
var D = S.DOM, E = S.Event;
/**
* config{
* el:{HtmlElement}
* wrap: {Boolean} default true
* }
*
* :
* 1、html5 placeholder
* 2、
*/
function placeholder(el, cfg) {
var isSupport = "placeholder" in document.createElement("input"),
self = this;
// html5 placeHolder
if(isSupport) return;
var defaultCfg = {
wrap:true
};
if(self instanceof placeholder) {
var config = S.merge(defaultCfg, cfg);
self._init(el, config);
} else {
return new placeholder(el, cfg);
}
}
S.augment(placeholder, {
_init:function(target, cfg) {
var self = this;
if(!target) {
S.log('[placeholder] has no target to decorate');
}
target = S.one(target);
var placeHolderTip = target.attr('placeholder');
if(!placeHolderTip) return;
self._decorate = function() {
// label
var triggerLabel = self.triggerLabel = D.create(S.substitute('<label style="display: none">{tip}</label>', {
tip:placeHolderTip
}));
if(target.attr('id')) {
D.attr(triggerLabel, 'for', target.attr('id'));
} else {
S.one(triggerLabel).on('click', function() {
target[0].focus();
});
}
//create parent
if(cfg.wrap) {
var targetBox = D.create('<div class="placeholder" style="position: relative"></div>');
S.one(targetBox).appendTo(target.parent()).append(target);
}
//insertbefore target
D.insertBefore(triggerLabel, target);
//judge value && init form reset
S.later(function() {
if(!target.val()) {
D.show(triggerLabel);
}
}, 100);
};
target.on('focus', function(ev) {
D.hide(self.triggerLabel);
});
target.on('blur', function(ev) {
if(!target.val()) {
D.show(self.triggerLabel);
}
});
self._decorate();
},
/**
* tip
* @param newTip
*/
text:function(newTip) {
D.text(this.triggerLabel, newTip);
}
});
//1.1.6 support
S.namespace("Util");
S.Util.placeholder = placeholder;
return placeholder;
});
reset処理はできないようです.の汗.