forked from hitode909/hatenablog-unofficial-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
speech.js
56 lines (44 loc) · 1.81 KB
/
speech.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
* はてなブログに「音読する」ボタンを追加する
** 使い方
- 以下をコピーして デザイン編集 → カスタマイズ → フッタHTML に貼り付け
<script async defer src="https://hitode909.github.io/hatenablog-unofficial-modules/speech.js"></script>
** 注意
- Web Speech API非対応のブラウザでは音読できません
*/
function speak (e) {
speechSynthesis.cancel();
// Chromeで初回実行時にspeechSynthesis.pause()できない問題を解消するため、空文字で一度speechSynthesis.speak()しておく
var empty_utter = new SpeechSynthesisUtterance('');
speechSynthesis.speak(empty_utter);
var utter = new SpeechSynthesisUtterance(this.body);
speechSynthesis.speak(utter);
e.currentTarget.textContent = '停止する';
e.currentTarget.removeEventListener('click', this);
e.currentTarget.addEventListener('click', pause);
}
function pause (e) {
speechSynthesis.pause();
e.currentTarget.textContent = '再開する';
e.currentTarget.removeEventListener('click', pause);
e.currentTarget.addEventListener('click', resume);
}
function resume (e) {
speechSynthesis.resume();
e.currentTarget.textContent = '停止する';
e.currentTarget.removeEventListener('click', resume);
e.currentTarget.addEventListener('click', pause);
}
(function () {
if (!window.speechSynthesis) return;
document.querySelectorAll('article.entry').forEach(function (article) {
var button = document.createElement('button');
button.type = 'button';
button.className = 'btn';
button.textContent = '音読する';
button.style = 'float: right';
article.querySelector('header').appendChild(button);
var body = article.querySelector('.entry-content').textContent;
button.addEventListener('click', { handleEvent: speak, body: body });
});
})();