使用.attr()设置函数时函数未定义

时间:2014-05-26 13:00:47

标签: jquery

我在以下情况下没有定义onpaste处理程序:

<div class="inp email" contenteditable="plaintext-only"/></div>
<div class="inp passw" contenteditable="plaintext-only"/></div>

<script>
    $(function(){
        function handler(_this,e){
            alert('paste');
            }
        $('.inp').each(i,v){
            $(this).attr({'onpaste':'handler(this,e)'});
            });
    });
</script>

为什么我在将函数添加到div之前声明函数?

编辑:我正在使用jquery 1.8.3我不想看到替代方法我更关心为什么我会定义,粘贴事件并不重要,请不要&# 39; t错过我的问题(粗体)

4 个答案:

答案 0 :(得分:4)

为什么不以正确的方式开始

$(function(){
    $('.inp').on('paste', function(e) {
        alert('paste');
    });
});

答案 1 :(得分:3)

您可以将.on()与粘贴事件一起使用,而不是将事件添加为如下属性:

$('.inp').on('paste',function(e){
    alert('paste');
});

答案 2 :(得分:0)

您在ready事件处理程序的本地范围内声明了该函数,但是当事件发生时,代码在全局范围内运行,并且该函数在那里不可见。

如果在全局范围内声明该函数,可以找到它:

function handler(_this,e){
  alert('paste');
}

$(function(){
  $('.inp').each(i,v){
    $(this).attr({'onpaste':'handler(this,e)'});
  });
});

答案 3 :(得分:0)

你至少有三个问题:

  1. 范围。处理程序位于ready事件处理程序范围中,您需要将其取出到全局范围。这也得到了其他人的回答。
  2. 您无法通过e此处。
  3. .each的语法为.each(function (index, element)...
  4. 因此,为了实际工作(出于任何奇怪的原因),您的代码应该是:

    function handler(_this) {
        alert('paste');
    }
    
    $(function () {
        $('.inp').each(function (i, v) {
            $(this).attr({
                'onpaste': 'handler(this)'
            });
        });
    });
    

    演示:http://jsfiddle.net/abhitalks/AFZN4/1/