/*!
* copyright c by zhangxinxu 2012-02-06
* jquery.placeholder.js placeholder属性模拟插件
* v1.0 2012-02-06 create
* v1.2 2012-12-20 兼容IE10下IE6-IE7,同时jQuery1.4.*版本
* v1.3 2013-06-14 label元素margin/padding无效问题
*/
(function($, undefined) {
$.fn.placeholder = function(options) {
var defaults = {
labelMode: false,
labelStyle: {},
labelAlpha: false,
labelAcross: false
};
var params = $.extend({}, defaults, options || {});
//方法
var funLabelAlpha = function(elementEditable, elementCreateLabel) {
if (elementEditable.val() === "") {
elementCreateLabel.css("opacity", 0.4).html(elementEditable.data("placeholder"));
} else {
elementCreateLabel.html("");
}
}, funPlaceholder = function(ele) {
// 为了向下兼容jQuery 1.4
if (document.querySelector) {
return $(ele).attr("placeholder");
} else {
// IE6, 7
var ret;
ret = ele.getAttributeNode("placeholder");
// Return undefined if nodeValue is empty string
return ret && ret.nodeValue !== "" ? ret.nodeValue : undefined;
}
};
$(this).each(function() {
var element = $(this), isPlaceholder = "placeholder" in document.createElement("input"), placeholder = funPlaceholder(this);
// 三种情况打酱油
// ① 没有placeholder属性值
// ② value模拟,同时是支持placeholder属性的浏览器
// ③ label模拟,但是无需跨浏览器兼容,同时是支持placeholder属性的浏览器
if (!placeholder || (!params.labelMode && isPlaceholder) || (params.labelMode && !params.labelAcross && isPlaceholder)) { return; }
// 存储,因为有时会清除placeholder属性
element.data("placeholder", placeholder);
// label模拟
if (params.labelMode) {
var idElement = element.attr("id"), elementLabel = null;
if (!idElement) {
idElement = "placeholder" + Math.random();
element.attr("id", idElement);
}
// 状态初始化
elementLabel = $('<label for="'+ idElement +'"></label>').css($.extend({
lineHeight: "1.3",
position: "absolute",
color: "graytext",
cursor: "text",
marginLeft: element.css("marginLeft"),
marginTop: element.css("marginTop"),
paddingLeft: element.css("paddingLeft"),
paddingTop: element.css("paddingTop")
}, params.labelStyle)).insertBefore(element);
// 事件绑定
if (params.labelAlpha) {
// 如果是为空focus透明度改变交互
element.bind({
"focus": function() {
funLabelAlpha($(this), elementLabel);
},
"input": function() {
funLabelAlpha($(this), elementLabel);
},
"blur": function() {
if (this.value === "") {
elementLabel.css("opacity", 1).html(placeholder);
}
}
});
//IE6~8不支持oninput事件,需要另行绑定
if (!window.screenX) {
element.get(0).onpropertychange = function(event) {
event = event || window.event;
if (event.propertyName == "value") {
funLabelAlpha(element, elementLabel);
};
}
}
// 右键事件
elementLabel.get(0).oncontextmenu = function() {
element.trigger("focus");
return false;
}
} else {
//如果是单纯的value交互
element.bind({
"focus": function() {
elementLabel.html("");
},
"blur": function() {
if ($(this).val() === "") {
elementLabel.html(placeholder);
}
}
});
}
// 内容初始化
if (params.labelAcross) {
element.removeAttr("placeholder");
}
if (element.val() === "") {
elementLabel.html(placeholder);
}
} else {
// value模拟
element.bind({
"focus": function() {
if ($(this).val() === placeholder) {
$(this).val("");
}
$(this).css("color", "");
},
"blur": function() {
if ($(this).val() === "") {
$(this).val(placeholder).css("color", "graytext");
}
}
});
// 初始化
if (element.val() === "") {
element.val(placeholder).css("color", "graytext");
}
}
});
return $(this);
};
})(jQuery);
HTML代码:
<p>
<label for="test1">测试1:</label>
<input type="text" id="test1" placeholder="这是value模拟" size="26" />
</p>
<p>
<label for="test2">测试2:</label>
<input type="text" id="test2" placeholder="这是label普通模拟" size="26" />
</p>
<p>
测试3:
<input type="text" class="test3" placeholder="这是label透明度交互模拟" size="26" />
</p>
<p>
<label for="test4">测试4:</label>
<input type="text" id="test4" placeholder="这是跨浏览器透明度交互模拟" size="26" />
</p>
<p>
<label for="test5">测试5:</label>
<input id="test5" type="text" placeholder="label元素藏于文本框之下" size="26" />
</p>
JS代码:
$(function() {
$("#test1").placeholder();
$("#test2").placeholder({
labelMode: true
});
$("#test3").placeholder({
labelMode: true,
labelAlpha: true
});
$("#test4").placeholder({
labelMode: true,
labelAlpha: true,
labelAcross: true
});
$("#test5").placeholder({
labelMode: true,
labelStyle: {
margin: "5px 0 0 6px",
fontSize: "14px"
},
labelAlpha: true,
labelAcross: true
});
});
关注我
我的微信公众号:前端开发博客,在后台回复以下关键字可以获取资源。
-
回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
-
回复「Vue脑图」获取 Vue 相关脑图
-
回复「思维图」获取 JavaScript 相关思维图
-
回复「简历」获取简历制作建议
-
回复「简历模板」获取精选的简历模板
-
回复「加群」进入500人前端精英群
-
回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
-
回复「知识点」下载高清JavaScript知识点图谱
每日分享有用的前端开发知识,加我微信:caibaojian89 交流