武之新
dojoでハマってる

Webアプリを開発中で、ブラウザ側はdojoを使っているのですが、色々とハマっております。現在最も困っているのがdojox.grid.DataGridに埋め込んだdijit.form.Buttonの挙動。
dojox.grid.DataGridがなかなか強力で、これが使いたいためにdojoを選んだわけですが、このgridの各行にbuttonを配置すると途端に挙動が怪しくなってきます。 

(1)ボタン文言をasciiにすると見た目が装飾されない。

表題の通りだけど、文章からは現象が伝わりづらい。次の画像をみるとわかりやすい。

ascii

not ascii

同じタグ構造で、上はボタンの文言が「test」、下は「テスト」。この違いだけで見た目がこのように変わる。 どちらも画像左上に「test」ボタンがあるが、このようにgridの外であればこの現象は起きない。わけがわからん。

追記:
gridのformatterで<button data-dojo-type=”dijit.form.Button”>test</button> とやるとおかしくなるが、ボタンが1個だけでよければ

formatter: function(value, index){
  return new dijit.form.Button({
    label: "test"
  });
}

とやればasciiでも期待通りになる模様。ボタン2個のときはどうしたらいいのだろう…

(2)gridの中に入れたdijit.form.Buttonをクリックすると、外のwidgetにイベントが伝播する。

これまた意味不明な挙動なのだが、次のようなタグ構造があるとする。

<div data-dojo-type="dijit.Dialog">
  <form id="frm" data-dojo-type="dijit.form.Form">
  <div data-dojo-type="dijit.layout.BorderContainer">
    <div data-dojo-type="dijit.layout.ContentPane">
      <div id="grid" data-dojo-type="dojox.grid.DataGrid"></div>
    </div>
    <div data-dojo-type="dijit.layout.ContentPane">
      <button data-dojo-type="dijit.form.Button">ボタンA</button>
    </div>
  </div>
  </form>
</div>

このとき「ボタンA」をクリックする分にはそのボタンのonClickが動くだけなのだが、gridの中にボタンを配置しそれをクリックすると、そのボタンのonClickが実行された後にfrmがsubmitされてしまう。
とりあえずfrmのonSubmitにfunction(){ return false; }を入れて回避しているが、普通にsubmitさせたいformの場合は困ってしまうだろう。 

gridに絡まない部分ではクセさえ掴めば割といい感じなのだが、(といってもdijit.formにほしいwidgetがないとが色々あるけど)、gridとdijit.formを組み合わせるとイマイチなのかもしれない。

  1. takemasa5の投稿です