" + esc(d.name) + ", " + esc(d.country) + (isFav(d.slug) ? " ★" : "") + "
" + "" + esc(d.description) + "
" + '" + '" + "/** * nomadro XHS offline mirror * Reuses the same CSS classes / visual structure as frontend H5 (localhost:3000). * No network — data from window.NOMADRO_DATA. */ (function () { "use strict"; var D = window.NOMADRO_DATA || {}; var Bridge = window.XhsBridge; var FAV_KEY = "nomadro_xhs_favs"; var root = document.getElementById("app-root"); var backBtn = document.getElementById("xhs-back"); var route = { name: "home", params: {} }; var favs = []; var destFilter = "all"; var destSort = "rating"; var destSearch = ""; var visaFilter = "all"; var lifeActive = 0; var voiceActive = 0; var faqActive = null; function esc(s) { return String(s == null ? "" : s) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """); } function on(el, ev, fn) { if (el) el.addEventListener(ev, fn); } function storageGet(key, fb) { if (Bridge && Bridge.getLocalData) { return Bridge.getLocalData(key).then(function (v) { return v == null ? fb : v; }); } try { var raw = localStorage.getItem(key); return Promise.resolve(raw ? JSON.parse(raw) : fb); } catch (e) { return Promise.resolve(fb); } } function storageSet(key, val) { if (Bridge && Bridge.setLocalData) return Bridge.setLocalData(key, val); try { localStorage.setItem(key, JSON.stringify(val)); } catch (e) {} return Promise.resolve(true); } function go(name, params) { route = { name: name, params: params || {} }; render(); window.scrollTo(0, 0); } function destBySlug(slug) { var list = D.destinations || []; for (var i = 0; i < list.length; i++) if (list[i].slug === slug) return list[i]; return null; } function isFav(slug) { return favs.indexOf(slug) >= 0; } function toggleFav(slug) { var i = favs.indexOf(slug); if (i >= 0) favs.splice(i, 1); else favs.push(slug); storageSet(FAV_KEY, favs); render(); } function logoSvg(id) { return ( '" ); } /* ===== chrome shared with H5 ===== */ function renderNavbar() { return ( '" ); } function renderTicker() { var msgs = D.ticker || []; if (!msgs.length) return ""; return ( '
" ); } function renderHero() { var stats = D.stats || {}; return ( '|
' + "探索去哪 → 遇见同行 → 路上成长
" + "目的地、签证与智能匹配
" + '' + "活动、社区与游民心声
" + '' + "学院、博客与工具箱
" + '' + "" + esc(d.description) + "
" + '" + '" + "按预算、网速与气候筛选,点进城市看详情
" + '' + "离线快照,出发前请再核对官方政策
" + "" + esc(C.subtitle || "来自全球数字游民的真实故事") + "
" + "“" + esc(cur.content) + "”
" + '" + "“" + esc(item.content) + "”
" + '" + "" + esc(L.subtitle || "") + "
" + "" + esc(item.desc) + "
" + "" + esc(cur.desc) + "
" + '' + esc(cur.tip) + "
启动资金、网络、保险与税务
' + "' + esc(f.answer) + "
发现去哪
未找到城市
' + esc(d.tag) + " · " + esc(d.nomads_count) + " 游民
" + "" + esc(d.description) + "
" + '遇见同行(离线可浏览)
离线快照 · RSVP 请到网页版
" + esc(m.description) + "
" + '" + "" + esc(d.excerpt) + "
" + '" + "路上做事
" + esc(les.duration) + "
" + "" + esc(lesson.content || "") + "
" + "" + esc(b.excerpt) + "
" + '" + "文章不存在
' + esc(b.author) + " · " + esc(b.published_at) + " · " + (b.read_time || "?") + " 分钟
" + esc(t.description) + "
离线本地打分 · 默认预算 ¥6000
| 指标 | " + esc(a.name) + " | " + esc(b.name) + " |
|---|---|---|
| 月费 | ¥" + a.cost + " | ¥" + b.cost + " |
| 网速 | " + a.speed + " | " + b.speed + " |
| 均温 | " + a.temperature + " | " + b.temperature + " |
| 评分 | " + a.rating + " | " + b.rating + " |
" + esc(D.offlineNote || "") + "
还没有收藏
') + "