質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Riot.js

Riot.jsは、React.jsに似たコンポーネント指向なJSフレームワークです。非常に軽量であり、コンポーネントで設計しやすいといったメリットがあります。また、MVCのように分割できることも特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

3970閲覧

Riot.jsにて、動的にカスタムタグをマウントしたい。

kokkosan

総合スコア17

Riot.js

Riot.jsは、React.jsに似たコンポーネント指向なJSフレームワークです。非常に軽量であり、コンポーネントで設計しやすいといったメリットがあります。また、MVCのように分割できることも特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/11/25 01:55

編集2016/11/30 06:44

###前提・実現したいこと
Riot.jsにて、動的にカスタムタグをマウントしたい。

###発生している問題・エラーメッセージ
カスタムタグのマウント時の初期化で、DOM操作(getElementByIdなど)したものの、アクセスしたい要素にアクセスできず、要素のプロパティ参照時にnullが取得される。

エラーメッセージ Uncaught TypeError: Cannot read property 'プロパティ名' of null(…)

###該当のソースコード

[マウント元] <my-tag> <h3>マウント元タグ</h3> <div> <button type="button" onclick={ btnClick }>トリガー</button> <mount-tag each={ item in items } item={ item }/></div> </div> <script> var items var cnt /*** 初回マウント時実施 ***/ this.on('mount', function(){ this.init() }) /*** 初期化 ***/ init(){ items = [] cnt = 0 } /*** ボタンクリック時 ***/ btnClick(e){ cnt = cnt + 1 var item = { 'id' : cnt } items.push(item) riot.compile(function(){ riot.mount('mount-tag') }) this.update() } </script> </my-tag> [マウント先] <mount-tag> <h3>マウント先タグ</h3> <div id={ opts.item.id } data-target="10"> 取得したいdiv </div> <script> var getDiv /*** 初回マウント時実施 ***/ this.on('mount', function(){ this.init() }) /*** 初期化 ***/ init(){ getDiv = document.getElementById(opts.item.id) // getElementByIdで要素にアクセスできず、nullが返される。 console.log(opts.item) // optsによる値の受け渡しは行われている。 console.log(getDiv.dataset.target) // ここでエラー } </script> </mount-tag> div each={ item in items } で、itemsにpushされて値が増えるたびに、mount-tagを動的にマウントしたい

###試したこと
上記のとおり。
また、これら2つのタグは、index.htmlで読み込み済みであり、コンパイルもしている。

[index.html] <!DOCTYPE html> <html> <head> (略) </head> <body> <script type="riot/tag" src="tag/my-tag.html"></script> <script type="riot/tag" src="tag/mount-tag.html"></script> </body> </html> [index.js] init(){ riot.compile(function() { riot.route.base('/BaseURL/') riot.route.start(true) riot.mount('*') }) }

###補足情報(言語/FW/ツール等のバージョンなど)
バージョン
riot: 2.6.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決はしていませんが、HTMLの描画がされる前に、mount処理が走ってしまっているようで、
setTimeoutで時間を待たせてからDOMにアクセスすることで、本事象を回避できることがあるようです。

setTimeout(function(){ document.getElementById(opts.item.id)) }, 1000)

1秒待ってgetElementByIdでアクセスしたら、タグインスタンス

<div id={ opts.item.id } data-target="10"> が取得できました。

riot 3.0.1の知人の端末で試したら、setTimeoutなしで普通にgetElementByIdで
取得できたので、riotのバージョンのせいなのか、マシンスペックの問題なのか環境起因の問題とし、本件はクローズ致します。

投稿2016/11/30 06:45

kokkosan

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問