PageSourceSearch

https://biz.halftime-media.com/assets/pages/job_list-bed27c1551e83…de5b0ab7c810a1fa7164802c6f6cc44a21930d1f.js

js halftime-media.com collected 2026-09-25 04:41:48 UTC 2,976 bytes, 78 lines download raw bytes

1const initJobList = () => {
2  const onChangeConditionFiltersCheckbox = () => {
3    let form = $('.js-job-list-filters');
4    form.find('.job-list-filters__submit').click();
5  };
6
7  // 年収レンジの妥当性チェック。下限≧上限(同額含む)ならエラー表示して false を返す
8  const validateSalaryRange = () => {
9    const min = $('.js-job-list-salary-min').val();
10    const max = $('.js-job-list-salary-max').val();
11    const invalid = min !== '' && max !== '' && parseInt(min, 10) >= parseInt(max, 10);
12
13    $('.js-job-list-salary-error').prop('hidden', !invalid);
14    $('.js-job-list-salary-min, .js-job-list-salary-max').toggleClass('is-error', invalid);
15    return !invalid;
16  };
17
18  const onChangeSalarySelect = () => {
19    if (validateSalaryRange()) {
20      onChangeConditionFiltersCheckbox();
21    }
22  };
23
24  const onClickSpecificConditionsTrigger = (evt) => {
25    $(evt.currentTarget).toggleClass('is-open');
26    $('.js-job-list-specific-conditions').toggle();
27  };
28
29  const onClickSortBy = (evt) => {
30    let form = $('.js-job-list-filters'),
31        root = $('.js-job-list-sort'),
32        unSelectedSortKey = root.find('.js-job-list-unselected-sort-by'),
33        selectedSortKey = root.find('.js-job-list-selected-sort-by'),
34        target = $(evt.target),
35        sortBy = target.data('sort-by');
36
37    if (target.hasClass('selected'))  {
38        return;
39    }
40
41    form.find('#sort_by').remove();
42    $('<input>').attr({
43      'id': 'sort_by',
44      'type': 'hidden',
45      'name': 'sort_by',
46      'value': sortBy
47    }).appendTo(form);
48
49    unSelectedSortKey
50          .removeClass('js-job-list-unselected-sort-by')
51          .addClass('js-job-list-selected-sort-by')
52          .addClass('selected');
53    selectedSortKey
54          .removeClass('selected')
55          .removeClass('js-job-list-selected-sort-by')
56          .addClass('js-job-list-unselected-sort-by');
57
58    onChangeConditionFiltersCheckbox();
59  };
60
61  $(document).on('change', '.js-job-list-filters-checkbox', onChangeConditionFiltersCheckbox);
62  $(document).on('change', '.js-job-list-salary-min, .js-job-list-salary-max', onChangeSalarySelect);
63  $(document).on('click', '.js-job-list-specific-conditions-trigger', onClickSpecificConditionsTrigger);
64  $(document).on('click', '.js-job-list-sort', onClickSortBy);
65};
66document.addEventListener('DOMContentLoaded', initJobList());
67
68// ページ送り・絞り込みで job_list フレームが読み込まれたら一覧の先頭へスクロールする。
69// turbo:frame-load はバブリングするため document 上に1回だけ登録すれば、
70// Turbo Drive でどのページから遷移しても・フレームが差し替わっても確実に発火する。
71document.addEventListener('turbo:frame-load', (event) => {
72  if (event.target.id !== 'job_list') return;
73
74  const jobListMain = document.querySelector('.job-list-main');
75  if (jobListMain) {
76    jobListMain.scrollIntoView({ behavior: 'smooth' });
77  }
78});

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.