我希望在我的 javascript 中进行一个检查,以确定页面加载是否在我的本地机器上。
我想这样做的原因是,在开发过程中,我希望确保我的服务器端(C#)验证是否正确工作。因此,我希望能够同时显示客户端和服务器端的错误。
所以,在测试过程中,我在我的 jquery 验证中设置了一个标志,始终允许无效数据通过。这样,我就可以一次性看到客户端和服务器端的错误。
但是现在,当从开发环境切换到生产环境时,我必须手动来回更改。
我希望在我的 javascript 中进行一个检查,以确定页面加载是否在我的本地机器上。
我想这样做的原因是,在开发过程中,我希望确保我的服务器端(C#)验证是否正确工作。因此,我希望能够同时显示客户端和服务器端的错误。
所以,在测试过程中,我在我的 jquery 验证中设置了一个标志,始终允许无效数据通过。这样,我就可以一次性看到客户端和服务器端的错误。
但是现在,当从开发环境切换到生产环境时,我必须手动来回更改。
location.hostname
变量可以获取当前主机名。这足以让你确定你目前处于哪个环境。
if (location.hostname === "localhost" || location.hostname === "127.0.0.1")
alert("It's a local server!");
如果在浏览器中启动静态HTML,例如从类似于file:///C:/Documents and Settings/Administrator/Desktop/
的位置,检测"localhost"将不起作用。location.hostname
将返回空字符串。因此,
if (location.hostname === "localhost" || location.hostname === "127.0.0.1" || location.hostname === "")
alert("It's a local server!");
这是在React中注册服务工作者时检查的方式,通过检查主机名(包括localhost和IPv6)以及匹配起始位置为127来判断是否在本地主机上:
const isLocalhost = Boolean(
window.location.hostname === 'localhost' ||
// [::1] is the IPv6 localhost address.
window.location.hostname === '[::1]' ||
// 127.0.0.1/8 is considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
)
);
Boolean()
包装器在这里扮演什么角色? - Olivier Cailloux.match()
的结果限制在布尔值范围内,使用!!
也可以很好地完成这个任务,而不必改变原始意思。 - VBobCat[::0:1]
、[0::0:0:1]
等。 - Josh Kelley这仍然不是万能的,但可能会有所改善。 现在您可以创建一个域名数组并使用.includes
const LOCAL_DOMAINS = ["localhost", "127.0.0.1", ...];
if (LOCAL_DOMAINS.includes(window.location.hostname))
alert("It's a local server!");
localhost
,也就是说,它是否指向从该请求发出的同一设备。export function isLocalHost(hostname = window.location.hostname) {
return ['localhost', '127.0.0.1', '', '::1'].includes(hostname)
}
10.0.
或192.168.
开头,或者以.local
结尾的mDNS / Bonjour域名:export function isLocalNetwork(hostname = window.location.hostname) {
return (
(['localhost', '127.0.0.1', '', '::1'].includes(hostname))
|| (hostname.startsWith('192.168.'))
|| (hostname.startsWith('10.'))
|| (hostname.endsWith('.local'))
)
}
.local
等并不意味着主机在本地计算机上,这就是问题所在。它们将位于本地网络上的其他设备上。 - Julian Knight.local
保留给 mDNS,它专为“小型网络”设计。在大多数情况下,这是在本地网络上。请参阅 https://en.wikipedia.org/wiki/Multicast_DNS 但你说得对,问题是“连接是否为 localhost”,这只对条件的第一行成立。我会更新我的答案。谢谢! - Holtwick使用与其他脚本相同的机制的最短形式:
if ( ["localhost", "127.0.0.1", ""].includes(window.location.hostname) ) {
console.log("It's local host !");
}
const LOCAL_DOMAINS = [ "localhost", "127.0.0.1" ];
/* offline || development */
if ( LOCAL_DOMAINS.includes(location.hostname) )
{
BASE_URL_PUBLIC = location.hostname + "/folder/website/"; // your project folder
}
/* online || production */
else
{
BASE_URL_PUBLIC = location.hostname;
}
一个简单的方法是检查主机名是否为localhost,或者检查自定义域名是否包含特定的子字符串,例如“.local” URL,如http://testsite.local
var myUrlPattern = '.local';
if (window.location.hostname === "localhost" || location.hostname === "127.0.0.1" || window.location.hostname.indexOf(myUrlPattern) >= 0) {
alert("It's a local server!");
}
if ((Request.Url.Host.ToLower() == "localhost"))
{
// ..., maybe set an asp:Literal value that's in the js
}
或者如果你想从客户端脚本中实现,你可以检查 window.location.host 的值。
if (window.location.host == "localhost")
{
// Do whatever
}
以上答案大多数情况下都可以解决问题,但是...
一个解决方案是设置位置哈希并检查它。
http://myname.foo.com/form.html#devValidation
你可以使用开关添加无限选项
switch(location.hash) {}
case '#devValidation':
// log the results and post the form
break;
case '#beValidation':
// skip front end validation entirely
break;
case '#noValidation':
// skip all validation $('[name=validationType']).val('novalidation');
break;
case '#feValidation':
default:
// do fe validation
break;
}