1
+ <!DOCTYPE html>
2
+
3
+ < html >
4
+ < head >
5
+ < meta charset ="utf-8 ">
6
+
7
+ < title > Week12 留言板</ title >
8
+ < meta name ="viewport " content ="width=device-width, initial-scale=1 ">
9
+ < script src ="https://code.jquery.com/jquery-3.5.1.min.js "> </ script >
10
+ < link rel ="stylesheet " href ="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css " integrity ="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z " crossorigin ="anonymous ">
11
+ < style >
12
+ .card {
13
+ margin-top : 12px ;
14
+ }
15
+ </ style >
16
+ < script >
17
+ function escape ( toOutput ) {
18
+ return toOutput . replace ( / \& / g, '&' )
19
+ . replace ( / \< / g, '<' )
20
+ . replace ( / \> / g, '>' )
21
+ . replace ( / \" / g, '"' )
22
+ . replace ( / \' / g, ''' )
23
+ . replace ( / \/ / g, '/' ) ;
24
+ }
25
+
26
+ function appendCommentToDOM ( container , comment , isPrepend ) {
27
+ const html = `
28
+ <div class="card">
29
+ <div class="card-body">
30
+ <h5 class="card-title">${ comment . id } ${ escape ( comment . nickname ) } </h5>
31
+ <p class="card-text">${ escape ( comment . content ) } </p>
32
+ </div>
33
+ </div>
34
+ `
35
+ if ( isPrepend ) {
36
+ container . prepend ( html )
37
+ } else {
38
+ container . append ( html )
39
+ }
40
+ }
41
+
42
+ function getCommentsAPI ( siteKey , before , cb ) {
43
+ let url = `http://localhost:8080/huli/be101/board-api/api_comments.php?site_key=${ siteKey } `
44
+ if ( before ) {
45
+ url += '&before=' + before
46
+ }
47
+ $ . ajax ( {
48
+ url,
49
+ } ) . done ( function ( data ) {
50
+ cb ( data )
51
+ } ) ;
52
+ }
53
+
54
+ const siteKey = 'huli'
55
+ const loadMoreButtonHTML = '<button class="load-more btn btn-primary">載入更多</button>'
56
+ let lastId = null
57
+ let isEnd = false
58
+
59
+ $ ( document ) . ready ( ( ) => {
60
+ const commentDOM = $ ( '.comments' )
61
+ getComments ( )
62
+
63
+ $ ( '.comments' ) . on ( 'click' , '.load-more' , ( ) => {
64
+ getComments ( )
65
+ } )
66
+
67
+ $ ( '.add-comment-form' ) . submit ( e => {
68
+ e . preventDefault ( ) ;
69
+ const newCommentData = {
70
+ site_key : 'huli' ,
71
+ nickname : $ ( 'input[name=nickname]' ) . val ( ) ,
72
+ content : $ ( 'textarea[name=content]' ) . val ( )
73
+ }
74
+ $ . ajax ( {
75
+ type : 'POST' ,
76
+ url : 'http://localhost:8080/huli/be101/board-api/api_add_comments.php' ,
77
+ data : newCommentData
78
+ } ) . done ( function ( data ) {
79
+ if ( ! data . ok ) {
80
+ alert ( data . message )
81
+ return
82
+ }
83
+ $ ( 'input[name=nickname]' ) . val ( '' )
84
+ $ ( 'textarea[name=content]' ) . val ( '' )
85
+ appendCommentToDOM ( commentDOM , newCommentData , true )
86
+ } ) ;
87
+ } )
88
+ } )
89
+
90
+ function getComments ( ) {
91
+ const commentDOM = $ ( '.comments' )
92
+ $ ( '.load-more' ) . hide ( )
93
+ if ( isEnd ) {
94
+ return
95
+ }
96
+ getCommentsAPI ( siteKey , lastId , data => {
97
+ if ( ! data . ok ) {
98
+ alert ( data . message )
99
+ return
100
+ }
101
+
102
+ const comments = data . discussions ;
103
+ for ( let comment of comments ) {
104
+ appendCommentToDOM ( commentDOM , comment )
105
+ }
106
+ let length = comments . length
107
+ if ( length === 0 ) {
108
+ isEnd = true
109
+ $ ( '.load-more' ) . hide ( )
110
+ } else {
111
+ lastId = comments [ length - 1 ] . id
112
+ $ ( '.comments' ) . append ( loadMoreButtonHTML )
113
+ }
114
+
115
+ } )
116
+ }
117
+ </ script >
118
+ </ head >
119
+
120
+ < body >
121
+ < div class ="container ">
122
+ < form class ="add-comment-form ">
123
+ < div class ="form-group ">
124
+ < label for ="form-nickname "> 暱稱</ label >
125
+ < input name ="nickname " type ="text " class ="form-control " id ="form-nickname " >
126
+ </ div >
127
+ < div class ="form-group ">
128
+ < label for ="content-textarea "> 留言內容</ label >
129
+ < textarea name ='content ' class ="form-control " id ="content-textarea " rows ="3 "> </ textarea >
130
+ </ div >
131
+ < button type ="submit " class ="btn btn-primary "> 送出</ button >
132
+ </ form >
133
+ < div class ="comments ">
134
+ </ div >
135
+ </ div >
136
+
137
+ </ body >
138
+ </ html >
0 commit comments