Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 952c9ee

Browse files
authored
Replace jQuery with vanilla JavaScript (#160)
1 parent 57f3c65 commit 952c9ee

File tree

1 file changed

+76
-61
lines changed

1 file changed

+76
-61
lines changed

templates/switchers.js

Lines changed: 76 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,52 @@
44
if (!String.prototype.startsWith) {
55
Object.defineProperty(String.prototype, 'startsWith', {
66
value: function(search, rawPos) {
7-
var pos = rawPos > 0 ? rawPos|0 : 0;
7+
const pos = rawPos > 0 ? rawPos|0 : 0;
88
return this.substring(pos, pos + search.length) === search;
99
}
1010
});
1111
}
1212

1313
// Parses versions in URL segments like:
1414
// "3", "dev", "release/2.7" or "3.6rc2"
15-
var version_regexs = [
15+
const version_regexs = [
1616
'(?:\\d)',
1717
'(?:\\d\\.\\d[\\w\\d\\.]*)',
1818
'(?:dev)',
1919
'(?:release/\\d.\\d[\\x\\d\\.]*)'];
2020

21-
var all_versions = $VERSIONS;
22-
var all_languages = $LANGUAGES;
21+
const all_versions = $VERSIONS;
22+
const all_languages = $LANGUAGES;
2323

2424
function quote_attr(str) {
2525
return '"' + str.replace('"', '\\"') + '"';
2626
}
2727

2828
function build_version_select(release) {
29-
var buf = ['<select id="version_select">'];
30-
var major_minor = release.split(".").slice(0, 2).join(".");
29+
let buf = ['<select id="version_select">'];
30+
const major_minor = release.split(".").slice(0, 2).join(".");
3131

32-
$.each(all_versions, function(version, title) {
33-
if (version == major_minor)
32+
Object.entries(all_versions).forEach(function([version, title]) {
33+
if (version === major_minor) {
3434
buf.push('<option value=' + quote_attr(version) + ' selected="selected">' + release + '</option>');
35-
else
35+
} else {
3636
buf.push('<option value=' + quote_attr(version) + '>' + title + '</option>');
37+
}
3738
});
3839

3940
buf.push('</select>');
4041
return buf.join('');
4142
}
4243

4344
function build_language_select(current_language) {
44-
var buf = ['<select id="language_select">'];
45+
let buf = ['<select id="language_select">'];
4546

46-
$.each(all_languages, function(language, title) {
47-
if (language == current_language)
48-
buf.push('<option value="' + language + '" selected="selected">' +
49-
all_languages[current_language] + '</option>');
50-
else
47+
Object.entries(all_languages).forEach(function([language, title]) {
48+
if (language === current_language) {
49+
buf.push('<option value="' + language + '" selected="selected">' + title + '</option>');
50+
} else {
5151
buf.push('<option value="' + language + '">' + title + '</option>');
52+
}
5253
});
5354
if (!(current_language in all_languages)) {
5455
// In case we're browsing a language that is not yet in all_languages.
@@ -62,29 +63,31 @@
6263

6364
function navigate_to_first_existing(urls) {
6465
// Navigate to the first existing URL in urls.
65-
var url = urls.shift();
66+
const url = urls.shift();
6667
if (urls.length == 0 || url.startsWith("file:///")) {
6768
window.location.href = url;
6869
return;
6970
}
70-
$.ajax({
71-
url: url,
72-
success: function() {
73-
window.location.href = url;
74-
},
75-
error: function() {
71+
fetch(url)
72+
.then(function(response) {
73+
if (response.ok) {
74+
window.location.href = url;
75+
} else {
76+
navigate_to_first_existing(urls);
77+
}
78+
})
79+
.catch(function(error) {
7680
navigate_to_first_existing(urls);
77-
}
78-
});
81+
});
7982
}
8083

8184
function on_version_switch() {
82-
var selected_version = $(this).children('option:selected').attr('value') + '/';
83-
var url = window.location.href;
84-
var current_language = language_segment_from_url();
85-
var current_version = version_segment_from_url();
86-
var new_url = url.replace('/' + current_language + current_version,
87-
'/' + current_language + selected_version);
85+
const selected_version = this.options[this.selectedIndex].value + '/';
86+
const url = window.location.href;
87+
const current_language = language_segment_from_url();
88+
const current_version = version_segment_from_url();
89+
const new_url = url.replace('/' + current_language + current_version,
90+
'/' + current_language + selected_version);
8891
if (new_url != url) {
8992
navigate_to_first_existing([
9093
new_url,
@@ -98,13 +101,13 @@
98101
}
99102

100103
function on_language_switch() {
101-
var selected_language = $(this).children('option:selected').attr('value') + '/';
102-
var url = window.location.href;
103-
var current_language = language_segment_from_url();
104-
var current_version = version_segment_from_url();
105-
if (selected_language == 'en/') // Special 'default' case for english.
104+
let selected_language = this.options[this.selectedIndex].value + '/';
105+
const url = window.location.href;
106+
const current_language = language_segment_from_url();
107+
const current_version = version_segment_from_url();
108+
if (selected_language == 'en/') // Special 'default' case for English.
106109
selected_language = '';
107-
var new_url = url.replace('/' + current_language + current_version,
110+
let new_url = url.replace('/' + current_language + current_version,
108111
'/' + selected_language + current_version);
109112
if (new_url != url) {
110113
navigate_to_first_existing([
@@ -117,9 +120,9 @@
117120
// Returns the path segment of the language as a string, like 'fr/'
118121
// or '' if not found.
119122
function language_segment_from_url() {
120-
var path = window.location.pathname;
121-
var language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)'
122-
var match = path.match(language_regexp);
123+
const path = window.location.pathname;
124+
const language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)'
125+
const match = path.match(language_regexp);
123126
if (match !== null)
124127
return match[1];
125128
return '';
@@ -128,35 +131,36 @@
128131
// Returns the path segment of the version as a string, like '3.6/'
129132
// or '' if not found.
130133
function version_segment_from_url() {
131-
var path = window.location.pathname;
132-
var language_segment = language_segment_from_url();
133-
var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
134-
var version_regexp = language_segment + '(' + version_segment + ')';
135-
var match = path.match(version_regexp);
134+
const path = window.location.pathname;
135+
const language_segment = language_segment_from_url();
136+
const version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
137+
const version_regexp = language_segment + '(' + version_segment + ')';
138+
const match = path.match(version_regexp);
136139
if (match !== null)
137140
return match[1];
138141
return ''
139142
}
140143

141144
function create_placeholders_if_missing() {
142-
var version_segment = version_segment_from_url();
143-
var language_segment = language_segment_from_url();
144-
var index = "/" + language_segment + version_segment;
145+
const version_segment = version_segment_from_url();
146+
const language_segment = language_segment_from_url();
147+
const index = "/" + language_segment + version_segment;
145148

146-
if ($('.version_switcher_placeholder').length)
149+
if (document.querySelectorAll('.version_switcher_placeholder').length > 0) {
147150
return;
151+
}
148152

149-
var html = '<span class="language_switcher_placeholder"></span> \
153+
const html = '<span class="language_switcher_placeholder"></span> \
150154
<span class="version_switcher_placeholder"></span> \
151155
<a href="/" id="indexlink">Documentation</a> &#187;';
152156

153-
var probable_places = [
157+
const probable_places = [
154158
"body>div.related>ul>li:not(.right):contains('Documentation'):first",
155159
"body>div.related>ul>li:not(.right):contains('documentation'):first",
156160
];
157161

158-
for (var i = 0; i < probable_places.length; i++) {
159-
var probable_place = $(probable_places[i]);
162+
for (let i = 0; i < probable_places.length; i++) {
163+
let probable_place = $(probable_places[i]);
160164
if (probable_place.length == 1) {
161165
probable_place.html(html);
162166
document.getElementById('indexlink').href = index;
@@ -165,18 +169,29 @@
165169
}
166170
}
167171

168-
$(document).ready(function() {
169-
var language_segment = language_segment_from_url();
170-
var current_language = language_segment.replace(/\/+$/g, '') || 'en';
171-
var version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION);
172+
document.addEventListener('DOMContentLoaded', function() {
173+
const language_segment = language_segment_from_url();
174+
const current_language = language_segment.replace(/\/+$/g, '') || 'en';
175+
const version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION);
172176

173177
create_placeholders_if_missing();
174-
$('.version_switcher_placeholder').html(version_select);
175-
$('.version_switcher_placeholder select').bind('change', on_version_switch);
176178

177-
var language_select = build_language_select(current_language);
179+
let placeholders = document.querySelectorAll('.version_switcher_placeholder');
180+
placeholders.forEach(function(placeholder) {
181+
placeholder.innerHTML = version_select;
178182

179-
$('.language_switcher_placeholder').html(language_select);
180-
$('.language_switcher_placeholder select').bind('change', on_language_switch);
183+
let selectElement = placeholder.querySelector('select');
184+
selectElement.addEventListener('change', on_version_switch);
185+
});
186+
187+
const language_select = build_language_select(current_language);
188+
189+
placeholders = document.querySelectorAll('.language_switcher_placeholder');
190+
placeholders.forEach(function(placeholder) {
191+
placeholder.innerHTML = language_select;
192+
193+
let selectElement = placeholder.querySelector('select');
194+
selectElement.addEventListener('change', on_language_switch);
195+
});
181196
});
182197
})();

0 commit comments

Comments
 (0)