@cable8mm/jquery-infinite-with-template 1.0.4 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.editorconfig +14 -0
- package/.github/workflows/publish.yml +24 -0
- package/.github/workflows/static.yml +49 -0
- package/.github/workflows/test.yml +33 -0
- package/.vscode/settings.json +4 -0
- package/AGENTS.md +216 -0
- package/README.md +266 -180
- package/examples/data_sources.json +84 -0
- package/examples/generate +55 -11
- package/examples/index.html +3 -3
- package/jest.config.js +8 -0
- package/jquery.infiniteScrollWithTemplate.d.ts +65 -0
- package/jquery.infiniteScrollWithTemplate.js +95 -10
- package/jquery.infiniteScrollWithTemplate.min.js +1 -1
- package/package.json +20 -2
- package/scripts/prepare-dist.js +72 -0
- package/tests/jquery.infiniteScrollWithTemplate.test.js +310 -0
- package/tests/setup.js +16 -0
- package/examples/data_sources.ajax +0 -84
package/README.md
CHANGED
|
@@ -1,248 +1,334 @@
|
|
|
1
|
-
# jQuery Infinite With Template Plugin
|
|
1
|
+
# ⚡ jQuery Infinite With Template Plugin
|
|
2
2
|
|
|
3
|
-

|
|
4
|
-

|
|
5
|
-

|
|
6
|
-

|
|
7
|
-

|
|
8
|
-

