teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

質問を一部修正

2020/04/10 07:57

投稿

T_Furuta
T_Furuta

スコア25

title CHANGED
File without changes
body CHANGED
@@ -216,18 +216,15 @@
216
216
  var scrollPos = $('#bms_messages').offset().top;
217
217
  で、最新のメッセージがある位置(最下部)の値を取りたいのですが、ネットで調べてもよくわかりませんでした。
218
218
  ちなみに、このscrollPosに、100と言ったリテラル値を入れると正常に動作します。
219
- ー>追記
219
+ 試しに、
220
- 申し訳ありません。
221
- 1つ目の問題については、自己解決しました。
222
- var scrollPos = $('#bms_messages').offset().top;
223
- を、
224
220
  var scrollPos = $('#bms_messages').offset().bottom;
225
- にする事で、最下部に移動する事が出来ました。
221
+ var scrollPos = $('#bms_messages').weight();
226
- scrollPos値を確認るとundefinedとあり、ちゃんと値がない気になるところですが。。
222
+ と試して見た、値がundefinedにってしま、ほしい値入ってきません
227
223
 
228
-
229
224
  もう一点確認したい点としては、同じくapp.jsの中の51行目
230
225
  $('#bms_messages').animate({scrollTop: scrollPos});
231
226
  で今は、animateを使用しているのですが、本当はスクロールする画面を見せず、始めから一番最新のメッセージ
232
227
  が見れるようにしたいのですが、その方法が分かりませんでした。
233
- こちらに関して、分かる事りましたらご教授いただきたくよろしくお願いします
228
+ こちらに関してネットを検索てみても、解決方法見つかりませんでした。
229
+
230
+ ご教授いただけると助かります。よろしくお願いします。

2

回答の片方が解決

2020/04/10 07:57

投稿

T_Furuta
T_Furuta

スコア25

title CHANGED
File without changes
body CHANGED
@@ -216,10 +216,18 @@
216
216
  var scrollPos = $('#bms_messages').offset().top;
217
217
  で、最新のメッセージがある位置(最下部)の値を取りたいのですが、ネットで調べてもよくわかりませんでした。
218
218
  ちなみに、このscrollPosに、100と言ったリテラル値を入れると正常に動作します。
219
+ ー>追記
220
+ 申し訳ありません。
221
+ 1つ目の問題については、自己解決しました。
222
+ var scrollPos = $('#bms_messages').offset().top;
223
+ を、
224
+ var scrollPos = $('#bms_messages').offset().bottom;
225
+ にする事で、最下部に移動する事が出来ました。
226
+ scrollPosの値を確認すると、undefinedとあり、ちゃんと値が出ないのが気になるところですが。。。
219
227
 
228
+
220
- 後、もう一点確認したい点としては、同じくapp.jsの中の51行目
229
+ もう一点確認したい点としては、同じくapp.jsの中の51行目
221
230
  $('#bms_messages').animate({scrollTop: scrollPos});
222
231
  で今は、animateを使用しているのですが、本当はスクロールする画面を見せず、始めから一番最新のメッセージ
223
232
  が見れるようにしたいのですが、その方法が分かりませんでした。
224
-
225
- ちらか片方、もしくは両方でご教授いだける事がありましたらご教授いただきたくよろしくお願いします。
233
+ ちらに関して、もし分かる事がありましたらご教授いただきたくよろしくお願いします。

1

直接関係無い部分のコードを削除しました。

2020/04/10 07:41

投稿

T_Furuta
T_Furuta

スコア25

title CHANGED
File without changes
body CHANGED
@@ -2,47 +2,6 @@
2
2
  その後、開発を進めていったのですが、最新のメッセージを常に表示するように機能を追加したのですが、上手く動作しませんでした。
3
3
 
4
4
  ソースコードとしては、下記となります。
