以下代码片段可以用作书签,在多个网站或页面之间切换,而无需输入甚至记住它们。这是第一个版本,运行良好:
let url;
switch (location.host) {
case 'github.com':
url = location.href;
url = url.replace('github.com', 'stackoverflow.com');
window.open(url, '_self');
break;
case 'stackoverflow.com':
case 'superuser.com':
case 'unix.stackexchange.com':
url = location.href;
url = url.replace('/.+/', 'www.reddit.com');
window.open(url, '_self');
break;
case 'www.reddit.com':
url = location.href;
url = url.replace('www.reddit.com', 'github.com');
window.open(url, '_self');
break;
}
然后我尝试进一步改进它,使其不仅适用于
unix.stackexchange
,还适用于english.stackexchange.com
、philosophy.stackexchange.com
、bicycles.stackexchange.com
等等。
为此,正如 T. J. Crowder 在他 2010 年的回答中所建议的:https://stackoverflow.com/a/2896642,我添加了正则表达式。但是当我在 JavaScript 控制台中尝试它时,它会抛出一个错误:
SyntaxError: Unexpected token '.'. Expected a ')' or a ',' after a parameter declaration.
为什么会这样,这里到底出了什么问题?
function toggle(location.host) {
let url;
switch (true) {
case 'github.com':
url = location.href;
url = url.replace('github.com', 'stackoverflow.com');
window.open(url, '_self');
break;
case 'stackoverflow.com':
case 'superuser.com':
case /.+\.stackexchange\.com/.toggle(str):
url = location.href;
url = url.replace('/.+/', 'www.reddit.com');
window.open(url, '_self');
break;
case 'www.reddit.com':
url = location.href;
url = url.replace('www.reddit.com', 'github.com');
window.open(url, '_self');
break;
}
}
/.+\.stackexchange\.com/.toggle(str):
可能是什么意思?它确实必须抛出一些东西,因为 RegExp.toggle
是一个不存在的方法。
当您使用
switch(true)
时,应确保每个 case
都是 true
或 false
。否则,结果至少是不可预测的。因此,在您的情况下,我想您应该为每种情况测试正则表达式:
console.log(`location.host is ${location.host}`);
toggle(location.host);
function toggle(host) {
let url;
switch (true) {
case /github\.com/i.test(host):
url = location.href;
url = url.replace('github.com', 'stackoverflow.com');
return console.log(url);
case /stackoverflow\.com/i.test(host):
case /superuser\.com/i.test(host):
case /stackexchange\.com/i.test(host):
url = location.href;
return console.log(`...${url} (unchanged)`);
case /www\.reddit\.com/i.test(host):
url = location.href;
url = 'github.com';
return console.log(url);
case /stacksnippets\.net/i.test(host):
return console.log(`from stackoverflow snippet box`);
default:
return console.log(`no matches`);
}
}