【问题标题】:text input watermark using custom bindingHandler使用自定义 bindingHandler 的文本输入水印
【发布时间】:2013-04-12 03:37:59
【问题描述】:

我一直在尝试创建一个自定义 bindingHandler,我可以使用它来为文本输入字段提供水印行为。

watermark 我的意思是:为文本字段添加默认值,这些字段在焦点上移除,如果文本字段仍然为空,则在模糊时替换

我已经设法让它像这个 jsfiddle 中所展示的那样工作:http://jsfiddle.net/rpallas/nvxuw/

我对此解决方案有 3 个问题:

  1. 有什么办法可以改变它,让我只需要声明一次水印值吗?目前我必须把它放在我声明绑定的地方,我还必须用viewModel 中的值相同 - 否则它将没有初始值。
  2. 有没有更好的方法来获取元素值绑定到的底层可观察对象。我目前正在使用 allBindingsAccessor 来获取它,但这对我来说感觉不对。最初我只是使用 jquery $(element).val('') 设置值,但这也感觉不对。哪个最好,或者有更好的方法吗?
  3. 有没有人知道或知道这个问题的现有解决方案?我是在重新发明轮子吗?

【问题讨论】:

    标签: knockout.js watermark


    【解决方案1】:

    我认为你使用 allbindings 是不必要的。事实上,我认为水印根本不需要知道可观察对象,因为这就是水印通常所做的事情,即placeholder 属性。

    这对你有用吗?

    ko.bindingHandlers.watermark = {
        init: function (element, valueAccessor, allBindingsAccessor) {
            var value = valueAccessor(), allBindings = allBindingsAccessor();
            var defaultWatermark = ko.utils.unwrapObservable(value);
            var $element = $(element);
    
            setTimeout(function() {
                $element.val(defaultWatermark);}, 0);
    
            $element.focus(
                function () {
                    if ($element.val() === defaultWatermark) {
                        $element.val("");
                    }
                }).blur(function () {
                    if ($element.val() === '') {
                        $element.val(defaultWatermark)
                    }
                });
        }
    };
    

    http://jsfiddle.net/madcapnmckay/Q5yME/1/

    希望这会有所帮助。

    【讨论】:

    • 是的,这几乎正是我在将其更改为使用 allBindingsAccessor 之前所拥有的。我在尝试设置初始值时错过了setTimeout。您能否简要解释一下为什么需要这样做?另外,不知道有没有更好的方法?还是您认为这是一个好(足够)的方式(就整个解决方案而言)?例如,我注意到有一个 hasfocus 绑定(内置)。这会是更好的方法吗?
    • 如果您想支持旧版浏览器,我认为这种方法很好。对于新的,只需使用占位符属性。需要 setTimeout 是因为 KO 在设置输入值之前在内部使用了 setTimeout。这意味着您的代码在 KO 代码设置值之前运行,因此您需要 setTimeout 再次确保您的代码在执行中最后。
    • 非常感谢您的解释和帮助。
    • 哇。我没想到会找到一个完整的解决方案。谢谢!
    • 关于 setTimeout 非常有趣,直到现在我才意识到这是必需的。谢谢。
    【解决方案2】:

    只要您的应用程序逻辑非常简单,前面的方法就可以了,请注意解决方案会弄乱您的视图模型的值,这些值可以是可观察的,并且它们可以具有与之关联的订阅或计算,因此更改您更改视图模型的值。这是一个不同的解决方案,无需更新您的视图模型

    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();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多