5
-
6
- Index.html
7
- ```html
8
- <!DOCTYPE HTML>
9
- <html>
10
- <head>
11
- <meta charset="utf-8">
12
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
13
- <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
14
- <script src="components/loader.js"></script>
15
- <script src="lib/onsenui/js/onsenui.min.js"></script>
16
-
17
- <link rel="stylesheet" href="components/loader.css">
18
- <link rel="stylesheet" href="lib/onsenui/css/onsenui.css">
19
- <link rel="stylesheet" href="lib/onsenui/css/onsen-css-components.css">
20
- <link rel="stylesheet" href="css/style.css">
21
- <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
22
- <script src="https://js.pusher.com/5.1/pusher.min.js"></script>
23
- <script src="js/app.js"></script>
24
- </head>
25
- <body>
26
- <ons-navigator swipeable id="nav" page="login.html"></ons-navigator>
27
- <template id="login.html">
28
- <ons-page id="login">
29
- <div class="join-area" style="text-align: center; margin-top: 30px;">
30
- <h4>チャットルームにログインしてください</h4>
31
- <p>
32
- <ons-input id="userName" modifier="underbar" placeholder="ユーザ名" float></ons-input><br />
33
- <ons-input id="chatId" modifier="underbar" placeholder="chatId" float></ons-input>
34
- </p>
35
- <p style="margin-top: 30px;">
36
- <ons-button onclick="join()">Join</ons-button>
37
- </p>
38
- </div>
39
- </ons-page>
40
- </template>
41
- </body>
42
- </html>
43
-
44
- ```
45
-
46
5
  chat.html
47
6
  ```html
48
7
  <ons-page id="chat">
@@ -70,36 +29,148 @@
70
29
  </div>
71
30
  </ons-page>
72
31
  ```
32
+ style.css
33
+ ```CSS
34
+ /**/
73
35
 
74
- app.js
36
+ .send-area {
75
- ```
37
+ padding: 0 5px;
76
- // This is a JavaScript file
38
+ box-sizing: border-box;
39
+ line-height: 49px;
40
+ position: fixed;
77
- let pusher;
41
+ bottom: 0px;
78
- let ncmb;
42
+ width: 100%;
79
- const pusher_key = 'MY_PUSHER_KEY';
43
+ border-top: solid 1px #ccc;
44
+ }
45
+
46
+ .send-area ons-input {
80
- const pusher_cluster = 'MY_PUSHER_CLUSTER';
47
+ display: inline-block;
81
- const applicationKey = 'MY_NCMB_APPLICATION_KEY';
48
+ position: relative;
82
- const clientKey = 'MY_NCMB_CLIENT_KEY';
49
+ width: calc(100% - 60px);
50
+ }
51
+
52
+ .send-area input {
53
+ vertical-align: middle;
54
+ position: relative;
55
+ width: 98%;
56
+ }
83
57
 
58
+ #your_container{
84
- // グローバル変数の処理
59
+ /* 高さや幅など、好きな様に設定
85
- ons.ready(function() {
86
- pusher = new Pusher(pusher_key, {
87
- cluster: pusher_cluster
88
- });
89
- ncmb = new NCMB(applicationKey, clientKey);
60
+ bms_messages_containerの方で、縦横いっぱいに広がってくれるので、
90
- });
61
+ ここで充てた高さと横幅がそのままスタイルになる仕組み */
91
62
 
92
- // 初期表示処理
93
- $(document).on('init', (event) => {
94
- if (event.target.id === 'login') {
63
+ height:80%;/*ここはご自由に*/
95
- $('#chatId').val('channel');
96
- const userName = localStorage.getItem('userName');
97
- if (userName)
98
- $('#userName').val(userName);
64
+ width: 100%;/*ここはご自由に*/
99
- }
65
+ }
66
+ /* チャットの外側部分① */
67
+ #bms_messages_container{
68
+ height: 100%;/*your_containerに対して100%になる */
69
+ width: 100%;/*your_containerに対して100%になる */
70
+ background-color: #eee;
100
- });
71
+ }
101
72
 
