🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

HTML

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1141閲覧

終了時間になったら関数を呼び出したい

meronpansuki

総合スコア12

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

HTML

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/01/06 01:43

編集2020/01/06 08:06

あけましておめでとうございます。

data: function() { return { today_schedule: [  { id:'1', name: 'チームミーティング', start: '9:00', end: '10:00',},  { id:'2', name: '定例会議', start: '10:30', end: '11:30', }, }

このtoday_schedule配列のend時間の10分前になったら音声で通知をしたいと思っています。関数はこのようにしました。

minutesAgo: function(){ var hournow = now.getHours(); var minutesnow = now.getMinutes(); //時間を取り出して数値にする var hourend = this.today_schedule[i].end.substr(0,2); var hourend = Number( hourend ); //分を取り出して数値にする var minutesend = this.today_schedule[i].end.substr(3,2); var minutesend = Number( minutesend ); //10分前にする var tenminago = minutesend-10; if(hournow == hourend && minutesnow == tenminago){ var speak = new SpeechSynthesisUtterance(); speak.text = '10分前になりました。'; speak.lang = 'ja-jp'; speechSynthesis.speak(speak); } },

この関数をどこで呼び出せばいいのかわかりません。
そもそもこの関数の書き方はあってますでしょうか?

よろしくお願いします。

---追記---
setTimeoutを使用してボタンを追加し文を変更いたしました。
よろしければこちらの方もよろしくお願いします。

clickButton: function(event) {; this.i = this.i+1 //ボタンを押された時間から終了予定時刻までの差を計算 var now = new Date(); var hournow = now.getHours(); var minutesnow = now.getMinutes(); //時間を取り出して数値にする var hourend = this.today_schedule[i].end.substr(0,2); hourend = Number( hourend ); //分を取り出して数値にする var minutesend = this.today_schedule[i].end.substr(3,2); minutesend = Number( minutesend ); //計算する var hour = ( hourend - hournow ); hour = ( hour * 60 * 60 );//秒 var minutes = ( minutesend - minutesnow ); if( minutes < 0 ){ minutes = ( 60 + (minutes) ) ; minutes = ( minutes * 60 ); var second = ( hour + (minutes) ); var msecond = ( second * 1000 ); var mago = ( msecond - 600000 ); }else{ minutes = ( minutes * 60 );//秒 second = ( hour + ( minutes )); msecond = ( second * 1000 );//終了まで(ミリ秒) mago = ( msecond - 600000 );//10分前 } //10分前通知 var speak = new SpeechSynthesisUtterance(); speak.text = '終了10分前です。'; speak.lang = 'ja-jp'; speak = speechSynthesis.speak(speak); setTimeout(speak, mago); /*var time = setTimeout(speechSynthesis.speak(speak), mago); clearTimeout(time);*/ //終了通知 var endspeak = new SpeechSynthesisUtterance(); endspeak.text = '終了時刻となりました。'; endspeak.lang = 'ja-jp'; speak = speechSynthesis.speak(speak); setTimeout(speak, msecond); /*time = setTimeout(speechSynthesis.speak(endspeak), msecond); clearTimeout(time);*/ },

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

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

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

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

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

guest

回答2

0

こんにちは、meronpansukiさん

質問拝見しました。
Vue.jsを利用した経験がため、JSの観点からご回答できる部分をお答えしようと思います。

まず最初のdataにわたす関数ですが、 data は関数でなければなりませんより、以下のようになると思います。

data: function() { return { today_schedule: [   { id:'1', name: 'チームミーティング', start: '9:00', end: '10:00' },   { id:'2', name: '定例会議', start: '10:30', end: '11:30' } ] } }

続いて、minutesAgo関数ですが、質問にコメントとして、追加しますと

minutesAgo: function(){ // この関数内で now が定義されていないですが、関数外で定義されていますか? // var now = new Date(); などで定義されていれば、下の2行はOKそうです。 var hournow = now.getHours(); var minutesnow = now.getMinutes(); //時間を取り出して数値にする // i が定義されていないため、配列から取り出すことができないです // 今回の配列だと 0 か 1 で値が取れます // substr(0, 2)で時間の文字列だけ取る処理をしていますが、「時間」が1桁」だと正常に動作しません var hourend = this.today_schedule[i].end.substr(0,2); var hourend = Number( hourend ); //分を取り出して数値にする // こちらも時間によっては、取得できる範囲がことなるので、想定とは異なる値になりそうです var minutesend = this.today_schedule[i].end.substr(3,2); // 分が正常に取れたとして、もし10:05のような時間だった場合分が -5分 のようになり、時間ではない結果になりそうです。 var minutesend = Number( minutesend ); //10分前にする var tenminago = minutesend-10; if(hournow == hourend && minutesnow == tenminago){ var speak = new SpeechSynthesisUtterance(); speak.text = '10分前になりました。'; speak.lang = 'ja-jp'; speechSynthesis.speak(speak); } },

ちなみに、String.prototype.substr()は非推奨なので、利用されないほうがよいです。

結論からいうと、時間を管理するのはなかなか骨の折れる作業なので、ライブラリの利用をおすすめします。

Moment.js
date-fns

以上、指摘ばかりになり恐縮です、
参考になれば幸いです。

投稿2020/01/06 06:23

gentamura

総合スコア406

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

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

meronpansuki

2020/01/06 07:56

お返事ありがとうございます。 やはり時間が絡むとやりずらいのですね・・・ 教えていただいたライブラリを使用できるように頑張ります! ありがとうございます!
AkitoshiManabe

2020/01/07 04:21

> String.prototype.substr()は非推奨 gentamuraさん、ありがとうございます。 完全に見落としていました(今まで、普通に使っていました)。
guest

0

ベストアンサー

インターバル処理をする関数をmethod上に用意し
createdで呼び出してください
(中途半端にアップされたので更新)

投稿2020/01/06 05:57

編集2020/01/06 06:25
yambejp

総合スコア116694

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

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

yambejp

2020/01/06 07:16

一応こんな感じ (条件のところを適当に書き換えればよいです) <div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data:{ timerId:null, hoge:0, message:'', }, created:function() { this.count(); }, methods: { count:function(){ this.timerId=setInterval(function(obj){ obj.minutesAgo(); if(obj.hoge>=5){ obj.message="time out" clearInterval(obj.timerId); } },1000,this); }, minutesAgo: function(){ this.hoge++; console.log(this.hoge); }, }, }); </script>
meronpansuki

2020/01/06 08:03

詳しく書いていただきありがとうございます! すみません、書いていただいたsetIntervalを調べていて、 setTimeoutを見つけまして、ボタンを一つ追加し、それを押したときに 処理をする文を考えました。質問に追記いたしますので、よければみていただけますでしょうか。。
yambejp

2020/01/07 04:05

setTimeoutはnミリ秒後に1回だけ実行する関数ですから この場合はsetIntervalで定期的にチェックして 所定の時刻と合致したら終了の方が処理しやすいです。 (setTimeoutもsetIntervalもnミリ秒は必ずしも正確ではないので)
meronpansuki

2020/01/08 02:13

ありがとうございます!おかげさまで解決できました。 本当にたすかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問