为了让我的Javascript变得不那么引人注目,我使用了onLoads来给Javascript s等等添加功能。在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() { ... };
});
});发布于 2009-04-14 21:04:18
您想要的确切语法在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;})();现在,user变量被正确地清除了,每个人都很高兴。但是哇!打字太多了!:)
发布于 2009-01-07 23:12:06
我不知道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语句短多少-所以为什么要麻烦呢?
发布于 2009-04-14 21:25:55
你想要dojo.behavior。
dojo.behavior.add({
'#cool_input': {
onKeyUp: function(evt) { ... }
}
});https://stackoverflow.com/questions/422355
复制相似问题