73
+ /* タイムライン部分② */
74
+ #bms_messages {
75
+ overflow: auto;/* スクロールを効かせつつ、メッセージがタイムラインの外に出ないようにする */
76
+ height:100%;/*テキストエリアが下に張り付く様にする*/
77
+ border-right: 1px solid #ddd;
78
+ border-left: 1px solid #ddd;
79
+ background-color: #eee;
80
+ }
81
+ /* メッセージ全般のスタイル */
82
+ .bms_message {
83
+ margin: 0px;
84
+ padding: 0 14px;/*吹き出しがタイムラインの側面にひっつかない様に隙間を開ける*/
85
+ font-size: 16px;
86
+ word-wrap: break-word;/* 吹き出し内で自動で改行 */
87
+ white-space: normal;/*指定widthに合わせて、文字を自動的に改行*/
88
+ }
89
+ .bms_message_box{
90
+ margin-top: 20px;/*上下の吹き出しがひっつかない様に隙間を入れる*/
91
+ max-width: 100%;/*文字が長くなった時に吹き出しがタイムラインからはみ出さない様にする*/
92
+ font-size: 16px;
93
+ }
94
+ .bms_message_content{
95
+ padding: 10px;/*文字や画像(コンテンツ)の外側に隙間を入れる*/
96
+ }
97
+ /* メッセージ1(左側) */
98
+ .bms_left {
99
+ float: left;/*吹き出しをbms_messagesに対して左寄せ*/
100
+ line-height: 1.3em;
101
+ }
102
+ .bms_left .bms_message_box {
103
+ color: #fff;/*テキストを白にする*/
104
+ background: rgb(0, 145, 197);
105
+ border: 2px solid rgb(0, 145, 197);
106
+ /* border-radius: 30px 30px 30px 0px; 左下だけ尖らせて吹き出し感を出す*/
107
+ margin-right: 50px;/*左側の発言だとわかる様に、吹き出し右側に隙間を入れる*/
108
+ }
109
+ /* メッセージ2(右側) */
110
+ .bms_right {
111
+ float: right;/*吹き出しをbms_messagesに対して右寄せ*/
112
+ line-height: 1.3em;
113
+ }
114
+ .bms_right .bms_message_box {
115
+ color: #fff;/*テキストを白にする*/
116
+ background: rgb(0, 154, 87);
117
+ border: 2px solid rgb(0, 154, 87);
118
+ /*border-radius: 30px 30px 0px 30px;右下だけ尖らせて吹き出し感を出す*/
119
+ margin-left: 50px;/*右側の発言だとわかる様に、吹き出し左側に隙間を入れる*/
120
+ }
121
+ .bms_right .bms_message_time {
122
+ margin-left: 50px;/*右側の発言だとわかる様に、吹き出し左側に隙間を入れる*/
123
+ }
124
+ /* 回り込みを解除 */
125
+ .bms_clear {
126
+ clear: both; /* 左メッセージと右メッセージの回り込み(float)の効果の干渉を防ぐために必要(これが無いと、自分より下のメッセージにfloatが影響する) */
127
+ }
102
128
 
