この質問は vis.timeline というライブラリを使っている中での問題ですが,問題の本質はライブラリの使い方というよりも Javascript の理解に関するものだと思います.Javascript をご存知の方であればこのライブラリを使ったことがなくてもご回答いただけるのではないかと思います.よろしくお願いします.
実現したいこと:
vis.timeline で作ったタイムラインにて,onclick イベントで日付を移動したり,アイテムの表示・非表示を行う.
具体例としてこちらをご覧ください.
このページでタイムラインの x軸をマウスで動かしたあと,"Try Me" ボタンを押すことで任意の場所に戻ります.これと類似のことを実現したいです.
http://jsfiddle.net/ze3yszoq/4/
ライブラリの website はこちらです.この中の,animate window という機能を実装しようとしています
http://visjs.org/timeline_examples.html
アドバイスをいただきたい問題点:
onclick で呼んでいる関数内から,描画済みのタイムラインのインスタンスへのアクセス方法がわからない.onclick イベントが発火しているのは確認できています.timeline.getWindow(); にて 「timeline is not defined 」と console に表示されます.この関数内で timeline を生成していないので当然だと思い,timeline.getWindow(#opened); としてみたり,引数に #opened を入れてみたのですがいずれもうまく既存の timeline インスタンスを触ることができませんでした.
環境は Django です.タイムラインの描画は,document ready をトリガにして ajax で json データを取得し,描画しています.
HTML
<input type="button" id="opened" onclick='opened()' value="Go to Opened date">
<div id="visualization" align="center"></div>
タイムライン生成部分の Javascript
$( document ).ready(function() {
...
var timeline = new vis.Timeline(container, items, options);
...
onclick を扱う部分の Javascript
function opened() {
timeline.getWindow();
timeline.moveTo($('#opened').val()); };
以上です.
No.2
- 回答日時:
案1. timeline をグローバル変数化
$( document ).ready(function() {
_ var timeline = ...
_ window.timeline = timeline;
});
function opened() {
_ window.timeline.moveTo( ... );
}
<input type="button" onclick='opened()' ... >
案2. timeline が見えるスコープ内にて onclick を実装 / オススメ!
$( document ).ready(function() {
_ var timeline = ...
_ $('input#opened').on('click', function(){
_ _ timeline.moveTo( ... );
_ });
});
No.1ベストアンサー
- 回答日時:
こんにちは
よくわかってませんが、単なる変数のスコープの問題のような気がします。
関数内で定義されたローカル変数は、その関数外からは参照できません。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
https://msdn.microsoft.com/ja-jp/library/bzt2dkt …
>この関数内で timeline を生成していないので当然だと思い,~~
ご提示のコードからは匿名関数の範囲が不明確なので判然としませんが、ready時の匿名関数外で関数openedを定義しているのであれば、変数timelineは参照できません。
>timeline.getWindow(#opened); 引数に #opened を入れてみたのですが~~
スコープの考え方として参照を不可能としていますので、基本的に参照できません。そもそも、メソッドの引数以前にtimelineが取得できていないのですから…
対応方法として、とりあえず2通りあげておきます。
1)変数timelineをグローバルで定義しておいて、それを利用する。
最初にグローバルで、var timeline; などと定義しておく
匿名関数内でインスタンスを代入する際は、varを付けずに参照
これで、関数openedからも参照可能になると思います。
2)無用なグローバル変数を作成しないため、全てをready時の匿名関数内に記す。
ready(function(){ ~~ } 内で、ご提示のようにtimelineを定義し、同じ関数内で関数openedも定義する。
(これによりopenedからtimelineが参照可能)
ただし、このままではHTMLのinputタグに記載のonclick='opened()'で関数が参照できませんので、イベントの設定方法を変える必要があります。
簡単なのは、例示のサンプルでも利用しているような
document.getElementById("opened").onclick = opened;
というような方法で、上記の関数内で設定します。
他の方法としては、addEventListenerを利用する方法などもあります。
https://developer.mozilla.org/ja/docs/Web/API/Ev …
一方、ご提示のスクリプトで
$( document ).ready(function()~~
としているので、jQueryなどのライブラリを利用しているのかと思います。その場合は、ライブラリでのイベント設定方法を利用するのが簡単かもしれません。
もしも、jQueryであるならば
$("#opend").on("click", function(){ ~~ });
といったかんじでしょうか。
ご説明と具体的な解決方法のご提示,ありがとうございました.
質問投稿後に,javascript を全て html ファイル内に記述する方法でやりたいことができたので,今の所はそれで良しとしています.おそらく似たようなことをやりたい場面が今後もあると思うので,ご提示いただいた2の方法でやってみようと思います.
ありがとうございました.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
クリックすると上に開くアコー...
-
jquery 複数のメソッド
-
function(e)の意味を教えてくだ...
-
XMLHttpRequestでキャッシュを...
-
functionから別のfunctionを実...
-
ラジオボタン選択内容に応じて...
-
jQuery cssメソッドでの変数の...
-
小数点以下を5刻みで表示
-
jQueryの"return false"の役割...
-
現在地の取得について
-
jslintのエラーについて質問
-
CDの曲をケータイのSDに移す
-
jQueryでzipを解凍読み込みする...
-
ASP 最終日の表示
-
Matlabで自作関数をオーバーロード
-
JAVAスクリプトで指定時間以降...
-
要素名がスペースを含む場合のj...
-
jQueryを使用したギャラリー
-
関数でy=g(x)のgとは何の略です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
jslintのエラーについて質問
-
クリックすると上に開くアコー...
-
XMLHttpRequestでキャッシュを...
-
ajax反映後のjqueryが動かない
-
function(e)の意味を教えてくだ...
-
要素名がスペースを含む場合のj...
-
jQueryの :not() .not() が有効...
-
jQueryでzipを解凍読み込みする...
-
関数名をテキストから読み込む...
-
getElementByIdを使用したグロ...
-
jqueryuiのdialog
-
jqueryのグローバル変数とロー...
-
jQuery 同じ処理を関数にまとめ...
-
XMLHttpRequestオブジェクトが...
-
addEventListener()でリスナー...
-
drawImageの描画順序の指定につ...
-
javascript(jQuery)でセル内...
おすすめ情報