The previous approach is good, as long as your application logic is really simple, keep in mind that the solution is messing with the values ββof your view model, these values ββcan be observable and they can have associated subscriptions or calculations, so by changing the value you change the view model. Here is another solution without updating the View Model
ko.bindingHandlers.fakePlaceHolderWhenNeedIt = {
init: function (element, valueAccessor, allBindings, vm) {
if (!Modernizr.input.placeholder) {
var placeHolderVal = $(element).attr("placeholder");
if (placeHolderVal != null || placeHolderVal != '') {
var $element = $(element);
var value = valueAccessor()
var valueUnwrapped = ko.utils.unwrapObservable(value);
$element.keyup(function () {
var inputValue = $(this).val();
var $watermark = $(this).prev('.ie-placeholder');
if (inputValue == null || inputValue == '') {
$watermark.show();
}
else {
$watermark.hide();
}
});
var display = valueUnwrapped != null || valueUnwrapped != '' ? "block" : "none";
var left = $element.position().left;
var top = $element.position().top;
var paddingLeft = $element.css('padding-left');
var paddingRight = $element.css('padding-right');
var paddingTop = $element.css('padding-top');
var paddingBottom = $element.css('padding-bottom');
var height = $element.css('height');
var placeHolder = '<div class="ie-placeholder" style="position:absolute;left:' + left + ';top:' + top + ';padding-top: ' + paddingTop + ';padding-bottom: ' + paddingBottom + ';padding-left: ' + paddingLeft + ';padding-right: ' + paddingRight + ';height: ' + height + ';line-height:' + height + ';display:' + display + ';">' + placeHolderVal + '</div>';
$(placeHolder).click(function () { $element.focus(); }).insertBefore(element);
}
}
},
update: function (element, valueAccessor, allBindings, vm) {
if (!Modernizr.input.placeholder) {
var placeHolderVal = $(element).attr("placeholder");
if (placeHolderVal != null || placeHolderVal != '') {
var $element = $(element);
var value = valueAccessor()
var valueUnwrapped = ko.utils.unwrapObservable(value);
var $watermark = $element.prev('.ie-placeholder');
if (valueUnwrapped == null || valueUnwrapped == '') {
$watermark.show();
}
else {
$watermark.hide();
}
}
}
}
source
share