September 7, 2007

まだまだバグが多いのね。

最近は、ずっとJavaScriptを書いていて、世間ではjQueryが注目されている中、私は未だprototype.jsとscript.aculo.usを使っている。今の仕事では結構、面倒くさいこといろいろやっているんだけど、prototype.jsやscript.aculo.usってまだまだバグが多いのね。というか、script.aculo.usの中に入っているprototype.jsが古いっていうのもあるんだろうけど、悩ましいなぁ。ここではまると結局、中のソースを見たりしないといけないので、時間がかかってしょうがない。

で、はまったついでにメモとして書いておく。

  1. Insertion.Afterでtableのtrを複数入れようとしたときに順番が逆になる。
  2. えと、今作っているところの一つはtd要素にrowspanとか使っているので、複数のtr要素を一つの行として扱わないといけないところがあった。
    そこで、rowspan分挿入しようとしたのだが、順番が逆になって入ってしまう。。。前回は、結構バグに悩んだけど、今回からはもう既存のバグをまず探す。そして、解決されていればいつ対応されたのかバージョンを探る。で、今回見つけたのは、これ。

    Insertion.After inserts table rows the wrong way round in IE

    Prototype.jsでは、1.5.2でFixedらしい。ということは、script.aculo.usと同時に使えないね。アプリ側でPrototype.Versionを見て、1.5.2より下の場合のみ拡張するコードを書いたよ。

  3. draggableな要素がoverflowのhidden, scroll, auto(たぶん)のときには、そのoverflowを指定してある要素の外では見えなくなっちゃう。
  4. えと、これはかなりはまった。。。。orz….divでoverflow:scrollな要素が二つあって、そこの間をドラッグドロップをしようとしていたのだけど、移動先のdivに入るとドラッグレイヤーの下に入ったかのように見えて、消えちゃうの。で、いろいろ探した結果、結構ホットなバグみたい。IE6ではちゃんと動くけど、mozillaとIE7ではダメというちょっと不思議なバグ。つーか、IE6の動作がそもそもいかんのかな。。。
    draggables are stuck in a div with overflow:scroll. A way to move them to upmost dom level needed

    Dragging an element outside a overflow:auto container

    Drag draggables outside an overflow:auto div to an external droppable container

    で、解決方法は結構大変。えと、問題なのは、
    draggables are stuck in a div with overflow:scroll. A way to move them to upmost dom level needed

    I discussed this with Thomas some time ago, and the problem is that the element we move (be it in ghosting mode or not) usually must remain at the same DOM level because otherwise, styles might get lost. I’m working on a solution right now, too, it will involve a new option you can use to assign a class name to the element while it’s being dragged. If this class name is supplied, the element will be attached to the body. Let’s see if this works, I’ll provide the patch as soon as it is ready

    ということなのだ。つまり、z-indexを付けようがどうだろうが、ダメなものはダメなのだ。解決方法としては、body要素の下にdraggableな要素をappendChildしてやればいいのだが、それをするとstyleが無くなる可能性ががあるというわけ。もちろん位置も合わせないといけないしね。つまり、ドラッグする要素のstyleがそれに付けられているclassやidなどで完結していればいいのだが、そうでないときは、いきなりbody要素の下に付けてもさぁ、困ったな、といったことが起きるのだ。li要素とか。。。で、未だ正しい解決方法は出てきていない。まぁ、こういうところがハックのしがいがあるんだよね。

    今回の私が使用したかったところは、div要素で完結していたので、width指定とかもしておけば、body要素の下に置いても大丈夫だった。後は、Positionの位置を合わせるだけ。
    Draggables.addObserverのonStartとonEndを使用して、要素をbody直下に変えたり、戻したりしたらいけた。位置がずれるところはちょっと泥臭いことしたけど、もう少しキレイに書けたらここに載せるかもしれん。

しかし、
Super.mario.bros
辺とか見ると自分はまだまだっす。。。先は長いなー。

[…] ネタは、3ヶ月程前にはまった内容にしてみようと思います。前々から忘れてしまう前にポストしないとなぁと思いながら、先延ばしにしていました。問題としては、以下のように当時は書いておりますね。 draggableな要素がoverflowのhidden, scroll, auto(たぶん)のときには、そのoverflowを指定してある要素の外では見えなくなっちゃう。 […]

はじめまして!

今回はdrag要素についてでしたが、逆の場合でハマっております。
つまり、



で、それぞれのkoをDroppable.addドロップ可能にした時、スクロールさせても、addした時の座標がそのまま生きているように見えてしまい、正しくドロップできないというものです。

いろいろ検索してはいるのですが、なかなか解決法に巡り合っていません。何かご存知であればご教授いただければと思います。

Comment by Akinori — April 20, 2008

なぜか「つまり、〜で、」が…になっていてますね。それがよくわからないので、なんとも言えないですが、

prototype.jsの4015行目くらいにある
// set to true if needed, warning: firefox performance problems
// NOT neeeded for page scrolling, only if draggable contained in
// scrollable elements
とかどうでしょう?

つまり、
Position.includeScrollOffsetをtrueにしたらうまくいくとか。

と言いつつ、もう4ヶ月ほどscript.aculo.usを使っていないので、それ以外はわからないです。

Comment by shin — April 20, 2008

あぁhtmlをそのまま書いてしまったようです。

divが入れ子になっていて、親のdivのスタイルにoverflow-y:autoを設定して、子のdivをdroppable.addでドロップ可能にしているものです。子のdivが増えれば、当然スクロールバーが出て、スクロールさせた後にターゲットにドロップしたいと思ったのですが

教えて頂いたものを試してみます。

4か月使ってない・・・・別のライブラリに行ってしまったのでしょうか?

Comment by Akinori — April 21, 2008

報告です。

とりあえずFirefoxは望むような動きになりました。
ieはあかんですわ。Droppables.addするとスクロールすらしないです。

たぶん、ドラッグ開始時にDroppables.addをすることになるとは思います(まだ試してませんが)。

ありがとうございました。

Comment by Akinori — April 21, 2008

あら。ダメでしたか。JavaScriptに関してはブラウザ間の違いをライブラリが吸収してくれるのでいいのですが、CSSが絡んでくるとダメだと言うのが私の経験則です。。。

今は、YUIを使用していますが、デフォルトでRubyのような書き方のができるprototype.jsの方が好きかなぁ。フレームワークを使うとデフォルトでprototype.jsとscript.aculo.usの組み合わせになるので、おそらくそちらをやることになると思います。

さて、今知ったのですが、このWordpressだとHTMLを完全に消しちゃうんですね。それは困りましたね。

でも、聞いた感じでは、がんばればできそうな気がするのですが、もう少しがんばってみるというのはいかがでしょうか?

Comment by shin — April 21, 2008

Leave a comment

Bloglines feedburner