Riot.js、Materialize.css、および jQuery を使用するプロジェクトに取り組んでいます (主に Materialize コンポーネントのため)。任意の要素に対して Riot.js を使用してイベント ハンドラーを作成しようとすると、起動時に Uncaught TypeError が発生し、その後 DOM が正しく更新されません。エラーを回避するために多くの方法を試しましたが、問題は解決しませんでした。問題が何であるかについての私の最善の推測は、Riot.js と jQuery (Materialize と一緒に?) が同時に DOM をいじり、同期の問題を引き起こしていることです。これはかなり長い間私を悩ませており、サイトの進行を妨げているため、どんな助けも大歓迎です!
Riot.js バージョン: 2.5.0
Materialize.css バージョン: 0.97.7
jQuery バージョン (Materialize.css で提供): 2.1.4
Chrome のコンソールによるスタック トレース出力は次のとおりです。
jquery.js:4769 Uncaught TypeError: Cannot read property 'nodeType' of undefined
handlers @ jquery.js:4769
dispatch @ jquery.js:4718
elemData.handle @ jquery.js:4549
trigger @ jquery.js:7807
(anonymous function) @ jquery.js:7875
each @ jquery.js:365
each @ jquery.js:137
trigger @ jquery.js:7874
(anonymous function) @ materialize.js:3191
dispatch @ jquery.js:4737
elemData.handle @ jquery.js:4549
ここに私のindex.htmlがあります(関連情報に取り除かれます):
<!doctype html>
<head>
<link rel="stylesheet" href="/materialize/css/materialize.min.css">
</head>
<body>
<div class="container">
<div class="section">
<div class="row">
<div class="col s12 m6">
<recruiting-form></recruiting-form>
</div>
</div>
</div>
</div>
<script src="/riot/riot+compiler.min.js"></script>
<script type="riot/tag" src="recruiting-form.tag"></script>
<script src="/jquery/jquery.js"></script>
<script src="/materialize/js/materialize.js"></script>
<script>
$(document).ready(function() {
riot.mount('*');
});
</script>
</body>
</html>
ここに私のRecruiting-form.tagがあります(関連情報に取り除かれています):
<recruiting-form>
<div class="row">
<form class="col s12>
<div class="row">
<div class="input-field col s6">
<select onchange={ checkPlatform }>
<option value="" disabled selected>Choose your platform</option>
<option value="PC">PC</option>
<option value="PS4">PlayStation 4</option>
<option value="XB1">Xbox One</option>
</select>
<label>Platform</label>
</div>
<div class="input-field col s6">
<select disabled={ regionDisabled }>
<option value="" disabled selected>Choose your region</option>
<option value="US">Americas</option>
<option value="EU">Europe</option>
<option value="KR">Asia</option>
</select>
<label>Region</label>
</div>
</div>
</form>
</div>
<script>
this.regionDisabled = true;
checkPlatform(e) {
if (e.currentTarget.value === 'PC') {
this.regionDisabled = false;
} else {
this.regionDisabled = true;
}
}
this.on('mount', function() {
$('select').material_select();
});
</script>
</recruiting-form>