【问题标题】:rewrite function using jQuery .delegate()使用 jQuery .delegate() 重写函数
【发布时间】:2013-01-19 08:07:42
【问题描述】:

我有this working code,它为尚未拥有它的浏览器添加了占位符功能:

$(document).ready(function() {

    //show placeholder text when browser doesn't support placeholder attribute
    if(!Modernizr.input.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('');
            }
          });
        });

    }
});

问题是如果我用占位符动态添加字段,上面的代码不会显示它们。 FF 显示新的占位符,但 IE 不显示。我的理解是,如果我希望 jQuery 监视当前和未来的 DOM 元素,我需要使用 .delegate()。所以我尝试如下重写我的函数。这是jsFiddle。不幸的是,新版本既不作用于现有的也不是动态添加的占位符。我做错了什么?

$(document).ready(function() {

    if(!Modernizr.input.placeholder){
        $('form').delegate('[placeholder]','focus',function() {
          var input = $(this);
          if (input.val() == input.attr('placeholder')) {
            input.val('');
            input.removeClass('placeholder');
          }
        }).delegate('[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('');
            }
          });
        });

    }
});

【问题讨论】:

  • 除了使用并非所有浏览器都支持的弃用功能或使用setInterval 之外,没有其他方法可以有效地跟踪向页面添加新元素的时间。我建议将这段代码抽象为一个函数,并在将新元素添加到页面时在目标元素而不是[placeholder] 上运行它。 .delegate 在这种情况下不会帮助你。
  • @KevinB:这是一个简单的解决方案!我不清楚为什么没有办法有效地跟踪新元素。是不是因为标准是属性而不是元素?
  • DOMMutationEvents 的最大问题是它们的效率非常低,并且可能会导致性能问题,因为它触发的事件比您通常需要的多得多。检查新元素是否存在的 setInterval 稍微好一点,但仍然需要在每次迭代时运行$(),这是一个很大的浪费。解决这个问题最有效的方法是在添加新元素时自己运行代码。

标签: jquery modernizr


【解决方案1】:

您是否尝试过使用 .on() 事件http://api.jquery.com/on/?如果您从“直接和委托事件”向下阅读,它会解释它是如何工作的。我认为它应该可以解决您的问题。在使用把手等无逻辑模板时,我将它用于类似的问题。

【讨论】:

    【解决方案2】:
    $(document).ready(function() {
    
        if(!Modernizr.input.placeholder){
            $('form').on('focus', '[placeholder]',function() {
              var input = $(this);
              if (input.val() == input.attr('placeholder')) {
                input.val('');
                input.removeClass('placeholder');
              }
            }).on('blur', '[placeholder]', 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('');
                }
              });
            });
    
        }
    });
    

    【讨论】:

    • 正如您在这个 jsFiddle (jsfiddle.net/tyTTF/1) 中看到的,.on 也不起作用。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多