2 CodeMirror
.defineOption("placeholder", "", function(cm
, val
, old
) {
3 var prev
= old
&& old
!= CodeMirror
.Init
;
5 cm
.on("focus", onFocus
);
7 cm
.on("change", onChange
);
9 } else if (!val
&& prev
) {
10 cm
.off("focus", onFocus
);
11 cm
.off("blur", onBlur
);
12 cm
.off("change", onChange
);
14 var wrapper
= cm
.getWrapperElement();
15 wrapper
.className
= wrapper
.className
.replace(" CodeMirror-empty", "");
18 if (val
&& !cm
.hasFocus()) onBlur(cm
);
21 function clearPlaceholder(cm
) {
22 if (cm
.state
.placeholder
) {
23 cm
.state
.placeholder
.parentNode
.removeChild(cm
.state
.placeholder
);
24 cm
.state
.placeholder
= null;
27 function setPlaceholder(cm
) {
29 var elt
= cm
.state
.placeholder
= document
.createElement("pre");
30 elt
.style
.cssText
= "height: 0; overflow: visible";
31 elt
.className
= "CodeMirror-placeholder";
32 elt
.appendChild(document
.createTextNode(cm
.getOption("placeholder")));
33 cm
.display
.lineSpace
.insertBefore(elt
, cm
.display
.lineSpace
.firstChild
);
36 function onFocus(cm
) {
40 if (isEmpty(cm
)) setPlaceholder(cm
);
42 function onChange(cm
) {
43 var wrapper
= cm
.getWrapperElement(), empty
= isEmpty(cm
);
44 wrapper
.className
= wrapper
.className
.replace(" CodeMirror-empty", "") + (empty
? " CodeMirror-empty" : "");
46 if (cm
.hasFocus()) return;
47 if (empty
) setPlaceholder(cm
);
48 else clearPlaceholder(cm
);
51 function isEmpty(cm
) {
52 return (cm
.lineCount() === 1) && (cm
.getLine(0) === "");