PageSourceSearch

https://screenonline.jp/static/lib/js/contact.js?260929023659

js screenonline.jp collected 2026-10-02 07:39:53 UTC 4,777 bytes, 151 lines download raw bytes

1/*******************************
2 * 汎用コンタクトフォーム送信
3 * 基本は以下
4 * <form class="contact-form" method="post" data-when-complete=".for-form-complete">
5 *   <input type="email" name="email" required>
6 *   <div class="error_msg" data-for="email"></div>
7 *   <textarea name="body"></textarea>
8 *   <div class="error_msg" data-for="body"></div>
9 * </form>
10 * <div class="for-form-complete" style="display:none;">
11 *   Thanks for your message!
12 * </div>
13 * 
14 * <form class="contact-form" data-when-complete="{some selector}">...</form>
15 * とすることで、フォーム送信成功時に表示する要素を指定できる。
16 * 
17 * name="body"がない場合、name="email"以外の入力フィールドデータ値を項目別にbodyに入れて送信する。
18 * この場合、バリデーションは行われないので注意。HTML5のフォームバリデーションを利用する。サーバ側チェックは行わない。
19 * 
20 * <form class="contact-form" method="post">
21 *   <input type="email" name="email">
22 *   <div class="error_msg" data-for="email"></div>
23 *   <label><input type="checkbox" name="checked" value="checked">Checked<label>
24 *   <br>
25 *   <select name="job"><option>job1</option><option>job2</option>...</select>
26 *   <br>
27 *   <textarea name="free"></textarea>
28 * </form>
29 * 
30 */	
31$(function(){
32	
33	var API_DEFAULT = window._contact_api || '/_contact';
34	var CSRF_FIELD_NAME = 'csrfmiddlewaretoken';
35	var RECAPTCHAV2_FIELD_NAME = 'g-recaptcha-response';
36	
37	function _dbg(msg) {
38		($('#dbg')[0] ? $('#dbg') : $('<div id="dbg"></div>').css({position:'fixed',bottom:0,right:0,background:'rgba(0,0,0,.5)',color:'white',zIndex:32767,padding:'10px'}).appendTo('body'))
39			.text(msg);
40	}
41	
42	function findFormComplete($form) {
43		if (!$form.is('[data-when-complete]')) { return $(); }
44		return $($form.attr('data-when-complete'));
45	}
46	
47	$('form.contact-form').each(function(){
48		findFormComplete($(this)).hide();
49	});
50	
51	$('form.contact-form').on('submit', function(ev){
52		var $form = $(this), $when_complete = findFormComplete($form).hide();
53		ev.preventDefault();
54		var data = $form.formGet(), $combined = null;
55		if (!data.source_url) {
56			if (!$form.find(':input[name="source_url"]')[0]) {
57				$form.append($('<input>').attr({
58					'type':'hidden',
59					'name':'source_url',
60					'value':location.href
61				}));
62			}
63		}
64		var combined = !$form.find(':input[name=body]')[0];
65		// var combined = !!($form.find(':input:not([name="body"]):not([name="email"]):visible')[0]);
66		if (combined) {
67			if (!($form.find('.error_msg[data-for="body"]')[0])) {
68				var $error_msg = $('<div class="error_msg" data-for="body"></div>').css({
69					'color': '#800',
70					'background': '#fcc',
71					'padding': '3px 6px',
72					'margin': '.25em 0'
73				});
74				var $submit = $form.find('[type="submit"],button:not([type])');
75				if ($submit[0]) {
76					$error_msg.insertBefore($submit);
77				} else {
78					$form.prepend($error_msg);
79				}
80			}
81			var combined_data = []
82			for (var k in data) {
83				if (k!='email' && k!=CSRF_FIELD_NAME && k!=RECAPTCHAV2_FIELD_NAME) {
84					combined_data.push('[[' + k + ']]\n' + data[k]);
85				}
86			}
87			
88			if (combined_data) {
89				combined_data = '---- combined ----\n' + combined_data.join('\n\n') + '\n------------------';
90				$combined = $('<input>').attr({
91					'name':'body',
92					'type':'hidden',
93					'data-combined':'1'
94				}).val(combined_data).appendTo($form);
95			}
96		}
97		var csrftoken = $.cookie('csrftoken');
98		if (csrftoken && !$form.find('[name="' + CSRF_FIELD_NAME + '"]')[0]) {
99			$form.append($('<input>').attr({type:'hidden',name:CSRF_FIELD_NAME,value:csrftoken}));
100		}
101		
102		var opts = {
103			alert_not_detected_errors: true,
104			filter:function(res){
105				res.success = res.result == 'ok';
106				return res;
107			}
108		}
109		
110		if (!$form.attr('action')) {
111			opts.url = API_DEFAULT;
112			opts.method = 'post';
113		}
114		
115		$form.formPost(opts).then(function(res){
116			var $form_complete = findFormComplete($form), hide_form = true;
117			if ($form_complete[0]) {
118				$form_complete.each(function(){
119					if ($.contains($form[0], this)) {
120						hide_form = false;
121						return false;
122					}
123				});
124				if (hide_form) {
125					$form.hide();
126				}
127			}
128			findFormComplete($form.hide()).show();
129			setTimeout(function(){
130				findFormComplete($form).hide();
131				$form.formClear().show();
132			}, 10000);
133		}).fail(function(res){
134			if (res.ajaxerror){ alert('connection error:'+res.ajaxerror.statusText) }
135			if (res.systemerror) { alert('serverside error:'+res.systemerror); }
136		}).always(function(res){
137			if ($combined) {
138				$combined.remove();
139			}
140			// always clear reCAPCHA status after form post.
141			if(typeof grecaptcha === "undefined") {
142				// pass
143			}
144			else {
145				grecaptcha.reset();
146			}
147		});
148	});
149});
150
151

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.