2013-03-21 53 views
2

我有一个关于开发面向对象的JavaScript和解析变量的问题。有关更多信息,请参阅this blog by net.tutsplus - The Basics of Object-Oriented JavaScript面向对象的Javascript自定义addEvent方法

我有下面的代码创建一个事件:

$(document).ready(function() { 
    tools.addEvent('.someButton', 'click', user.getUserDetails); 
)}; 

var tools = { 
    addEvent: function(to, type, fn) { 
     $(to).live(type, fn); 
    } 
} 

var user = { 
    getUserDetails: function(userID) { 
     console.log(userID); 
    } 
} 

正如你可以看到,它调用addEvent方法有三个变量;要附加事件的DOM元素,事件的类型以及触发事件时要运行的函数。

我有被解析到getUserDetails方法的变量的问题,我知道的2种选择:

  1. 我明明已经在开始1行的代码,可以检查发件人的属性。例如,.someButton可能有一个属性userID="12345"。但是,这并不理想,因为该功能是从几个不同的地方运行的 - 这意味着此检查并不总是可用的(并且代码更难以管理)。

  2. 更好的选择可能是使用另一种方法,如user.willGetUserDetails,并使用此方法从DOM获取属性userID。这可以从页面上的任何位置运行,并在获得userID后调用getUserDetails。每当用户详细信息来自另一个功能时,我们只需直接拨打getUserDetails即可。

  3. 什么是理想的,如果我可以修改上面的代码直接传递一个变量 - 即使是一个未定义的变量。有谁知道这可以实现吗?

+1

如果你想“解析”一个变量,只需使用'JSON.stringify(变量);'。另外,不要使用'.live()',因为它从1.9版本中被移除了,因为它是1.9 – 2013-03-21 16:01:29

回答

4

向您的addEvent代码添加一个接受要传递给事件的数据的参数。

var tools = { 
    addEvent: function(to, type, data, fn) { 
     if ($.isFunction(data)) { 
      fn = data; 
      data = {}; 
     } 
     $(to).live(type, data, fn); 
    } 
} 

另外,我建议使用代理来替代,或者1.7+

var tools = { 
    addEvent: function(to, type, data, fn) { 
     if ($.isFunction(data)) { 
      fn = data; 
      data = {}; 
     } 
     $(document).delegate(to, type, data, fn); 
    } 
} 

var tools = { 
    addEvent: function(to, type, data, fn) { 
     if ($.isFunction(data)) { 
      fn = data; 
      data = {}; 
     } 
     $(document).on(type, to, data, fn); 
    } 
} 

现在。对,你可以使用它像这样:

$(document).ready(function() { 
    tools.addEvent('.someButton', 'click', {userID: theuserid}, user.getUserDetails); 
)}; 

var user = { 
    getUserDetails: function(event) { 
     console.log(event.data.userID); 
    } 
} 
+0

哇!梦幻般的回答,太快了。不用说,它可以按我的希望工作。谢谢 – Patrick 2013-03-21 16:10:40

+0

+1,因为它仍然被大量使用,并为未来的用户提供了非常有用的信息,因此为1.7版本添加了“委托”示例。 – Nope 2013-03-21 16:11:02

+0

@Patrick如果你不使用'.live'版本,那么添加一个可以用作上下文而不是'document'的参数也是一个好主意。 – 2013-03-21 17:09:18