-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathjquery.inline-labels.js
135 lines (107 loc) · 3.14 KB
/
jquery.inline-labels.js
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//= require <jquery>
/*!
* Cross-browser Inline Labels Plugin for jQuery
*
* Copyright (c) 2010 Mark Dodwell (@madeofcode)
* Licensed under the MIT license
*
* Requires: jQuery v1.3.2
* Version: 0.1.0
*/
(function($) {
//
// Helpers
//
// is an input blank
$.fn.isEmpty = function() {
return $(this)[0].value === '';
};
// is an input present
$.fn.isPresent = function() {
return !$(this).isEmpty();
};
// return element for label
$.fn.element = function() {
return $('#' + $(this).attr('for'));
};
// return top/left offset for element
$.fn.innerOffset = function() {
var el = $(this);
// TODO check for nil?
var topOffset =
parseInt(el.css('marginTop')) +
parseInt(el.css('paddingTop')) +
parseInt(el.css('borderTopWidth'));
// TODO check for nil?
var leftOffset =
parseInt(el.css('marginLeft')) +
parseInt(el.css('paddingLeft')) +
parseInt(el.css('borderLeftWidth'));
return { top: topOffset, left: leftOffset };
};
// setup
$(function() {
var labels = $('label.inline');
// set as supported
labels.addClass('supported')
// delegate mousedown to input
.mousedown(function(e) {
$(this).element()[0].focus();
e.stopPropagation();
e.preventDefault();
})
.each(function() {
var label = $(this);
var el = label.element();
// calc offset
var leftOffset = el[0].tagName == "TEXTAREA" ? 0 : 2;
// adopt styling of inputs
label.css({
fontSize: el.css('fontSize'),
fontFamily: el.css('fontFamily'),
fontWeight: el.css('fontWeight'),
lineHeight: el.css('lineHeight'),
letterSpacing: el.css('letterSpacing'),
top: el.position().top + el.innerOffset().top,
left: el.position().left + el.innerOffset().left + leftOffset,
width: el.width() - leftOffset
});
// set input as having inline label
el.addClass('field_with_inline_label').data('inline.label', label);
// show input if empty
if (el.isEmpty()) label.addClass("empty");
});
// elm behaviours
$(".field_with_inline_label")
// focus behaviours
.focus(function() {
var el = $(this);
var label = el.data('inline.label');
// focus label
label.addClass("focus");
// clear existing timer (maybe don't need this?)
var timer = el.data('inline.timer');
window.clearInterval(timer);
el.data('inline.timer', null);
// set timer
el.data('inline.timer', window.setInterval(function() {
if (el.isPresent()) label.removeClass('empty');
}, 25));
})
// blur behaviours
.blur(function() {
var el = $(this);
var label = el.data('inline.label');
// unfocus label
label.removeClass("focus");
// cancel timer
var timer = el.data('inline.timer');
window.clearInterval(timer);
el.data('inline.timer', null);
// show label on blur if field empty
if (el.isEmpty()) label.addClass("empty");
});
// ready! show labels
$('label.inline').show();
});
})(jQuery);