|
|
3
|
+
[](https://www.npmjs.com/package/@cable8mm/jquery-infinite-with-template)
|
|
4
|
+
[](https://bundlephobia.com/package/@cable8mm/jquery-infinite-with-template)
|
|
5
|
+
[](https://www.npmjs.com/package/@cable8mm/jquery-infinite-with-template)
|
|
6
|
+
[](https://www.jsdelivr.com/package/npm/@cable8mm/jquery-infinite-with-template)
|
|
7
|
+
[](https://www.npmjs.com/package/@cable8mm/jquery-infinite-with-template)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
[](https://github.com/cable8mm/jquery-infinite-with-template)
|
|
10
|
+
[](https://github.com/cable8mm/jquery-infinite-with-template/issues)
|
|
9
11
|
|
|
12
|
+
> 🚀 **AJAX-powered infinite scroll with template rendering for jQuery**
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
If you like jQuery until now, this little library will help you implement infinite scroll with ease.
|
|
12
15
|
|
|
13
|
-
|
|
16
|
+
## ✨ Features
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
- ⚡ **Zero Dependencies** (except jQuery & jsRender)
|
|
19
|
+
- 🎨 **Template Rendering** with jsRender
|
|
20
|
+
- 🔄 **Dual Loading Modes** - Scroll or Click
|
|
21
|
+
- 🎯 **TypeScript Support** out of the box
|
|
22
|
+
- 🛡️ **Error Handling** with callbacks
|
|
23
|
+
- ⚙️ **Highly Configurable** with 12+ options
|
|
24
|
+
- 🚀 **Performance Optimized** with DocumentFragment
|
|
25
|
+
- 📦 **Lightweight** - Only ~3KB minified
|
|
26
|
+
- ✅ **Well Tested** - 16 unit tests included
|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
## 📦 Installation
|
|
29
|
+
|
|
30
|
+
### npm
|
|
18
31
|
|
|
19
32
|
```sh
|
|
20
33
|
npm i @cable8mm/jquery-infinite-with-template
|
|
21
34
|
```
|
|
22
35
|
|
|
23
|
-
|
|
36
|
+
### CDN
|
|
24
37
|
|
|
25
38
|
```html
|
|
26
|
-
<script
|
|
39
|
+
<script
|
|
40
|
+
src="https://cdn.jsdelivr.net/npm/@cable8mm/jquery-infinite-with-template@1.0.4/jquery.infiniteScrollWithTemplate.min.js"
|
|
41
|
+
integrity="sha256-bX3iyCp0T50YmDRgpUl1tY/LGlpPGsKR4TqUkpcq6WA="
|
|
42
|
+
crossorigin="anonymous"
|
|
43
|
+
></script>
|
|
27
44
|
```
|
|
28
45
|
|
|
29
|
-
|
|
46
|
+
### ESM
|
|
30
47
|
|
|
31
48
|
```html
|
|
32
|
-
<script type="module">
|
|
49
|
+
<script type="module">
|
|
50
|
+
import @cable8mm/jquery-infinite-with-template from https://cdn.jsdelivr.net/npm/@cable8mm/jquery-infinite-with-template@1.0.4/+esm
|
|
51
|
+
</script>
|
|
33
52
|
```
|
|
34
53
|
|
|
35
|
-
## Demo
|
|
54
|
+
## 🎬 Demo
|
|
36
55
|
|
|
37
|
-
|
|
56
|
+
### Online Demo
|
|
38
57
|
|
|
39
|
-
|
|
40
|
-
|
|
58
|
+
You can test the plugin directly in your browser:
|
|
59
|
+
|
|
60
|
+
👉 **[https://www.palgle.com/jquery-infinite-with-template/examples/index.html](https://www.palgle.com/jquery-infinite-with-template/examples/index.html)**
|
|
61
|
+
|
|
62
|
+
### Quick Start
|
|
41
63
|
|
|
42
|
-
|
|
64
|
+
#### Using npm run dev (Recommended)
|
|
43
65
|
|
|
44
|
-
|
|
66
|
+
```bash
|
|
67
|
+
# Install dependencies (one-time)
|
|
68
|
+
npm install
|
|
69
|
+
|
|
70
|
+
# Run development server with auto-open
|
|
71
|
+
npm run dev
|
|
45
72
|
```
|
|
46
73
|
|
|
47
|
-
|
|
74
|
+
**Note:** This will start the server at `http://127.0.0.1:8080/examples/index.html` and automatically open it in your browser.
|
|
48
75
|
|
|
49
|
-
|
|
76
|
+
Visit [http://127.0.0.1:8080/examples/index.html](http://127.0.0.1:8080/examples/index.html) in your browser.
|
|
50
77
|
|
|
51
|
-
|
|
78
|
+
### Regenerate Demo Data
|
|
52
79
|
|
|
53
80
|
```bash
|
|
54
|
-
#
|
|
55
|
-
|
|
81
|
+
# Using PHP CLI
|
|
82
|
+
php examples/generate > examples/data_sources.json
|
|
83
|
+
|
|
84
|
+
# Or if you have the generate script in examples directory
|
|
85
|
+
cd examples
|
|
86
|
+
php generate > data_sources.json
|
|
56
87
|
```
|
|
57
88
|
|
|
58
|
-
## Usage
|
|
89
|
+
## 🚀 Usage
|
|
59
90
|
|
|
60
|
-
|
|
91
|
+
### Basic Example
|
|
61
92
|
|
|
62
|
-
|
|
63
|
-
$("#result").infiniteTemplate({
|
|
64
|
-
templateSelector: "#test-tmpl",
|
|
65
|
-
dataPath: "data_sources.ajax",
|
|
66
|
-
query: "word=ajax",
|
|
67
|
-
templateHelpers: {
|
|
68
|
-
authId : 354
|
|
69
|
-
},
|
|
70
|
-
zeroCallback: function () {
|
|
71
|
-
alert("zero alert");
|
|
72
|
-
},
|
|
73
|
-
});
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
HTML part:
|
|
93
|
+
**HTML:**
|
|
77
94
|
|
|
78
95
|
```html
|
|
79
96
|
<div id="result"></div>
|
|
80
97
|
|
|
81
98
|
<script id="test-tmpl" type="text/x-jsrender">
|
|
82
|
-
|
|
99
|
+
<div class="item">
|
|
100
|
+
<h3>{{:title}}</h3>
|
|
101
|
+
<p>ID: {{:id}}</p>
|
|
102
|
+
</div>
|
|
83
103
|
</script>
|
|
84
104
|
```
|
|
85
105
|
|
|
86
|
-
|
|
106
|
+
**JavaScript:**
|
|
87
107
|
|
|
88
108
|
```javascript
|
|
109
|
+
$("#result").infiniteTemplate({
|
|
110
|
+
templateSelector: "#test-tmpl",
|
|
111
|
+
dataPath: "/api/posts",
|
|
112
|
+
query: "category=tech",
|
|
113
|
+
templateHelpers: {
|
|
114
|
+
userId: 123,
|
|
115
|
+
},
|
|
116
|
+
zeroCallback: function () {
|
|
117
|
+
console.log("No more posts!");
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Server Response (JSON):**
|
|
123
|
+
|
|
124
|
+
```json
|
|
89
125
|
{
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
},
|
|
103
|
-
...even more rows
|
|
126
|
+
"data": [
|
|
127
|
+
{
|
|
128
|
+
"id": 1,
|
|
129
|
+
"title": "Getting Started with jQuery",
|
|
130
|
+
"content": "..."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": 2,
|
|
134
|
+
"title": "Advanced JavaScript Patterns",
|
|
135
|
+
"content": "..."
|
|
136
|
+
}
|
|
137
|
+
]
|
|
104
138
|
}
|
|
105
139
|
```
|
|
106
140
|
|
|
107
|
-
|
|
141
|
+
### Click-to-Load Button
|
|
108
142
|
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
<p>329. 865t05x9DMngrETccBuqrY7ts9Xt3R(word=ajax) [user:354]</p>
|
|
117
|
-
<p>84. D6mhKuRA06ONCE5HbswSwPjZvp0bUh(word=ajax) [user:354]</p>
|
|
118
|
-
<p>528. saWL46OBtTDGIBuZL9TkmfBvPXiRqM(word=ajax) [user:354]</p>
|
|
119
|
-
<p>522. PBe0jjP1Egy6NWpHzuA86JHupxNGvc(word=ajax) [user:354]</p>
|
|
120
|
-
<p>115. vBmfL7osq2VAKIktVznrC6QZzYpc1H(word=ajax) [user:354]</p>
|
|
121
|
-
<p>722. mti7aMut4TxAygKAdfGylml9QgJoDN(word=ajax) [user:354]</p>
|
|
122
|
-
<p>401. 06kgapSQylxWJOvFmDNLIcvpSPMB7V(word=ajax) [user:354]</p>
|
|
123
|
-
<p>245. UD0TP3bMU7J4mAlGqwo52F1I0rJIyR(word=ajax) [user:354]</p>
|
|
124
|
-
<p>985. 3xSyr0m68K3Ec6y8vJgIhYgSfgcGnG(word=ajax) [user:354]</p>
|
|
125
|
-
<p>78. DWpWRzx1x4Ibfh1Gn0Lk0F3aufu34d(word=ajax) [user:354]</p>
|
|
126
|
-
<p>573. iINBTozeMIeZguTU6lLB9j76zNZ4AK(word=ajax) [user:354]</p>
|
|
127
|
-
<p>946. OEuUblddtI9vqlyL89nDXizhvryn4e(word=ajax) [user:354]</p>
|
|
128
|
-
<p>756. wsBL8dxDf6UjTiNWNnnX4XAlAonHBM(word=ajax) [user:354]</p>
|
|
129
|
-
<p>66. q3irGi5lNUXccTDTDfl2jRlzVp04uk(word=ajax) [user:354]</p>
|
|
130
|
-
<p>20. vcq8sKN4RhCEoFLVW2vbX2eR14EKp8(word=ajax) [user:354]</p>
|
|
131
|
-
</div>
|
|
143
|
+
```javascript
|
|
144
|
+
$("#result").infiniteTemplate({
|
|
145
|
+
templateSelector: "#item-template",
|
|
146
|
+
dataPath: "/api/items",
|
|
147
|
+
loadSelector: "#load-more-btn", // Click this button to load more
|
|
148
|
+
loadAtStart: false, // Don't load automatically
|
|
149
|
+
});
|
|
132
150
|
```
|
|
133
151
|
|
|
134
|
-
|
|
152
|
+
### With Error Handling
|
|
135
153
|
|
|
136
|
-
|
|
154
|
+
```javascript
|
|
155
|
+
$("#result").infiniteTemplate({
|
|
156
|
+
templateSelector: "#item-template",
|
|
157
|
+
dataPath: "/api/items",
|
|
158
|
+
errorCallback: function (error) {
|
|
159
|
+
console.error("Failed to load:", error);
|
|
160
|
+
alert("Something went wrong. Please try again.");
|
|
161
|
+
},
|
|
162
|
+
loadingCallback: function () {
|
|
163
|
+
$("#loading").show();
|
|
164
|
+
},
|
|
165
|
+
loadedCallback: function () {
|
|
166
|
+
$("#loading").hide();
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
```
|
|
137
170
|
|
|
138
|
-
|
|
171
|
+
## 📋 Options
|
|
172
|
+
|
|
173
|
+
| Option | Type | Default | Description |
|
|
174
|
+
| -------------------- | ---------- | ------------ | ------------------------------------------------------------ |
|
|
175
|
+
| **templateSelector** | `string` | **required** | jsRender template selector (e.g., `"#my-template"`) |
|
|
176
|
+
| **dataPath** | `string` | **required** | URL to load data via AJAX |
|
|
177
|
+
| **key** | `string` | `"data"` | Key for data array in JSON response |
|
|
178
|
+
| **query** | `string` | `null` | Additional query parameters (e.g., `"category=1&sort=date"`) |
|
|
179
|
+
| **method** | `string` | `"GET"` | HTTP method (GET, POST, PUT, DELETE) |
|
|
180
|
+
| **templateHelpers** | `object` | `null` | Helper data merged with each item |
|
|
181
|
+
| **loadAtStart** | `boolean` | `true` | Load data on initialization |
|
|
182
|
+
| **loadSelector** | `string` | `null` | CSS selector for click-to-load button |
|
|
183
|
+
| **initialPage** | `number` | `1` | Initial page number |
|
|
184
|
+
| **preventCache** | `boolean` | `false` | Add timestamp to prevent caching |
|
|
185
|
+
| **scrollThreshold** | `number` | `2` | Multiplier for viewport height (lower = more sensitive) |
|
|
186
|
+
| **zeroCallback** | `function` | `null` | Called when no data returned on first page |
|
|
187
|
+
| **errorCallback** | `function` | `null` | Called on AJAX or JSON parse error |
|
|
188
|
+
| **loadingCallback** | `function` | `null` | Called when loading starts |
|
|
189
|
+
| **loadedCallback** | `function` | `null` | Called when loading completes (success or error) |
|
|
190
|
+
|
|
191
|
+
## 🎯 Real-World Examples
|
|
192
|
+
|
|
193
|
+
### Example 1: Blog Posts with Pagination
|
|
139
194
|
|
|
140
|
-
|
|
195
|
+
```javascript
|
|
196
|
+
$("#post-list").infiniteTemplate({
|
|
197
|
+
templateSelector: "#post-template",
|
|
198
|
+
dataPath: "/api/posts",
|
|
199
|
+
query: "status=published",
|
|
200
|
+
initialPage: 1,
|
|
201
|
+
scrollThreshold: 1.5,
|
|
202
|
+
templateHelpers: {
|
|
203
|
+
currentUser: window.currentUser,
|
|
204
|
+
},
|
|
205
|
+
loadingCallback: () => $("#spinner").show(),
|
|
206
|
+
loadedCallback: () => $("#spinner").hide(),
|
|
207
|
+
zeroCallback: () => $("#end-message").show(),
|
|
208
|
+
});
|
|
209
|
+
```
|
|
141
210
|
|
|
142
|
-
|
|
211
|
+
### Example 2: E-commerce Product Grid
|
|
143
212
|
|
|
144
|
-
|
|
213
|
+
```javascript
|
|
214
|
+
$("#product-grid").infiniteTemplate({
|
|
215
|
+
templateSelector: "#product-card",
|
|
216
|
+
dataPath: "/api/products",
|
|
217
|
+
query: "category=electronics&sort=price",
|
|
218
|
+
loadSelector: "#load-more-products",
|
|
219
|
+
loadAtStart: true,
|
|
220
|
+
templateHelpers: {
|
|
221
|
+
currency: "$",
|
|
222
|
+
discountRate: 0.1,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
```
|
|
145
226
|
|
|
146
|
-
|
|
227
|
+
### Example 3: Social Media Feed
|
|
147
228
|
|
|
148
|
-
|
|
229
|
+
```javascript
|
|
230
|
+
$("#feed").infiniteTemplate({
|
|
231
|
+
templateSelector: "#feed-item",
|
|
232
|
+
dataPath: "/api/feed",
|
|
233
|
+
method: "POST",
|
|
234
|
+
query: "filter=following",
|
|
235
|
+
initialPage: 3,
|
|
236
|
+
preventCache: true,
|
|
237
|
+
templateHelpers: {
|
|
238
|
+
currentUserId: Auth.id(),
|
|
239
|
+
likedPosts: Auth.likedPosts(),
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
```
|
|
149
243
|
|
|
150
|
-
|
|
244
|
+
### Example 4: Search Results
|
|
151
245
|
|
|
152
|
-
|
|
246
|
+
```javascript
|
|
247
|
+
$("#search-results").infiniteTemplate({
|
|
248
|
+
templateSelector: "#result-item",
|
|
249
|
+
dataPath: "/api/search",
|
|
250
|
+
query: `q=${encodeURIComponent(searchQuery)}`,
|
|
251
|
+
zeroCallback: () => {
|
|
252
|
+
$("#no-results").show();
|
|
253
|
+
},
|
|
254
|
+
errorCallback: (error) => {
|
|
255
|
+
console.error("Search failed:", error);
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
```
|
|
153
259
|
|
|
154
|
-
|
|
260
|
+
## 🏗️ Project Structure
|
|
261
|
+
|
|
262
|
+
```text
|
|
263
|
+
jquery-infinite-with-template/
|
|
264
|
+
├── jquery.infiniteScrollWithTemplate.js # Main plugin (unminified)
|
|
265
|
+
├── jquery.infiniteScrollWithTemplate.min.js # Minified version
|
|
266
|
+
├── jquery.infiniteScrollWithTemplate.d.ts # TypeScript definitions
|
|
267
|
+
├── package.json
|
|
268
|
+
├── README.md
|
|
269
|
+
├── LICENSE
|
|
270
|
+
├── examples/
|
|
271
|
+
│ ├── index.html # Demo page
|
|
272
|
+
│ ├── data_sources.json # Demo data
|
|
273
|
+
│ └── generate # Data generator script
|
|
274
|
+
└── tests/
|
|
275
|
+
├── setup.js # Test configuration
|
|
276
|
+
└── jquery.infiniteScrollWithTemplate.test.js # 16 unit tests
|
|
277
|
+
```
|
|
155
278
|
|
|
156
|
-
|
|
279
|
+
## 🧪 Testing
|
|
157
280
|
|
|
158
|
-
|
|
281
|
+
```bash
|
|
282
|
+
# Install dependencies
|
|
283
|
+
npm install
|
|
159
284
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
<x-adoption.rounded-card-list :selector="'adoption-rounded-card-list'">
|
|
164
|
-
@foreach($adoptions as $item)
|
|
165
|
-
<x-adoption.rounded-card :item="$item" />
|
|
166
|
-
@endforeach
|
|
167
|
-
</x-adoption.rounded-card-list>
|
|
168
|
-
<x-adoption.rounded-card-tmpl />
|
|
169
|
-
<script>
|
|
170
|
-
$("#adoption-rounded-card-list").infiniteTemplate({
|
|
171
|
-
templateSelector: "#adoption-rounded-card-tmpl",
|
|
172
|
-
dataPath: "/api/adoption",
|
|
173
|
-
initialPage: 3,
|
|
174
|
-
});
|
|
175
|
-
</script>
|
|
285
|
+
# Run tests
|
|
286
|
+
npm test
|
|
176
287
|
```
|
|
177
288
|
|
|
178
|
-
|
|
179
|
-
// https://m.holapet.com/place/pensions/region/1
|
|
180
|
-
|
|
181
|
-
<x-place.rounded-card-list :selector="'place-rounded-card-list'">
|
|
182
|
-
@foreach($region->placesRecent as $item)
|
|
183
|
-
<x-place.rounded-card :item="$item" />
|
|
184
|
-
@endforeach
|
|
185
|
-
</x-place.rounded-card-list>
|
|
186
|
-
<x-place.rounded-card-tmpl />
|
|
187
|
-
<script>
|
|
188
|
-
$("#place-rounded-card-list").infiniteTemplate({
|
|
189
|
-
templateSelector: "#place-rounded-card-tmpl",
|
|
190
|
-
dataPath: "/api/place/pensions/region/{{ $region->id }}",
|
|
191
|
-
initialPage: 3,
|
|
192
|
-
templateHelpers: {
|
|
193
|
-
minColumnCount: 1
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
</script>
|
|
197
|
-
```
|
|
289
|
+
**Test Coverage:**
|
|
198
290
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
<script>
|
|
206
|
-
$("#user-list").infiniteTemplate({
|
|
207
|
-
templateSelector: "#user-tmpl",
|
|
208
|
-
dataPath: "/api/user",
|
|
209
|
-
query: "word={{ $word }}",
|
|
210
|
-
templateHelpers: {
|
|
211
|
-
authId : {{ Auth::id() ?? 0 }},
|
|
212
|
-
followeeIds: {!! Auth::user()->followee_ids->toJson() ?? 'false' !!}
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
</script>
|
|
216
|
-
@endauth
|
|
217
|
-
@guest
|
|
218
|
-
<script>
|
|
219
|
-
$("#user-list").infiniteTemplate({
|
|
220
|
-
templateSelector: "#user-tmpl",
|
|
221
|
-
dataPath: "/api/user",
|
|
222
|
-
query: "word={{ $word }}",
|
|
223
|
-
});
|
|
224
|
-
</script>
|
|
225
|
-
@endguest
|
|
226
|
-
```
|
|
291
|
+
- ✅ Initialization & validation
|
|
292
|
+
- ✅ Data loading & rendering
|
|
293
|
+
- ✅ Callbacks (zero, error, loading, loaded)
|
|
294
|
+
- ✅ Scroll & click loading modes
|
|
295
|
+
- ✅ URL building & pagination
|
|
296
|
+
- ✅ Edge cases (empty data, JSON parsing)
|
|
227
297
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
298
|
+
## 🤝 Contributing
|
|
299
|
+
|
|
300
|
+
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
301
|
+
|
|
302
|
+
1. Fork the project
|
|
303
|
+
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
|
|
304
|
+
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
|
|
305
|
+
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
|
306
|
+
5. Open a Pull Request
|
|
307
|
+
|
|
308
|
+
## 📝 License
|
|
309
|
+
|
|
310
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
311
|
+
|
|
312
|
+
## 🙏 Credits
|
|
313
|
+
|
|
314
|
+
- **jsRender** - Template engine
|
|
315
|
+
- **jQuery** - DOM manipulation
|
|
316
|
+
|
|
317
|
+
## 💡 Tips for Getting Stars
|
|
318
|
+
|
|
319
|
+
- ⭐ Star this repo if you find it useful!
|
|
320
|
+
- 🐛 Report bugs and request features
|
|
321
|
+
- 📢 Share with your developer friends
|
|
322
|
+
- 💬 Leave feedback and suggestions
|
|
323
|
+
|
|
324
|
+
## 🔗 Links
|
|
325
|
+
|
|
326
|
+
- **GitHub**: [https://github.com/cable8mm/jquery-infinite-with-template](https://github.com/cable8mm/jquery-infinite-with-template)
|
|
327
|
+
- **NPM**: [https://www.npmjs.com/package/@cable8mm/jquery-infinite-with-template](https://www.npmjs.com/package/@cable8mm/jquery-infinite-with-template)
|
|
328
|
+
- **Issues**: [https://github.com/cable8mm/jquery-infinite-with-template/issues](https://github.com/cable8mm/jquery-infinite-with-template/issues)
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
**Made with ❤️ by [Sam Lee](https://github.com/cable8mm)**
|
|
247
333
|
|
|
248
|
-
|
|
334
|
+
If this project helped you, please give it a ⭐️!
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"data": [
|
|
3
|
+
{
|
|
4
|
+
"id": 886,
|
|
5
|
+
"title": "ZjLn9jCi1w8nsFSye6A2q9cuu78U88(word=None)"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"id": 91,
|
|
9
|
+
"title": "VVTFOrWminUAi8E3whuFiyi76sf6L3(word=None)"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": 654,
|
|
13
|
+
"title": "Roc3yFmOHpm4Koj8hhuRr5fBNAUcxZ(word=None)"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": 788,
|
|
17
|
+
"title": "zR7rzbUz81pPYFxvm3NBDFGCUqB0cy(word=None)"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": 7,
|
|
21
|
+
"title": "1OHxyIMH9DahoskhqVbCFINH3aVysn(word=None)"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": 915,
|
|
25
|
+
"title": "9kX2B97YL0onvcE4nRETuACESX9YIM(word=None)"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": 125,
|
|
29
|
+
"title": "jc5fTJ5Y1QzYOtQy6XhiMlRxq05KAc(word=None)"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 362,
|
|
33
|
+
"title": "rsoNXzq590AQzf6Hp0Gi8rHQfaz9KI(word=None)"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": 101,
|
|
37
|
+
"title": "1msDlWisPm0Q9oUofPdhgjOHuZtlep(word=None)"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": 206,
|
|
41
|
+
"title": "nev0CvpOKc1E0zUuvTrgMUluSowoz5(word=None)"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": 544,
|
|
45
|
+
"title": "aIMdZ9LAf5SDl9hmeFIqzCMgU2joOx(word=None)"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": 415,
|
|
49
|
+
"title": "ikYBbV7nA4S2LPCWk2TYXQ4H5Vp7ia(word=None)"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": 717,
|
|
53
|
+
"title": "H6u32LKXqbgU8rx7UTjsALjKfUPZru(word=None)"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": 536,
|
|
57
|
+
"title": "JuyIiHNlLn0H97APMtB5ng72GAVzBr(word=None)"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": 554,
|
|
61
|
+
"title": "e8cbqBh9ifoEI2nFqyryDBwE87Boy2(word=None)"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": 111,
|
|
65
|
+
"title": "yCJNeoMlqkuNazccgeKwMoj2d9xC6v(word=None)"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"id": 134,
|
|
69
|
+
"title": "2qZpgg3lJ3djS5RG5IZzZjdtf7Y9IJ(word=None)"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": 523,
|
|
73
|
+
"title": "LC84RteVTWGuAgDDhknpb7jREpqdfY(word=None)"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": 946,
|
|
77
|
+
"title": "q0NnpnSWosOwbxIYQE3ZiMbuqJKG40(word=None)"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": 30,
|
|
81
|
+
"title": "sHc5R2u1W0T45AMxQRx73gAFbGHXk0(word=None)"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|