PageSourceSearch

https://kuramore.jp/article/js/article-detail.js

js kuramore.jp collected 2026-10-04 13:25:41 UTC 21,097 bytes, 548 lines download raw bytes

1window.addEventListener('DOMContentLoaded', function() {
2
3  // === 記事詳細内 売却問合せ 導線処理 ===
4
5  // 丁目なしのコード値
6  const CHOME_NASHI_CD_VALUE = '000';
7  const CHOME_NASHI_CD_VALUE_FLLOW = '000';
8
9  // 査定ボタンクリックイベント
10  $('.js-sell-form-button').click(function() {
11    try {
12      navigateToSellForm();
13    } catch (error) {
14      console.log(error);
15    }
16  });
17
18  // (追従用)査定ボタンクリックイベント
19  $('.js-sell-form-button-follow').click(function() {
20    try {
21      navigateToSellFormFollow();
22    } catch (error) {
23      console.log(error);
24    }
25  });
26
27  // 入力値変更時
28  $('select[name="buildingTypeCd"], select[name="bukkenPrefCd"], select[name="bukkenCityCd"], select[name="bukkenTownCd"], select[name="bukkenChomeCd"]').change(function() {
29    var $targetDom = $(this);
30    var validateContents = $targetDom.data('validate');
31    if(typeof validateContents != 'undefined'){
32      for(var validateContent of validateContents.split(',')){
33        if(validate(validateContent, $targetDom)){
34          $targetDom.parents('.step-inner').find('.error-input').addClass('errorTxt');
35          $targetDom.parent('.select-btn-inner').removeClass('error');
36          $('.js-sell-form-button').parent('.CTA-btn').removeClass('inactive');
37          $('.error-CTA').addClass('errorTxt');
38          break;
39        } else {
40          $('.js-sell-form-button').parent('.CTA-btn').addClass('inactive');
41        }
42      }
43    }
44
45    var name = $targetDom.attr('name');
46    if(name === 'bukkenPrefCd'){
47      createBukkenCityOption();
48    }else if(name === 'bukkenCityCd'){
49      createBukkenTownOption();
50    }else if(name === 'bukkenTownCd'){
51      createBukkenChomeOption();
52    }
53  });
54
55  /**
56   * 住所選択プルダウンの選択肢を空にする。
57   */
58  function removeSelectOption(selectName) {
59    $('select[name="' + selectName + '"] optgroup').remove();
60    $('select[name="' + selectName + '"] option:not([value=""])').remove();
61    $('select[name="' + selectName + '"]').parent().addClass('error');
62    
63    // 丁目が存在しない時の非活性制御解除
64    if (selectName == 'bukkenChomeCd') {
65      $('select[name="bukkenChomeCd"]').parent().removeClass('disabled-btn');
66      $('select[name="bukkenChomeCd"]').prop('disabled', false);
67    }
68  }
69
70  /**
71   * 市区町村プルダウン作成
72   */
73  function createBukkenCityOption(){
74    removeSelectOption('bukkenCityCd');
75    removeSelectOption('bukkenTownCd');
76    removeSelectOption('bukkenChomeCd');
77
78    $.ajax({
79      dataType: "json",
80      cache: false,
81      async: false,
82      url: "/form/api/" + $('select[name="bukkenPrefCd"]').val() + "/address/", // 本番用
83      success: function(data) {
84        // 選択リストの項目追加
85        for (var [key, value] of Object.entries(data)) {
86          var $optgroup = $('<optgroup>', { label: key });
87          for (var row of value) {
88            $optgroup.append($('<option>', { value: row.cityCd, text: row.cityName }));
89          }
90          $('select[name="bukkenCityCd"]').append($optgroup);
91        }
92        
93        // 住所の下階層項目を未選択状態に設定
94        $('select[name="bukkenCityCd"] option[value=""]').prop('selected', true);
95        $('select[name="bukkenTownCd"] option[value=""]').prop('selected', true);
96        $('select[name="bukkenChomeCd"] option[value=""]').prop('selected', true);
97      },
98      error: function() {
99        alert('市区町村情報取得に失敗しました');
100      }
101    });
102  }
103
104  /**
105   * 町名プルダウン作成
106   */
107  function createBukkenTownOption(){
108    removeSelectOption('bukkenTownCd');
109    removeSelectOption('bukkenChomeCd');
110
111    $.ajax({
112      dataType: "json",
113      cache: false,
114      async: false,
115      url: "/form/api/" + $('select[name="bukkenPrefCd"]').val() + "/" + $('select[name="bukkenCityCd"]').val() + "/address/", // 本番用
116      success: function(data) {
117        // 選択リストの項目追加
118        for (var [key, value] of Object.entries(data)) {
119          var $optgroup = $('<optgroup>', { label: key });
120          for (var row of value) {
121            var townName = row.townName;
122            if (townName == '') {
123              townName = '町名なし';
124            }
125            $optgroup.append($('<option>', { value: row.townCd, text: townName }));
126          }
127          $('select[name="bukkenTownCd"]').append($optgroup);
128        }
129        
130        // 住所の下階層項目を未選択状態に設定
131        $('select[name="bukkenTownCd"] option[value=""]').prop('selected', true);
132        $('select[name="bukkenChomeCd"] option[value=""]').prop('selected', true);
133      },
134      error: function() {
135        alert('町名情報取得に失敗しました');
136      }
137    });
138  }
139
140  /**
141   * 丁目プルダウン作成
142   */
143  function createBukkenChomeOption(){
144    removeSelectOption('bukkenChomeCd');
145    var prefCd = $('select[name="bukkenPrefCd"]').val();
146    var cityCd = $('select[name="bukkenCityCd"]').val();
147    var townCd = $('select[name="bukkenTownCd"]').val();
148
149    $.ajax({
150      dataType: "json",
151      cache: false,
152      async: false,
153      url: "/form/api/" + prefCd + "/" + cityCd + "/" + townCd + "/address/", // 本番用
154      success: function(data) {
155        if (data.length > 0) {
156          // 選択リストの項目追加
157          $.each(data, function() {
158            $('select[name="bukkenChomeCd"]').append($('<option>').attr({ value: this.chomeCd }).text(this.chomeName));
159          });
160          
161          // 住所の下階層項目を未選択状態に設定
162          $('select[name="bukkenChomeCd"] option[value=""]').prop('selected', true);
163        } else { // 丁目が存在しない時の制御
164          // valueを設定
165          $('select[name="bukkenChomeCd"]').append($('<option>').attr({ value: CHOME_NASHI_CD_VALUE }).text('丁目'));
166          $('select[name=bukkenChomeCd]').val(CHOME_NASHI_CD_VALUE).change();
167          
168          // 丁目が存在しない時の非活性制御
169          $('select[name="bukkenChomeCd"]').parent().addClass('disabled-btn');
170          $('select[name="bukkenChomeCd"]').prop('disabled', true);
171        }
172      },
173      error: function() {
174        alert('町名情報取得に失敗しました');
175      }
176    });
177  }
178
179  // (追従用)入力値変更時
180  $('select[name="buildingTypeCdFollow"], select[name="bukkenPrefCdFollow"], select[name="bukkenCityCdFollow"], select[name="bukkenTownCdFollow"], select[name="bukkenChomeCdFollow"]').change(function() {
181    var $targetDom = $(this);
182    var validateContents = $targetDom.data('validate');
183    if(typeof validateContents != 'undefined'){
184      for(var validateContent of validateContents.split(',')){
185        if(validate(validateContent, $targetDom)){
186          $targetDom.parents('.fllow-inner').find('.error-input').addClass('errorTxt');
187          $targetDom.parent('.select-btn-inner').removeClass('error');
188          $('.js-sell-form-button').parent('.btn-follow').removeClass('inactive');
189          $('.error-CTA').addClass('errorTxt');
190          break;
191        } else {
192          $('.js-sell-form-button').parent('.btn-follow').addClass('inactive');
193        }
194      }
195    }
196
197    var name = $targetDom.attr('name');
198    if(name === 'bukkenPrefCdFollow'){
199      createBukkenCityOptionFollow();
200    }else if(name === 'bukkenCityCdFollow'){
201      createBukkenTownOptionFollow();
202    }else if(name === 'bukkenTownCdFollow'){
203      createBukkenChomeOptionFollow();
204    }
205  });
206
207  /**
208   * (追従用)住所選択プルダウンの選択肢を空にする。
209   */
210  function removeSelectOptionFollow(selectName) {
211    $('select[name="' + selectName + '"] optgroup').remove();
212    $('select[name="' + selectName + '"] option:not([value=""])').remove();
213    $('select[name="' + selectName + '"]').parent().addClass('error');
214    
215    // 丁目が存在しない時の非活性制御解除
216    if (selectName == 'bukkenChomeCdFollow') {
217      $('select[name="bukkenChomeCdFollow"]').parent().removeClass('disabled-btn');
218      $('select[name="bukkenChomeCdFollow"]').prop('disabled', false);
219    }
220  }
221
222  /**
223   * (追従用)市区町村プルダウン作成
224   */
225  function createBukkenCityOptionFollow(){
226    removeSelectOptionFollow('bukkenCityCdFollow');
227    removeSelectOptionFollow('bukkenTownCdFollow');
228    removeSelectOptionFollow('bukkenChomeCdFollow');
229
230    $.ajax({
231      dataType: "json",
232      cache: false,
233      async: false,
234      url: "/form/api/" + $('select[name="bukkenPrefCdFollow"]').val() + "/address/", // 本番用
235      success: function(data) {
236        // 選択リストの項目追加
237        for (var [key, value] of Object.entries(data)) {
238          var $optgroup = $('<optgroup>', { label: key });
239          for (var row of value) {
240            $optgroup.append($('<option>', { value: row.cityCd, text: row.cityName }));
241          }
242          $('select[name="bukkenCityCdFollow"]').append($optgroup);
243        }
244        
245        // 住所の下階層項目を未選択状態に設定
246        $('select[name="bukkenCityCdFollow"] option[value=""]').prop('selected', true);
247        $('select[name="bukkenTownCdFollow"] option[value=""]').prop('selected', true);
248        $('select[name="bukkenChomeCdFollow"] option[value=""]').prop('selected', true);
249      },
250      error: function() {
251        alert('市区町村情報取得に失敗しました');
252      }
253    });
254  }
255
256  /**
257   * (追従用)町名プルダウン作成
258   */
259  function createBukkenTownOptionFollow(){
260    removeSelectOptionFollow('bukkenTownCdFollow');
261    removeSelectOptionFollow('bukkenChomeCdFollow');
262
263    $.ajax({
264      dataType: "json",
265      cache: false,
266      async: false,
267      url: "/form/api/" + $('select[name="bukkenPrefCdFollow"]').val() + "/" + $('select[name="bukkenCityCdFollow"]').val() + "/address/", // 本番用
268      success: function(data) {
269        // 選択リストの項目追加
270        for (var [key, value] of Object.entries(data)) {
271          var $optgroup = $('<optgroup>', { label: key });
272          for (var row of value) {
273            var townName = row.townName;
274            if (townName == '') {
275              townName = '町名なし';
276            }
277            $optgroup.append($('<option>', { value: row.townCd, text: townName }));
278          }
279          $('select[name="bukkenTownCdFollow"]').append($optgroup);
280        }
281        
282        // 住所の下階層項目を未選択状態に設定
283        $('select[name="bukkenTownCdFollow"] option[value=""]').prop('selected', true);
284        $('select[name="bukkenChomeCdFollow"] option[value=""]').prop('selected', true);
285      },
286      error: function() {
287        alert('町名情報取得に失敗しました');
288      }
289    });
290  }
291
292  /**
293   * (追従用)丁目プルダウン作成
294   */
295  function createBukkenChomeOptionFollow(){
296    removeSelectOptionFollow('bukkenChomeCdFollow');
297    var prefCd = $('select[name="bukkenPrefCdFollow"]').val();
298    var cityCd = $('select[name="bukkenCityCdFollow"]').val();
299    var townCd = $('select[name="bukkenTownCdFollow"]').val();
300
301    $.ajax({
302      dataType: "json",
303      cache: false,
304      async: false,
305      url: "/form/api/" + prefCd + "/" + cityCd + "/" + townCd + "/address/", // 本番用
306      success: function(data) {
307        if (data.length > 0) {
308          // 選択リストの項目追加
309          $.each(data, function() {
310            $('select[name="bukkenChomeCdFollow"]').append($('<option>').attr({ value: this.chomeCd }).text(this.chomeName));
311          });
312          
313          // 住所の下階層項目を未選択状態に設定
314          $('select[name="bukkenChomeCdFollow"] option[value=""]').prop('selected', true);
315        } else { // 丁目が存在しない時の制御
316          // valueを設定
317          $('select[name="bukkenChomeCdFollow"]').append($('<option>').attr({ value: CHOME_NASHI_CD_VALUE_FLLOW }).text('丁目'));
318          $('select[name=bukkenChomeCdFollow]').val(CHOME_NASHI_CD_VALUE_FLLOW).change();
319          
320          // 丁目が存在しない時の非活性制御
321          $('select[name="bukkenChomeCdFollow"]').parent().addClass('disabled-btn');
322          $('select[name="bukkenChomeCdFollow"]').prop('disabled', true);
323        }
324      },
325      error: function() {
326        alert('町名情報取得に失敗しました');
327      }
328    });
329  }
330
331  
332  /**
333   * 売却フォームに遷移
334   */
335  function navigateToSellForm() {
336    var params;
337    var isValidate = true;
338    var isShopExists = true;
339
340    // 入力情報のバリデーションチェック
341    $('select[data-validate]').each(function () {
342      var $targetDom = $(this);
343      var validateContents = $targetDom.data('validate');
344      if (validateContents == 'selected'){
345        validateContents.split(',').forEach(function (validateDetail) {
346          if (validate(validateDetail, $targetDom) == false) {
347            $targetDom.parents('.step-inner').find('.error-input').removeClass('errorTxt');
348            isValidate = false;
349          }
350        });
351      }
352    });
353
354    // 入力値エラーの場合は、処理中断
355    if (!isValidate) {
356        throw new Error('validation failed please check the input values.');
357    }
358
359    // 入力情報の物件情報を設定
360    params = {
361      appraiseCd: '1',
362      buildingTypeCd: $('select[name="buildingTypeCd"]').val(),
363      bukkenPrefCd: $('select[name="bukkenPrefCd"]').val(),
364      bukkenCityCd: $('select[name="bukkenCityCd"]').val(),
365      bukkenTownCd: $('select[name="bukkenTownCd"]').val(),
366      bukkenChomeCd: $('select[name="bukkenChomeCd"]').val()
367    }
368    isShopExists = (existsShop(params.bukkenPrefCd, params.bukkenCityCd, params.bukkenTownCd, params.bukkenChomeCd));
369
370    if (isShopExists) {
371      const form = createForm('POST', '/form/sell/', '_blank', params);
372      document.body.appendChild(form);
373      form.submit();
374    } else {
375      // 担当店舗が存在しない場合Home4ULPに遷移
376      navigateToHome4ULp();
377    }
378  }
379
380  /**
381   * (追従用)売却フォームに遷移
382   */
383  function navigateToSellFormFollow() {
384    var paramsFollow;
385    var isValidateFollow = true;
386    var isShopExistsFollow = true;
387    
388
389    // 入力情報のバリデーションチェック
390    $('select[data-validate]').each(function () {
391      var $targetDom = $(this);
392      var validateContents = $targetDom.data('validate');
393      if (validateContents == 'fllow'){
394        validateContents.split(',').forEach(function (validateDetail) {
395          if (validate(validateDetail, $targetDom) == false) {
396            $targetDom.parents('.fllow-inner').find('.error-input').removeClass('errorTxt');
397            isValidateFollow = false;
398          }
399        });
400      }
401    });
402
403    // 入力値エラーの場合は、処理中断
404    if (!isValidateFollow) {
405        throw new Error('validation failed please check the input values.');
406    }
407
408    // 入力情報の物件情報を設定
409    paramsFollow = {
410      appraiseCd: '1',
411      buildingTypeCd: $('select[name="buildingTypeCdFollow"]').val(),
412      bukkenPrefCd: $('select[name="bukkenPrefCdFollow"]').val(),
413      bukkenCityCd: $('select[name="bukkenCityCdFollow"]').val(),
414      bukkenTownCd: $('select[name="bukkenTownCdFollow"]').val(),
415      bukkenChomeCd: $('select[name="bukkenChomeCdFollow"]').val()
416    }
417    isShopExistsFollow = (existsShop(paramsFollow.bukkenPrefCd, paramsFollow.bukkenCityCd, paramsFollow.bukkenTownCd, paramsFollow.bukkenChomeCd));
418
419  if (isShopExistsFollow) {  // 追従用売却フォーム導線の処理
420
421      const form = createForm('POST', '/form/sell/', '_blank', paramsFollow);
422      document.body.appendChild(form);
423      form.submit();
424    } else {
425      navigateToHome4ULpFollow();
426    }
427  }
428
429  /**
430   * Home4ULPページに遷移
431   */
432  function navigateToHome4ULp() {
433    const params = {
434      prefCd: $('select[name="bukkenPrefCd"]').val(),
435      cityCd: $('select[name="bukkenCityCd"]').val()
436    }
437    const form = createForm('GET', '/lp/sell/partner-h4u' , '_blank', params);
438    document.body.appendChild(form);
439    form.submit();
440  }
441
442  /**
443   * Home4ULPページに遷移(追従用)
444   */
445  function navigateToHome4ULpFollow() {
446    const paramsFollow = {
447      prefCd: $('select[name="bukkenPrefCdFollow"]').val(),
448      cityCd: $('select[name="bukkenCityCdFollow"]').val()
449    }
450    const form = createForm('GET', '/lp/sell/partner-h4u', '_blank', paramsFollow);
451    document.body.appendChild(form);
452    form.submit();
453  }
454
455  /**
456   * フォーム生成
457   * @param {string} method 
458   * @param {string} action 
459   * @param {string} target 
460   * @param {object} params 
461   * @return {object} form フォーム
462   */
463  function createForm(method, action, target, params) {
464    const form = document.createElement('form');
465    form.method = method;
466    form.action = action;
467    form.target = target;
468
469    for (const key in params) {
470      if (params.hasOwnProperty(key)) {
471        const hiddenField = document.createElement('input');
472        hiddenField.type = 'hidden';
473        hiddenField.name = key;
474        hiddenField.value = params[key];
475        form.appendChild(hiddenField);
476      }
477    }
478    return form;
479  }
480
481  /**
482   * 担当店舗存在判定
483   */
484  function existsShop(prefCd, cityCd, townCd, chomeCd) {
485    var result = false;
486    $.ajax({
487      data: { "prefCd": prefCd, "cityCd": cityCd, "townCd": townCd, "chomeCd": chomeCd },
488      dataType: "json",
489      cache: false,
490      async: false,
491      url: "/form/api/assign-shops/",
492      success: function(data) {
493        if (data.shopCd != 0) {
494          result = true;
495        } else {
496          result = false;
497        }
498      },
499      error: function() {
500      }
501    });
502    return result;
503  }
504
505  /**
506   * 入力チェック
507   */
508  function validate(validateDetail, $targetDom) {
509    var val = $targetDom.val();
510
511    if (validateDetail == 'selected' || validateDetail == 'fllow') {
512      if (val != null && val != '') {
513          return true;
514        } else{
515          return false;
516        }
517    }
518    return false;
519  }
520
521  articleModule();
522
523  /* 汎用モジュールHTML表示 */
524  function articleModule() {
525    //searchTOP系リンク
526    const articleModuleSearchTop = document.getElementsByClassName('js-module-search-top');
527    for (let i = 0; i < articleModuleSearchTop.length; i++) {
528      articleModuleSearchTop[i].innerHTML = '<br><br><div class="Col2-btn-wrapper btn-inner rent-links"><div class="btn-inner consult buy"><a href="/buy/"><div class="btn-box"><div class="txt"><p>売買物件を探す</div></div></a></div><div class="btn-inner search rent"><a href="/rent/"><div class="btn-box"><div class="txt"><p>賃貸物件を探す</div></div></a></div></div>';
529    } 
530
531    //賃貸系リンク
532    const articleModuleRentLink = document.getElementsByClassName('js-rent-links');
533    for (let e = 0; e < articleModuleRentLink.length; e++) {
534      articleModuleRentLink[e].innerHTML = '<br><br><div class="Col2-btn-wrapper btn-inner rent-links"><div class="btn-inner consult"><a href="https://www.starts-ph.co.jp/mail/formRent/" target="_blank"><div class="btn-box"><div class="txt"><p class="small-txt pcOnly">希望条件に合った物件をご提案します!<p class="small-txt spOnly">希望条件に合った<p class="pcOnly">ご相談・お問合せはこちら<p class="spOnly">賃貸物件のご相談</div></div></a></div><div class="btn-inner search"><a href="/rent/"><div class="btn-box"><div class="txt"><p>賃貸物件を探す</div></div></a></div></div>';
535    } 
536
537    //購入系リンク
538    const articleModuleBuyLink = document.getElementsByClassName('js-buy-links');
539    for (let a = 0; a < articleModuleBuyLink.length; a++) {
540      articleModuleBuyLink[a].innerHTML = '<br><br><div class="Col2-btn-wrapper btn-inner rent-links"><div class="btn-inner buy"><a class="gtm-buy-referralButton-kuramore" href="/form/buy/"><div class="btn-box"><div class="txt"><p class="small-txt pcOnly">希望条件に合った物件をご提案します!<p class="small-txt spOnly">希望条件に合った<p class="pcOnly">ご相談・お問合せはこちら<p class="spOnly">売買物件のご相談</div></div></a></div><div class="btn-inner search"><a href="/buy/"><div class="btn-box"><div class="txt"><p>売買物件を探す</div></div></a></div></div>';
541    }
542  }
543});
544
545  /* 大型賃貸物件内容の送信処理 */
546  function sendByRentLp() {
547    $('.js-rent-form-link').submit();
548  }

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.