HTML
JavaScript
MaterialDesignLite

Meterial Design LiteでチェックボックスをJavaScriptでON/OFFするときにハマったこと

More than 1 year has passed since last update.

ハマったこと

Material Design Lite(MDL)を使ったHTMLで、JavaScriptを使ってチェックボックのON/OFFを操作したい。
ただそれだけ。
ただそれだけだけど、ハマりました。

注意

MDLについての基本的なところは割愛します。
あと以下のサンプルコードは動作確認してないので、雰囲気だけ感じ取ってください。

まずはMDLの基本的な書き方

Material Design Liteではチェックボックスはこう書きます。

HTMLで書く場合

<div id="checkboxes">
  <label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect" for="sample-expandable">
    <input class="mdl-checkbox__input" type="checkbox" id="sample"> Check me!
  </label>
</div>
<button type="button" class="mdl-button" id="toggle">Toggle</button>
<button type="button" class="mdl-button" id="check">Check</button>
<button type="button" class="mdl-button" id="uncheck">Uncheck</button>

JavaScriptで書く場合

// labelタグ作成
var label = document.createElement('label');
label.id = 'sample-label';
label.className += ' mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect';

// inputタグ作成
var input = document.createElement('input');
input.type = 'checkbox';
input.id = 'sample';
input.className += ' mdl-checkbox__input';

// labelのテキスト作成
var labelText = document.createTextNode('Check me!');

// 作成した要素をlabelタグに追加
label.appendChild(input);
label.appendChild(labelText);

// MDL用に要素をアップデート
componentHandler.upgradeElement(label);

// 作成したlabel要素をbodyに追加
document.getElementById('checkboxes').appendChild(label);

ボタンを押してチェックのON/OFFをしたい

通常は。。。

こうですね?

document.getElementById('check').addEventListener('click', function () {
  document.getElementById('sample').checked = true;
}, false);

document.getElementById('uncheck').addEventListener('click', function () {
  document.getElementById('sample').checked = false;
}, false);

document.getElementById('toggle').addEventListener('click', function () {
  var checkbox = document.getElementById('sample');
  if (checkbox.checked) {
    checkbox.checked = false;
  } else {
    checkbox.checked = true;
  }
}, false);

ただMDLでは動きません。

MDLでは。。。

操作対象となる要素はinput要素ではなくlabel要素になります。
つまりこういう構成になっていないやつは動作しない。

document.getElementById('check').addEventListener('click', function () {
  document.getElementById('sample-label').MaterialCheckbox.check();
}, false);

document.getElementById('uncheck').addEventListener('click', function () {
  document.getElementById('sample-label').MaterialCheckbox.uncheck();
}, false);

document.getElementById('toggle').addEventListener('click', function () {
  var label = document.getElementById('sample-label');
  if (label.className.split(' ').indexOf('is-checked') !== -1) {
    label.MaterialCheckbox.check();
  } else {
    label.MaterialCheckbox.uncheck();
  }
}, false);

最後に

久しぶりにライブラリやフレームワークに頼らずにJavaScriptを書きました。
やっぱちょっとめんどくさいなと思いました。