【问题标题】:replacing placeholder with jquery用 jquery 替换占位符
【发布时间】:2013-01-24 11:48:38
【问题描述】:

我正在为 placeholder 问题创建一个解决方案,以使其在仅使用 jquery 的每个浏览器中都能正常工作。

到目前为止,它的工作良好...... 这就是我已经走了多远

var formId = ["Name", "E-mail", "Subject", "Message"];
$.each(formId, function(i) {
    $("input, textarea").focus(function() {
        if ($(this).val() === formId[i])
            $(this).val("");
    }).focusout(function() {
        if ($(this).val() === "")
            $(this).val(formId[i]);
    });
});

它工作完美,直到焦点输出部分。当我关注输入字段时,它会在每个输入字段中使用Name 重新填充值。我尝试了不同的解决方案,但这是我得到的最接近的结果。有人知道吗?

【问题讨论】:

    标签: jquery forms placeholder


    【解决方案1】:

    这似乎不是解决这个问题的最佳方法。我之前在博客上看到过类似以下的解决方案。您将占位符属性添加到输入,因此它们将在现代浏览器上运行,并且您将 jQuery 添加到具有占位符属性的输入,例如 [placeholder]:

    $('[placeholder]').focus(function() {
      var input = $(this);
      if (input.val() == input.attr('placeholder')) {
        input.val('');
        input.removeClass('placeholder');
      }
    }).blur(function() {
      var input = $(this);
      if (input.val() == '' || input.val() == input.attr('placeholder')) {
        input.addClass('placeholder');
        input.val(input.attr('placeholder'));
      }
    }).blur();
    
    $('[placeholder]').parents('form').submit(function() {
      $(this).find('[placeholder]').each(function() {
        var input = $(this);
        if (input.val() == input.attr('placeholder')) {
          input.val('');
        }
      })
    });
    

    我现在找不到博客,很遗憾,因为我相信这段代码完全是从那个网站复制而来的,而且效果很好,可以跨浏览器使用。

    这是如何工作的,以及为什么这是一种更好的方法:

    您无需在每个输入和 textarea 元素上都放置处理程序,而是可以轻松准确地筛选出哪些应该有处理程序:那些有占位符属性的。

    .submit() 处理程序将阻止默认文本作为值发布。

    也许我应该谈谈我认为您的代码存在的问题:

    您正在使用 each 函数来调用多个非常相似的焦点处理程序。您可能不需要 each 功能。您可以只使用 $('input, textarea').focus() 因为这将为每个输入添加一个处理程序。然后,您可以检查是否$.inArray($(this).val(),formId)inArray() 的文档。

    【讨论】:

    • 这适用于一些模组!在 IE 中不起作用的一件事是 reset 按钮,我希望它也能正常工作。否则它会完美运行!
    • 为了让它在 IE 中工作并像在其他支持它的浏览器中一样使用占位符,我使用了if ($.browser.msie) { code-above }希望这对其他人有帮助!
    【解决方案2】:

    忘记var formId,而是在您的 input/textarea html 标记中添加一个属性 data-placeholder 并使用适当的值,然后:

     $("input, textarea").on({
        focus : function() {
          var $t=$(this);
          if ($t.val() ===$t.data("placeholder"))
            $t.val("");
        }, 
        blur : function() {
          var $t=$(this);
          if ($t.val() === "")
            $t.val($t.data("placeholder"));
        }
    });
    

    【讨论】:

    • 由于 OP 正在使用占位符,我认为这可以使用占位符属性而不是 data-default 来完成。
    • 这没什么区别!但我应该把数据占位符放在事实上;注意:你绑定事件的方式属于过去!
    • 这适用于所有浏览器,除了 ie 是重点......我可以使用占位符。 default-value 在 ie 中不起作用。
    猜你喜欢
    • 2012-12-09
    • 2017-09-11
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多