javascript - 如何减少 jQuery 函数中用于将 URL 附加到语言切换菜单的重复
问题描述
我正在设置一个没有服务器端访问的多语言下拉切换。它适用于集成了 Twig 的 WordPress 站点,因此处理获取主页和路径 URL 等事情的常用 WP 细节不可用。有了这些限制,jQuery 似乎是最可行的解决方案。
这是我目前所拥有的 - 这会更新下拉菜单中的 href 属性,以便在四个站点之间切换:英语(默认,博客 ID:1)、德语、法语和西班牙语。下面的脚本运行良好,但如果可以的话,我想减少重复。将.indexOf
项目放入数组中会复制 URL 中的 2 个字母的国家/地区字符串,这就是代码处于这种超级重复状态的原因。
理想情况下,我希望有一个 if 语句来检查/de
, /fr
, 并且/es
因为这三个块几乎相同。在此先感谢您的任何指点。
var langDropPathname = window.location.pathname.slice(3); // cut 2-letter country and slash from path for non-default sites
var langDropPathEN = window.location.pathname; // path for default site
var langDropDE = "/de";
var langDropFR = "/fr";
var langDropES = "/es";
if (window.location.href.indexOf("/de/") > -1) {
$(".langDropEN").attr('href', langDropPathname);
$(".langDropDE").attr('href', langDropDE+langDropPathname);
$(".langDropFR").attr('href', langDropFR+langDropPathname);
$(".langDropES").attr('href', langDropES+langDropPathname);
if ($("body").hasClass("error404")) {
document.location.href=langDropDE;
}
} else if (window.location.href.indexOf("/fr/") > -1) {
$(".langDropEN").attr('href', langDropPathname);
$(".langDropDE").attr('href', langDropDE+langDropPathname);
$(".langDropFR").attr('href', langDropFR+langDropPathname);
$(".langDropES").attr('href', langDropES+langDropPathname);
if ($("body").hasClass("error404")) {
document.location.href=langDropFR;
}
} else if (window.location.href.indexOf("/es/") > -1) {
$(".langDropEN").attr('href', langDropPathname);
$(".langDropDE").attr('href', langDropDE+langDropPathname);
$(".langDropFR").attr('href', langDropFR+langDropPathname);
$(".langDropES").attr('href', langDropES+langDropPathname);
if ($("body").hasClass("error404")) {
document.location.href=langDropES;
}
} else {
$(".langDropEN").attr('href', langDropPathEN);
$(".langDropDE").attr('href', langDropDE+langDropPathEN);
$(".langDropFR").attr('href', langDropFR+langDropPathEN);
$(".langDropES").attr('href', langDropES+langDropPathEN);
}
解决方案
简单地迭代一系列['/de', '/fr', '/es']
看起来就可以了。
const langs = ['/de', '/fr', '/es'];
const lang = langs.find(substr => window.location.href.includes(substr));
const suffix = lang ? langDropPathname : langDropPathEN;
$(".langDropEN").attr('href', suffix);
$(".langDropDE").attr('href', langDropDE + suffix);
$(".langDropFR").attr('href', langDropFR + suffix);
$(".langDropES").attr('href', langDropES + suffix);
if ($("body").hasClass("error404") && lang) {
document.location.href = lang.slice(1);
}
我不知道代码的更广泛的上下文,但如果你可以将所有语言放在一起,而不是挑选出一些特定的语言,那就更好了。也许像
const langs = {
de: <content of langDropDE>
fr: <content of langDropFR>
...
}
对于所有语言,那么
const langEntry = Object.entries(langs)
.find(entry => window.location.href.includes('/' + entry[0]));
并从那里继续,现在您已经拥有匹配的语言字符串并langDrop
与找到的条目相关联。
推荐阅读
- javascript - 在 React 中更新对象值的状态
- python - Skimage.feature.hog 找到主导方向
- php - Composer2 和 PSR-4 弃用通知
- c++ - C 等效于 C++ 枚举数据,用于二进制读取和操作
- flutter - CERTIFICATE_VERIFY_FAILED:证书链中的自签名证书(handshake.cc:354))
- reactjs - 如何让 golang 重定向到前端路由?
- android - InMobi 广告未出现 - 广告请求成功,但未投放广告。NO_FILL
- c# - 实体框架核心多对多无法确定关系
- javascript - 根据按钮的ID数据隐藏类元素
- javascript - 反应路由器:无法访问私有路由