有没有相当于Ruby的Javascript和?

时间:2009-01-07 22:07:09

标签: javascript ruby andand

在尝试让我的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() { ... };
  });
});

7 个答案:

答案 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);
}