
電脳麻将 では牌を画像として表示していますが、JavaScriptのプログラムではこの画像がどこにあるか知らず、画像のURLも使用していません。HTML内に非表示の雛形があり、それをコピーして表示しています。
具体的にはHTML内に以下のような非表示の「雛形」があり、このDOM要素をコピーして使用します。
<div id="loaddata"> <img class="pai" data-pai="m1" src="img/m1.png" alt> <img class="pai" data-pai="m2" src="img/m2.png" alt> <img class="pai" data-pai="m3" src="img/m3.png" alt> ...... </div>
ここでは img 要素を使用していますが、他の要素でも動作することに注意してください。つまりこの部分は
<span class="pai" data-pai="m1">一萬</span>
のような文字でもよいのです。
これを実装しているのが @kobalab/majiang-ui の関数 Majiang.UI.pai です。
/* * Majiang.UI.pai */ "use strict"; const $ = require('jquery'); const label = require('./label')('pai'); module.exports = function(loaddata) { const pai = {}; $('.pai', loaddata).each((i, n)=>{ let p = $(n).data('pai'); if ($(n).attr('alt') != null) $(n).attr('alt', label[p]); else $(n).attr('aria-label', label[p]); pai[p] = $(n); }); return function(p){ return pai[p.slice(0,2)].clone(); } }
loaddata で指定されたDOM領域の中から class="pai" の要素を探し、その data-pai 属性の値をキーに要素を保存します。その際にアクセシビリティのために aria-label 属性に「牌名」を設定します。もし alt 属性がある場合には代わりにこちらに牌名を設定しています。返り値 は先ほどキーとした 牌 を引数として雛形からコピーしたDOMノードを返す関数です。
以下で実際の動作を確認できます。