2012-07-13 83 views
0

我知道我可以轻松解决此问题,但我正在寻找这种情况下的最佳做法。这是一个简化版本http://jsbin.com/isered/3/edit。我正在尝试创建一个重用函数,但我需要它,以便在事件触发时(即单击锚标签),它只添加一次输出区域,而不是每次调用该函数时。Javascript - 多次调用函数,但只有一个效果

jQuery的/ JavaScript的

$(function() { 

    function foo() { 
     $('a').on('click', function() { 
     $('.asdf').append('poo'); 
    }); 
    } 

    foo(); 
    foo(); 
}); 

HTML

<a href='#'>hello</a> 
<a href='#'>world</a> 

<p class='asdf'></p> 
+0

一个工作演示很棒,但如果JSBin链接崩溃,这个问题没有有用的内容。你能否在问题中提供相关的代码? – 2012-07-13 00:14:52

回答

2

你可以unbind个结合他们之前的事件:

function foo() { 
    $('a').off('click').on('click', function() { 
     $('.asdf').append('poo');  
    }); 
} 

虽然我不明白为什么一旦调用该函数只有一次是不是最好的解决方案。

+0

我会给这个镜头。再次,这是一个比我所拥有的例子简单得多的例子。 – 2012-07-13 00:20:30

+0

这是最短的修复,所以我会给你。 – 2012-07-13 00:25:44

2

你可以让一个状态变量,在这种情况下类:

$(function() { 
    function foo() { 
    $('a:not(.clicked)').on('click', function() { 
     $(this).addClass('clicked'); 
     $('.asdf').append('poo'); 
    }); 
    } 

    foo(); 
    foo(); 
}); 
+0

我想通过切换一个类/变量来解决这个问题。我只给出了另一个答案,就是它的代码少了一点,但这肯定也会有效。谢谢! – 2012-07-13 00:28:10

+0

我很高兴你能做到。现在我知道如何做到这一点,没有类,以及;) – Blender 2012-07-13 00:28:59

0

Underscore.js already has this function.

那么,为什么重新发明轮子。

_.once(function)创建只能被调用一次的函数的一个版本。重复调用修改后的功能将不会产生 效果,从原始调用返回值。对于初始化函数 有用,而不必设置布尔标志并且 稍后再检查。

Example:

$(function() { 

    var foo = _.once(function() { 
    $('a').on('click', function() { 
     $('.asdf').append('poo');  
    }); 
    }); 

    foo(); 
    foo(); 
}); 
+1

你可以让字体变大吗? – Blender 2012-07-13 00:19:10

+0

尝试不添加其他库,如果我可以帮助它 – 2012-07-13 00:19:27

+0

@Blender - 不幸的是,这是一样大。 :) – 2012-07-13 00:20:12

1

我经常遇到这样的时候我想打一个容器只有一次,但处理后续点击的功能,其余为好。在这种情况下,我把支票容器的存在如下:

var foo = function(){ 
    $('a').on('click', function(ev){ 
     if (!$('.asdf .foo').length) { 
      $('.asdf').append('<div class="foo">'); 
     } 
     // do other click stuff here 
    }); 
}; 
0
$(function() { 
    function foo() { 
     $('a').on('click', function() { 
      var num = $('.asdf').text().length; 
      if (num == 0) { 
       $('.asdf').append('poopsicles'); 
      } 
     }); 
    } 

    foo(); 
    foo(); 
}); 

我想这个问题已经回答了,但在这里,雅去。

+0

感谢布兰登,我只是在阅读如何缩进四个空格让你的代码正确显示。 – kenecaswell 2012-07-13 00:42:32

+1

嘿没问题!这里有一个提示,可以帮助你在未来。您可以突出显示文本并按下顶部编辑栏中的代码格式化按钮,而不是繁琐地添加空格。它会为你进行缩进,当你试图成为第一个有答案的人时,它肯定会为你节省一大堆时间。 – 2012-07-13 00:52:15

+0

@BrandonBoone很高兴知道... @ kenecaswell很高兴别人拿起'poo'参考;) – 2012-07-13 01:06:30

相关问题