PageSourceSearch

https://nafirnews.ir/js/rating.js?v=1

js nafirnews.ir collected 2026-10-07 06:01:06 UTC 4,032 bytes, 225 lines download raw bytes

1let hoverLock = false;
2
3
4/* =========================
5   ⭐ STAR RATING
6========================= */
7
8document.querySelectorAll('.rating span').forEach(star => {
9
10    /* 🔥 hover preview */
11    star.addEventListener('mouseenter', function () {
12
13        if (hoverLock) return;
14
15        let value = parseInt(this.dataset.value);
16
17        let parent = this.parentElement;
18
19        let stars = parent.querySelectorAll('span');
20
21        stars.forEach(s => {
22
23            let v = parseInt(s.dataset.value);
24
25            s.classList.remove('full', 'half');
26
27            if (v <= value) {
28                s.classList.add('full');
29            }
30
31        });
32    });
33
34
35    /* ⭐ click */
36    star.addEventListener('click', function () {
37
38        let value = this.dataset.value;
39
40        let parent = this.parentElement;
41
42        let type = parent.dataset.type || 'post';
43
44        let id = parent.dataset.id;
45
46        let pid = parent.dataset.pid;
47
48        hoverLock = true;
49
50        let params = new URLSearchParams();
51
52        params.append('rate', value);
53        params.append('type', 'star');
54
55        /*
56         * نوع آیتم
57         */
58        params.append('object_type', type);
59
60        /*
61         * شناسه
62         */
63        params.append('object_id', id);
64
65        /*
66         * pid
67         */
68        params.append('object_pid', pid);
69
70
71        fetch('/important/rate.php', {
72
73            method: 'POST',
74
75            headers: {
76                'Content-Type':
77                    'application/x-www-form-urlencoded'
78            },
79
80            body: params.toString()
81
82        })
83
84        .then(r => r.json())
85
86        .then(data => {
87
88            hoverLock = false;
89
90            if (data.status === 'success') {
91
92                renderStars(parent, data.avg);
93
94            } else {
95
96                alert(data.message);
97            }
98
99        })
100
101        .catch(() => {
102
103            hoverLock = false;
104
105        });
106
107    });
108
109});
110
111document.querySelectorAll('.rating').forEach(container => {
112
113    container.addEventListener('mouseleave', function () {
114
115        if (hoverLock) return;
116
117        let avg = parseFloat(
118            this.dataset.avg || 0
119        );
120
121        renderStars(this, avg);
122
123    });
124
125});
126
127
128
129function renderStars(container, avg) {
130
131    avg = parseFloat(avg) || 0;
132
133    container.dataset.avg = avg;
134
135    let stars = container.querySelectorAll('span');
136
137    stars.forEach(s => {
138
139        let val = parseInt(
140            s.dataset.value
141        );
142
143        s.classList.remove(
144            'full',
145            'half'
146        );
147
148        if (avg >= val) {
149
150            s.classList.add('full');
151
152        } else if (avg >= val - 0.5) {
153
154            s.classList.add('half');
155        }
156
157    });
158
159
160    let info = container.nextElementSibling;
161
162    if (info) {
163
164        info.innerHTML =
165            'امتیاز: ' +
166            avg.toFixed(2) +
167            ' / 5';
168    }
169}
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184/* =========================
185   👍 LIKE / 👎 DISLIKE
186========================= */
187
188document.addEventListener('click', function (e) {
189
190    let btn = e.target.closest('.like-btn, .dislike-btn');
191    if (!btn) return;
192
193    let parent = btn.closest('.vote');
194
195    let postId = parent.dataset.id;
196    let value = btn.dataset.value;
197
198    fetch('/important/rate.php', {
199        method: 'POST',
200        headers: {
201            'Content-Type': 'application/x-www-form-urlencoded'
202        },
203        body: `post_id=${postId}&rate=${value}&type=vote`
204    })
205    .then(r => r.json())
206    .then(data => {
207
208        if (data.status === 'success') {
209
210            parent.querySelector('.like').innerText =
211                data.likevote;
212
213            parent.querySelector('.dislike').innerText =
214                data.dislikevote;
215
216        } else {
217
218            alert(data.message);
219
220        }
221
222    });
223
224});
225

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.