5

Javascript を邪魔にならないようにするために、onLoads を使用して s などに機能を追加しています<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() { ... };
  });
});
4

7 に答える 7

3

私は道場を知りませんが、あなたの最初の例を読むべきではありません

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-01-07T23:12:06.260 に答える
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;})();

これで、ユーザー変数が適切にクリーンアップされ、全員が満足しています。しかし、うわー!なんてたくさんのタイピング!:)

于 2009-04-14T21:04:18.093 に答える
2

dojo.behaviorが必要です。

dojo.behavior.add({
    '#cool_input': {
        onKeyUp: function(evt) { ... }
    }
});
于 2009-04-14T21:25:55.310 に答える
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() { ... };
  });
});
于 2009-01-07T22:40:15.513 に答える
0

リストの場合:

Array.prototype.andand = function(property, fn) {

    if (this.filter(property).length > 0) this.map(fn);
}
于 2009-04-14T20:38:13.040 に答える
0

私の知る限り、同じ機能を持つ組み込みの JavaScript 関数はありません。最善の解決策は、id の代わりにクラスでクエリを実行し、dojo.forEach(...) を使用することだと思います。これは、forEach クロージャで非 null 要素が保証されるためです。

同等の JavaScript をいつでも使用できます。

dojo.byId('cool_input') && dojo.byId('cool_input').whateverYouWantToDo(...);
于 2009-01-07T22:19:24.993 に答える
0

私は dojo を使用したことがありませんが、ほとんどの JavaScript フレームワーク (DOM を処理する場合) は、要素オブジェクトからメソッドが呼び出されると、呼び出し元の要素を返します (言葉遣いが悪くて申し訳ありません)。したがって、andand() は暗黙的になります。

dojo.addOnLoad(function() {
  dojo.byId('cool_input').onkeyup(function(evt) { /*event handler code*/
  });
});
于 2009-01-07T22:25:42.407 に答える