2013-03-18 9 views
0

我有插件,它有返回方向(如:顶部,左边..)哪一边你输入元素。问题是 - 插件在一些超时后执行的一个函数,所以当我调用插件 - 显然它返回我未定义。在没有回调函数的jQuery插件中延迟执行后返回结果?

;(function($){ 
    jQuery.fn.myplugin = function(options){ 

    var somefunction = function(){ 
     setTimeout(function(elem, e){ 
      return elem * e; // some action, no matter 
     }, 500)    // the important thing - it's executed after plugin returned undefined 
    } 

    return someFunction; 

    }; 
})(jQuery); 

有没有可能解决这个问题,而不使用回调函数,或者在这种情况下是必要的?

我想用户插件像

var direction = $('elem').myplugin(); 

但回调,这应该是

$('elem').myplugin({ 
    callback: function(direction){ 
     // so i got direction here 
    } 
}) 

看起来不那么漂亮了

+0

你真的想解决什么问题? Javascript不能做你想问的问题。 – jfriend00 2013-03-18 23:00:28

+0

我正在编写插件以确定您输入或离开元素的哪一侧(mouseenter,mouseleave事件)。并且在确定离开方向的函数中,我绑定一次到WINDOW鼠标移动事件,以获得光标坐标。看起来像这个绑定执行几毫秒后插件返回空结果。 我会用回调 – Denis 2013-03-18 23:10:18

回答

2

你的功能是异步的,所以你的代码完成不知道你的函数何时完成,不能等到函数执行结束。因此无法等待代码完成并返回结果。

为了避免回调函数的需求,您必须避免异步代码(避免setTimeout)。否则,你将需要一个回调函数

+0

搞定了,谢谢 – Denis 2013-03-18 22:57:24

2

你不能绕过使用回调函数,这是setTimeout和异步编程的性质。这是一件好事,如果它看起来不那么“漂亮”,不要被吓倒。

但在可爱的方式,没有必要定义回调插件调用:

// "driver" code 
$('elem').myplugin({ 
    callback: myApplicationCallback //or desired name 
}); 

// your application logic code 
function myApplicationCallback(direction) { 
    // do work 
} 

干净!

+0

好的,谢谢:) – Denis 2013-03-18 22:57:41