質問編集履歴

1

jqueryのコードを追加しました

2015/02/27 06:40

投稿

ao_love
ao_love

スコア441

test CHANGED
File without changes
test CHANGED
@@ -79,3 +79,387 @@
79
79
 
80
80
 
81
81
  よろしくお願いします。
82
+
83
+
84
+
85
+ =========追記
86
+
87
+
88
+
89
+ `jquery.addInputArea.4.6.1.js`のコードは以下の通りです。
90
+
91
+ ```lang-javascript
92
+
93
+ /**
94
+
95
+ * jQuery Plugin
96
+
97
+ * jquery.addInputArea.4.6.1
98
+
99
+ * Yuusaku Miyazaki (toumin.m7@gmail.com)
100
+
101
+ * MIT License
102
+
103
+ */
104
+
105
+ (function($) {
106
+
107
+
108
+
109
+ $.fn.addInputArea = function(option) {
110
+
111
+ return this.each(function() {
112
+
113
+ Object.create(addInputArea).init(this, option);
114
+
115
+ });
116
+
117
+ };
118
+
119
+ var addInputArea = {
120
+
121
+ /**
122
+
123
+ * 初期化
124
+
125
+ */
126
+
127
+ init: function(elem, option) {
128
+
129
+ this.elem = elem;
130
+
131
+ return this
132
+
133
+ .setOption(option)
134
+
135
+ .setDelBtnVisibility()
136
+
137
+ .setEventHandler()
138
+
139
+ .setNameAttribute()
140
+
141
+ .saveOriginal();
142
+
143
+ },
144
+
145
+ /**
146
+
147
+ * オプションを使用準備
148
+
149
+ */
150
+
151
+ setOption: function(option) {
152
+
153
+ var id = $(this.elem).attr('id');
154
+
155
+ this.option = $.extend({
156
+
157
+ attr_name : (id) ? id + '_%d' : 'aia_%d',
158
+
159
+ area_var : (id) ? '.' + id + '_var' : '.aia_var',
160
+
161
+ area_del : false,
162
+
163
+ btn_del : (id) ? '.' + id + '_del' : '.aia_del',
164
+
165
+ btn_add : (id) ? '.' + id + '_add' : '.aia_add',
166
+
167
+ after_add : false,
168
+
169
+ maximum : false
170
+
171
+ }, option);
172
+
173
+ if (!this.option.area_del) this.option.area_del = this.option.btn_del;
174
+
175
+ return this;
176
+
177
+ },
178
+
179
+ /**
180
+
181
+ * 削除ボタンの表示状態を決定する
182
+
183
+ */
184
+
185
+ setDelBtnVisibility: function() {
186
+
187
+ if ($(this.elem).find(this.option.area_var).length == 1) {
188
+
189
+ $(this.elem).find(this.option.area_del).hide();
190
+
191
+ }
192
+
193
+ return this;
194
+
195
+ },
196
+
197
+ /**
198
+
199
+ * イベントハンドラ設定
200
+
201
+ */
202
+
203
+ setEventHandler: function() {
204
+
205
+ var self = this;
206
+
207
+ // --------------------------------
208
+
209
+ //『追加』ボタンを押した場合の処理
210
+
211
+ // --------------------------------
212
+
213
+ $(document).on('click', this.option.btn_add, function(ev) {
214
+
215
+ // 品目入力欄を追加
216
+
217
+ var len_list = $(self.elem).find(self.option.area_var).length;
218
+
219
+ var new_list = $(self.option.original).clone(true);
220
+
221
+
222
+
223
+ $(new_list).find('[name]').each(function(idx, obj) {
224
+
225
+ // name, id属性を変更
226
+
227
+ self._changeAttrAlongFormat(obj, len_list, 'name');
228
+
229
+ self._changeAttrAlongFormat(obj, len_list, 'id');
230
+
231
+
232
+
233
+ // val, textを空にする。
234
+
235
+ if ($(obj).attr('empty_val') != 'false') {
236
+
237
+ if (
238
+
239
+ $(obj).attr('type') == 'checkbox' ||
240
+
241
+ $(obj).attr('type') == 'radio'
242
+
243
+ ) {
244
+
245
+ obj.checked = false;
246
+
247
+ } else if (
248
+
249
+ $(obj).attr('type') != 'submit' &&
250
+
251
+ $(obj).attr('type') != 'reset' &&
252
+
253
+ $(obj).attr('type') != 'image' &&
254
+
255
+ $(obj).attr('type') != 'button'
256
+
257
+ ) {
258
+
259
+ $(obj).val('');
260
+
261
+ }
262
+
263
+ }
264
+
265
+ });
266
+
267
+ $(new_list).find('[for]').each(function(idx, obj) {
268
+
269
+ // for属性を変更
270
+
271
+ self._changeAttrAlongFormat(obj, len_list, 'for');
272
+
273
+ });
274
+
275
+
276
+
277
+ $(self.elem).append(new_list);
278
+
279
+ // 入力欄が2つ以上になるので、削除ボタンを表示する
280
+
281
+ $(self.elem).find(self.option.area_del).show();
282
+
283
+
284
+
285
+ // 追加上限
286
+
287
+ if (
288
+
289
+ self.option.maximum !== false &&
290
+
291
+ $(self.elem).find(self.option.area_var).length >= self.option.maximum
292
+
293
+ ) {
294
+
295
+ $(self.option.btn_add).hide();
296
+
297
+ }
298
+
299
+ // 追加後の処理があれば実行する
300
+
301
+ if (typeof self.option.after_add == 'function') self.option.after_add();
302
+
303
+ });
304
+
305
+ // --------------------------------
306
+
307
+ //『削除』ボタンを押した場合の処理
308
+
309
+ // --------------------------------
310
+
311
+ $(self.elem).on('click', self.option.btn_del, function(ev) {
312
+
313
+ ev.preventDefault();
314
+
315
+ var check_tmp = confirm('削除してよろしいですか?');
316
+
317
+ if(check_tmp){
318
+
319
+ //品目入力欄を削除
320
+
321
+ var idx = $(self.elem).find(self.option.btn_del).index(ev.target);
322
+
323
+ $(self.elem).find(self.option.area_var).eq(idx).remove();
324
+
325
+
326
+
327
+ var len_list = $(self.elem).find(self.option.area_var).length;
328
+
329
+
330
+
331
+ // 入力欄がひとつになるなら、削除ボタンは不要なので非表示にする
332
+
333
+ if(len_list == 1) $(self.elem).find(self.option.area_del).hide();
334
+
335
+
336
+
337
+ // 入力欄の番号を振り直す
338
+
339
+ self.setNameAttribute();
340
+
341
+
342
+
343
+ // 追加上限
344
+
345
+ if (
346
+
347
+ self.option.maximum !== false &&
348
+
349
+ $(self.elem).find(self.option.area_var).length < self.option.maximum
350
+
351
+ ) {
352
+
353
+ $(self.option.btn_add).show();
354
+
355
+ }
356
+
357
+ }
358
+
359
+ });
360
+
361
+ return this;
362
+
363
+ },
364
+
365
+ /**
366
+
367
+ * 入力欄の番号を振り直す
368
+
369
+ */
370
+
371
+ setNameAttribute: function() {
372
+
373
+ var self = this;
374
+
375
+ $(this.elem).find(this.option.area_var).each(function(idx, obj) {
376
+
377
+ $(obj).find('[name]').each(function(idx_2, obj_2) {
378
+
379
+ // name, id属性を変更
380
+
381
+ self._changeAttrAlongFormat(obj_2, idx, 'name');
382
+
383
+ self._changeAttrAlongFormat(obj_2, idx, 'id');
384
+
385
+ }).end()
386
+
387
+ .find('[for]').each(function(idx_2, obj_2) {
388
+
389
+ // for属性を変更
390
+
391
+ self._changeAttrAlongFormat(obj_2, idx, 'for');
392
+
393
+ });
394
+
395
+ });
396
+
397
+ return this;
398
+
399
+ },
400
+
401
+ /**
402
+
403
+ * クローン元を保管する
404
+
405
+ */
406
+
407
+ saveOriginal: function() {
408
+
409
+ this.option.original = $(this.elem).find(this.option.area_var).eq(0).clone(true);
410
+
411
+ return this;
412
+
413
+ },
414
+
415
+ /**
416
+
417
+ * 入力欄の番号を振り直す
418
+
419
+ * @called setEventHandler, setNameAttribute
420
+
421
+ * @params object obj (プラグインを適用するリスト)
422
+
423
+ * @params number idx 通し番号を変更する値
424
+
425
+ * @params string type 属性の名前
426
+
427
+ */
428
+
429
+ _changeAttrAlongFormat: function(obj, idx, type) {
430
+
431
+ var changed = null;
432
+
433
+ if (/(?:(?![0-9]+$).)+[0-9]+$/.test($(obj).attr(type))) {
434
+
435
+ changed = $(obj).attr(type).replace(
436
+
437
+ /((?:(?![0-9]+$).)+)[0-9]+$/,
438
+
439
+ function() { return arguments[1] + idx; }
440
+
441
+ );
442
+
443
+ } else {
444
+
445
+ changed = (type == 'name' && $(obj).attr('name_format')) ?
446
+
447
+ $(obj).attr('name_format').replace('%d', idx) :
448
+
449
+ ($(obj).attr('id_format')) ?
450
+
451
+ $(obj).attr('id_format').replace('%d', idx) : false;
452
+
453
+ }
454
+
455
+ $(obj).attr(type, changed);
456
+
457
+ }
458
+
459
+ };
460
+
461
+
462
+
463
+ })(jQuery);
464
+
465
+ ```