【发布时间】:2011-09-11 01:18:39
【问题描述】:
在这个对象内部,我有一个属性Response.action,它是用于同时触发jQuery 的.ready 和.resize 上的代码的简写。下面代码块中的注释演示了它的用法。 Response.action 适用于 .ready,但不适用于 .resize。谁能看到为什么和/或建议如何使它对两者都起作用?
window.Response = (function($, window, undefined) {
var Response = {}, // object
$window = $(window),
$document = $(document); // cache selectors
/*
Response.action()
This triggers code on .ready *and* .resize
usage:
Response.action( myactions );
function myactions() {
// do stuff
}
*/
action = function( code ) {
var code = ( code !== undefined ) ? wrap() : false; // apply wrap() if we have code
function wrap() {
$document.ready(function() {
$window.resize(function() {
code // input
}).resize(); // trigger resize handlers
}); // close .ready function
}
return code; // wrapped code fires on .ready and .resize
},
Response.action = action;
return Response; // return object
})(jQuery, window); // expose to global object
这是给responsejs.com的——完整的库(正在进行中)在那里。
我正在使用其他属性之一对其进行测试。 .band 属性本身是可靠的:
Response.action( myactions() );
function myactions() {
if ( Response.band(600) ) { $('header').html('600px or wider'); }
else { $('header').html('below 600px'); }
}
更新:可行:
Response.action = 函数 ( func ) { if ( typeof func !== 'function' ) { return false; }
$(function () {
func();
$window.resize( func );
}).resize();
return func;
};
使用这种用法语法:
Response.action( myactions );
function myactions() {
// do stuff
}
*请注意,在调用中它必须是 myactions 而不是 myactions()
【问题讨论】:
-
你缺少
var的“action”变量......而且不仅仅是“code”,它可能应该是“code()”。 -
@ryanve 当您不声明变量时(例如
action在您的情况下),它成为全局属性。你不想要那个。因此,在它前面放一个var。 -
@ryanve 不,你肯定需要
var来“行动”。目前,它是一个全局变量。稍后将“响应”对象上的属性设置为相同的值并不重要。 -
@ryanve 那是因为您使用了逗号运算符(这是我建议反对的另一件事)。我的建议:
var action = function () { ... }; // <-- semicolon here instead of comma然后Response.action = action; -
@ryanve 因为
myactions不返回任何内容,所以这个Response.action( myactions() );相当于这个myactions(); Response.action( undefined );。你可能想要这个Response.action( myactions );,对吧?
标签: javascript jquery oop object triggers