6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

ハマったこと

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を書きました。
やっぱちょっとめんどくさいなと思いました。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?