129
+ /* テキストエリア、送信ボタン④ */
130
+ #bms_send {
131
+ background-color:#eee;/*タイムラインの色と同じにする*/
132
+ border-right: 1px solid #ddd;
133
+ border-left: 1px solid #ddd;
134
+ border-bottom: 1px solid #ddd;
135
+ height: 48px;
136
+ padding: 4px;
137
+ }
138
+ #bms_send_message{
139
+ width: calc(100% - 75px);/*常に送信ボタンの横幅を引いたサイズに動的に計算*/
140
+ line-height: 16px;
141
+ height: 48px;
142
+ padding: 14px 6px 0px 6px;/*文字がテキストエリアの中心になる様に隙間調整*/
143
+ border: 1px solid #ccc;
144
+ border-radius: 4px;/*角丸*/
145
+ text-align: left;/*文字を左寄せ*/
146
+ box-shadow: 2px 2px 4px 0px rgba(0,0,0,0.2) inset;/*内側に影を入れてテキストエリアらしくした*/
147
+ box-sizing: border-box;/*paddingとborderの要素の高さと幅の影響をなくす(要素に高さと幅を含める)*/
148
+
149
+ }
150
+ #bms_send_btn {
151
+ width: 72px;
152
+ height: 48px;
153
+ font-size: 16px;
154
+ line-height: 3em;
155
+ float: right;/*bms_sendに対して右寄せ*/
156
+ color: #fff;
157
+ font-weight: bold;
158
+ background: #bcbcbc;
159
+ text-align: center;/*文字をボタン中央に表示*/
160
+ border: 1px solid #bbb;
161
+ border-radius: 4px;/*角丸*/
162
+ box-sizing: border-box;/*paddingとborderの要素の高さと幅の影響をなくす(要素に高さと幅を含める)*/
163
+ }
164
+ #bms_send_btn:hover {
165
+ background: #13178E; /*マウスポインタを当てた時にアクティブな色になる*/
166
+ cursor: pointer;/*マウスポインタを当てた時に、カーソルが指の形になる*/
167
+ }
168
+
169
+ ```
170
+
171
+ app.js
172
+ ```
173
+
103
174
  function task1(data) {
104
175
  return new Promise(function (resolve, reject) {
105
176
  connectPusher(data.userName, data.chatId);
@@ -138,99 +209,6 @@
138
209
  };
139
210
 
140
211
 
141
-
142
- // チャット画面から戻った時の処理
143
- $(document).on('hide', (event) => {
144
- if (event.target.id === 'chat') {
145
- pusher.unsubscribe($('#channelId').val());
146
- }
147
- });
148
-
149
- // チャットルームにログインする処理
150
- const join = () => {
151
- const userName = $('#userName').val();
152
- if (userName === '') {
153
- ons.notification
154
- .alert('ユーザ名を決めてください');
155
- return;
156
- }
157
- localStorage.setItem('userName', userName);
158
- const chatId = $('#chatId').val();
159
- $('#nav')[0].pushPage('chat.html', {
160
- data: { userName, chatId }
161
- })
162
- }
163
-
164
- // Pusherに接続する処理
165
- const connectPusher = (userName, chatId) => {
166
- console.log(userName);
167
- console.log(chatId);
168
-
169
- const channel = pusher.subscribe(chatId);
170
- channel.bind('message', function(data) {
171
- showChat(userName, data);
172
- });
173
- };
174
-
175
- // 既存のチャットメッセージを読み込む処理
176
- const loadChat = (userName, channel) => {
177
- const Chat = ncmb.DataStore('Chat');
178
- Chat
179
- .equalTo('channel', channel)
180
- .fetchAll()
181
- .then(chats => {
182
- for (let chat of chats) {
183
- showChat(userName, chat);
184
- }
185
- });
186
- }
187
-
188
- // メッセージを一つ表示する処理
189
- const showChat = (userName, data) => {
190
- if (data.userName == userName) {
191
- $('#chats').append(`
192
- <div class="bms_message bms_right">
193
- <div class="bms_message_box">
194
- <div class="bms_message_content">
195
- <div class="bms_message_text">${data.message}</div>
196
- </div>
197
- </div>
198
- </div>
199
- <div class="bms_clear"></div>`);
200
- }else{
201
- $('#chats').append(`
202
- <div class="bms_message bms_left">
203
- <div class="bms_message_box">
204
- <div class="bms_message_content">
205
- <div class="bms_message_text">${data.message}</div>
206
- </div>
207
- </div>
208
- <div class="bms_message_text">${data.userName}</div>
209
- </div>
210
- <div class="bms_clear"></div>`);
211
- }
212
- }
213
-
214
- // メッセージ送信処理
215
- const send = () => {
216
- const message = $('#message').val();
217
- const userName = localStorage.getItem('userName');
218
- const channel = $('#channelId').val();
219
-
220
- ncmb.Script
221
- .data({
222
- userName,
223
- message,
224
- channel
225
- })
226
- .exec("POST", "push.js")
227
- .then(function(res){
228
- $('#message').val('');
229
- })
230
- .catch(function(err){
231
- console.log(err.name + ':' + err.message);
232
- });
233
- };
234
212
  ```
235
213
 
236
214