Drag & Drop - Yahoo! UI (YUI) 版

 

Ajax JavaScript Framework の Yahoo! UI (YUI) 2.4.1 を使用して作成した、ドラッグ&ドロップのサンプルです。

サンプルについて、ブラウザごとの動作確認結果は Drag & Drop (Ajax JavaScript) にまとめてあります。

Demo

問題.次の表をドラッグ&ドロップにより完成させてください。

オリンピック 開催国
2004年(夏季)
アテネ
2006年(冬季)
トリノ
2008年(夏季)
ペキン
選択肢

  

ソースコード

ここでは JavaScript のみ掲載します。 CSS と HTML についてはDrag & Drop - 共通ソース(CSS, HTML) 全ソースコード を参照してください。

Yahoo! UI の読み込み
<script type="text/javascript" src="/usr/lib/yui/2.4.1/yahoo/yahoo-min.js"></script>
<script type="text/javascript" src="/usr/lib/yui/2.4.1/event/event-min.js"></script>
<script type="text/javascript" src="/usr/lib/yui/2.4.1/dom/dom-min.js"></script>
<script type="text/javascript" src="/usr/lib/yui/2.4.1/selector/selector-beta-min.js"></script>
<script type="text/javascript" src="/usr/lib/yui/2.4.1/dragdrop/dragdrop-min.js"></script>

JavaScript
<script type="text/javascript">
//<![CDATA[
(function() {

var Y = YAHOO.util;     // ショートカット

var correct = { opt0: 'ans1', opt1: 'ans2', opt2: 'ans0' }  // 正解

var mark = function(event) {
    var points = 0;
    var max = 0;
    for (key in correct) {
        var answer = Y.Dom.get(key).parentNode.id;
        points += (correct[key] == answer) ? 1: 0;
        ++max;
    }
    var score = Math.floor(points / max * 100);
    var judge = (score >= 70) ? '合格': '不合格';
    Y.Dom.get('result').innerHTML = judge + ':' + score + '%';
}

var Draggable = function(id, sGroup, config) {
    this.init(id, sGroup, config);
}

YAHOO.extend(Draggable, Y.DD, {
    startDrag: function(x, y) {
        var drag = this.getEl();
        Y.Dom.setStyle(drag, 'opacity', 0.5);
        Y.Dom.setStyle(drag, 'z-index', 1);
    },
    endDrag: function(e) {
        var drag = this.getEl();
        Y.Dom.setStyle(drag, 'opacity', 1.0);
        Y.Dom.setStyle(drag, 'z-index', 0);
        Y.Dom.setStyle(drag, 'left', '0px');
        Y.Dom.setStyle(drag, 'top',  '0px');
    },
    onDragEnter: function(e, id) {
        Y.Dom.addClass(id, 'dragenter');
    },
    onDragOut: function(e, id) {
        Y.Dom.removeClass(id, 'dragenter');
    },
    onDragDrop: function(e, id) {
        var drop = Y.Dom.get(id);
        Y.Dom.removeClass(drop, 'dragenter');
        if (Y.Selector.query('.draggable', drop).length == 0) {
            var drag = this.getEl();
            Y.Dom.setStyle(drag, 'left', '0px');
            Y.Dom.setStyle(drag, 'top',  '0px');
            drop.appendChild(drag);
        }
    }
});

Y.Event.onDOMReady(function() { 
    var nodes;
    var idx;
    nodes = Y.Selector.query('.dropzone');
    for (idx in nodes) {
        new Y.DDTarget(nodes[idx]);
    }
    nodes = Y.Selector.query('.draggable');
    for (idx in nodes) {
        new Draggable(nodes[idx]).isTarget = false;
    }
    Y.Event.addListener('submit', 'click', mark);
    Y.Dom.setStyle('wait', 'display', 'none');
});

}());
//]]>
</script>

更新履歴

日付 内容
2007-12-24 変更 YUI をバージョンアップ(2.2.0 → 2.4.1)
追加 2007-02-24版(YUI 2.2.0)の、 全ソースコード ページを追加。
2007-02-24 変更 YUI をバージョンアップ(0.12.2 → 2.2.0)& 直リンク へ変更。
2007-02-16 変更 ソースコードを全面的に書き直し。
2007-02-12 変更 ドラッグ&ドロップから解答の更新を削除(mark 関数内で操作結果を調べる)。
2007-02-10 変更 YUI をバージョンアップ(0.11.3 → 0.12.2)
追加 ドラッグ中のオブジェクトを最前面へ移動。 ドロップのキャンセル方法を変更(ドロップゾーンに子要素が存在したらキャンセル)。
2006-09-18 追加 ドラッグ中のオブジェクトを半透明化。
2006-09-14 変更 YUI をバージョンアップ(0.10.0 → 0.11.3)
追加 ドロップゾーンへの干渉をオレンジ色で表現。 ドロップゾーンに子要素が存在したらドロップをキャンセル。
2006-05-21 初版 ドラッグ&ドロップによる解答機能、および採点機能を実装。