2011-12-17 10 views
1

私は完全な形でドラッグアンドドロップで遊んでいたので(インスタントアップロードはありません)。私は小さな部分がファイルで覆われたときに特定のフィールドセットを強調表示するつもりだったが。 dragoverdragenterのイベント(およびdragleaveなど)を入力します。dragenter/dragoverイベントにEvent.fromElementはありませんか?

このような小さな部分ではないことが分かります。フィドル:http://jsfiddle.net/rudiedirkx/epp74/

試してみてください:フィールドセットの上をドラッグして少し移動してください。最初のoverは、フィールドセットのdragenterイベントをトリガーします(フィールドセットは黄色です)。それ以降(同じフィールドセット内で)移動すると、dragenterdragleave(フィールドセットは黄色になりません)が悪くなります。 mouseentermouseleave(彼らは一度だけトリガー):私はIEは長い時間前mouseovermouseoutのために作られたものを作りたかった理由です

。ドラッグイベントの場合、まったく同じことが適用されます。まったく同じ方法で1回だけトリガーする必要があります。 JSライブラリは、Event.fromElementEvent.toElementを使用してこれらのIEイベントを偽装し(イベント所有者要素と比較します) (詳細についてjQueryまたはMootoolsソースを参照してください。)

をドラッグイベントのために同じことを行うために、私は同じfromElementtoElementを必要としています。あなたはフィドルで見ることができます、私は試してみますが、私はそれらを見つけることができません。

誰でも知っていますか?なぜ彼らは利用できないのですか?

私はdragenterイベントでfromElementを持っていない、主にChromeを使っていますが、はdragleaveイベントでtoElement持っています。 Firefoxでは少し悪いですが(論理的です)、どちらも空です。

すべてのアイデアは大歓迎です。私はChromeのtoElementdragleaveでは必ずしも正しくないことが判明しましたa little more debugging

編集
thisより大きいことはありませんが、フィールドセット(this)を親フォーム(toElement)のままにしておく必要があります。私がそうすると、thistoElementの両方がフィールドセットになります(間違っていますか?)。

編集ソリューション:イベント内の要素を無視し、イベントは、マウスの下の要素を見つけるために、座標使用http://jsfiddle.net/rudiedirkx/Lwd3md71/
私はこのようなものになってしまいました。アニメーションフレームごとに最大1回トリガーするには、31〜59 fpsになるrequestAnimationframeを使用します。

+0

質問をスキミングしましたが、イベントのsrcElementプロパティを探していますか? – aaaidan

+0

私は正しいtoElementを探しています。フィールドセットを離れるドラッグを検出するには、toElementがフィールドセットの外にあるようにする必要があります( '

'や ''など)。しかし、それは常に空です... JSlibsで作成された非ネイティブのmouseenterイベントとmouseleaveイベントは、これを使ってmouseoverとmouseoutからmouseenterとmouseleaveを作成します。私はドラグターとドラグにも同じことをしようとしていました。私はtoElementおよび/またはfromElementが必要です。奇妙な。考えられる解決策(?)は、親要素(または、さらに ' ')にリスナーをアタッチすることです... – Rudie

+0

ああ、そうです。そんなカモメになってしまって申し訳ありません! – aaaidan

答えて

3

FirefoxはrelatedTargetのイベントプロパティを提供しますが、ChromeとSafariではイベントプロパティはありません。残念ながら、この問題は数年前からこのChrome bugとこのWebkit bugとして公開されています。

+0

それは存在しますが、 Firefoxは同じだった。彼らは12月11日以来それを変えたかもしれない。 – Rudie

+0

あなたはそうです。 Firefoxには 'toElement'や' fromElement'はありませんが、動作する 'relatedTarget'はあります。 Chromeにはすべての機能があり、機能していません。 http://jsfiddle.net/rudiedirkx/epp74/21/ – Rudie

+0

あなたがまだ興味を持っている場合は、これが私の結末です:http://jsfiddle.net/rudiedirkx/Lwd3md71/ – Rudie

1

「dragleave」イベントの変数を設定するためのrelatedTargetを偽装する方法があります。これは、dragleaveが常に先にdragenterが先行するため、後者で設定される変数は前者利用可能:

var relatedTarget = null; 

document.addEventListener('dragenter', function(e) 
{ 
    relatedTarget = e.target; 

}, false); 
document.addEventListener('dragleave', function(e) 
{ 
    console.log('target = ' + e.target + ' relatedTarget = ' + relatedTarget); 

}, false); 

それは他の方法でラウンドを動作しませんが、あなたはそれをこのように使用する場合は、本当に何かのためのdragEnterを必要としない - だけでdragleaveはあなたを伝えるのに十分である。すなわちマウスが特定の要素に移動しているとき、またはその要素から完全に外れているとき

+0

私は試してみよう、それを使ってJS libの 'relatedTarget'を偽造しました。それは間違っていると思うが、うまくいくかもしれない。 Chromeは一方的にしか動作しないため、他の方法で動作する必要があります。 (それが可能な方法であることを望みましょう)私はあなたに知らせるでしょう。ありがとう。 – Rudie

+0

私はJSのlibがどのようにこれを一般化するのかよく分かりませんが、カスタムコードでは完全に動作します:http://webblocks.nl/tests/dragenterleave.html Firefoxの作業方法を使うよりもずっと速い=)ありがとう! – Rudie

+0

これはちょっとしたハックですが、それはトリックです。私自身の実装では、現在選択されている要素の詳細を持つ「選択」オブジェクトを保持しています(何もドラッグされていないときはnullです)。そのオブジェクトには、このように実装された.relatedプロパティと、それから推測される.droptargetプロパティもあります。私はドロップドロップターゲットを変更するたびにdragleaveを使用してドラッグゴーストを更新します(dropEffectとeffectAllowedはカーソルに影響を与えないため有効または無効のアイコンを表示します)。 – brothercake

関連する問題