在尝试让我的Javascript不引人注目时,我正在使用onLoad
来向<input>
等添加功能。使用Dojo,这看起来像:
var coolInput = dojo.byId('cool_input');
if(coolInput) {
dojo.addOnLoad(function() {
coolInput.onkeyup = function() { ... };
});
}
或者,大致相当于:
dojo.addOnLoad(function() {
dojo.forEach(dojo.query('#cool_input'), function(elt) {
elt.onkeyup = function() { ... };
});
});
是否有人编写过Ruby andand的实现,以便我可以执行以下操作?
dojo.addOnLoad(function() {
// the input's onkeyup is set iff the input exists
dojo.byId('cool_input').andand().onkeyup = function() { ... };
});
或
dojo.byId('cool_input').andand(function(elt) {
// this function gets called with elt = the input iff it exists
dojo.addOnLoad(function() {
elt.onkeyup = function() { ... };
});
});
答案 0 :(得分:3)
我不知道Dojo,但不应该读你的第一个例子
dojo.addOnLoad(function() {
var coolInput = dojo.byId('cool_input');
if(coolInput)
coolInput.onkeyup = function() { ... };
});
否则,您可能最终会在构建DOM之前尝试访问该元素。
回到你的问题:在JavaScript中,我将andand()
实现为
function andand(obj, func, args) {
return obj && func.apply(obj, args || []);
}
然后您的示例可以写成
dojo.addOnLoad(function() {
andand(dojo.byId('cool_input'), function() {
this.onkeyup = function() { ... };
});
});
并不比使用显式if
语句短得多 - 所以为什么要这么麻烦?
答案 1 :(得分:2)
JavaScript中无法使用您想要的确切语法。 JavaScript执行的方式需要以非常基本的方式进行更改。例如:
var name = getUserById(id).andand().name;
// ^
// |-------------------------------
// if getUserById returns null, execution MUST stop here |
// otherwise, you'll get a "null is not an object" exception
然而,JavaScript并不是那样的。它根本就没有。
以下几行几乎完全符合您的要求。
var name = (var user = getUserById(id)) ? user.name : null;
但是可读性不会扩展到更大的例子。例如:
// this is what you want to see
var initial = getUserById(id).andand().name.andand()[0];
// this is the best that JavaScript can do
var initial = (var name = (var user = getUserById(id)) ? user.name : null) ? name[0] : null;
这些不必要的变量有副作用。我使用这些变量来避免双重查找。变量正在破坏上下文,如果这是一个大问题,你可以使用匿名函数:
var name = (function() {return (var user = getUserById(id)) ? user.name : null;})();
现在,用户变量已正确清理,每个人都很高兴。但是哇!什么打字! :)
答案 2 :(得分:2)
你想要dojo.behavior。
dojo.behavior.add({
'#cool_input': {
onKeyUp: function(evt) { ... }
}
});
答案 3 :(得分:1)
这样的事情怎么样:
function andand(elt, f) {
if (elt)
return f(elt);
return null;
}
这样打电话:
andand(dojo.byId('cool_input'), function(elt) {
// this function gets called with elt = the input iff it exists
dojo.addOnLoad(function() {
elt.onkeyup = function() { ... };
});
});
答案 4 :(得分:0)
据我所知,没有内置的JavaScript函数具有相同的功能。我认为最好的解决方案是按类而不是id进行查询并使用dojo.forEach(...),因为你将保证forEach闭包中的非null元素。
您始终可以使用等效的JavaScript:
dojo.byId('cool_input') && dojo.byId('cool_input').whateverYouWantToDo(...);
答案 5 :(得分:0)
我从未使用过dojo,但是大多数javascript框架(当处理DOM时)在从元素对象调用方法时返回调用元素(措辞不好,抱歉)。所以andand()将是隐含的。
dojo.addOnLoad(function() {
dojo.byId('cool_input').onkeyup(function(evt) { /*event handler code*/
});
});
答案 6 :(得分:0)
列表:
Array.prototype.andand = function(property, fn) {
if (this.filter(property).length > 0) this.map(fn);
}