Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用pushstate和各种js路由器执行路由_Javascript_Html_Single Page Application_Page.js - Fatal编程技术网

Javascript 无法使用pushstate和各种js路由器执行路由

Javascript 无法使用pushstate和各种js路由器执行路由,javascript,html,single-page-application,page.js,Javascript,Html,Single Page Application,Page.js,我不确定我是否理解pushstate和路由的情况,但我一直在尝试使用pagejs或grapnel或其他类似javascript路由器路由单页应用程序 我想要的是能够通过我的程序导航,并通过在位置栏中手动输入路线导航(这样我就可以向第三方发送指向spa各个部分的链接)。例如,我无法使用以下代码手动导航到/测试路线 以下是使用pagejs的示例 我还让我的nodejs后端在收到/login请求时重定向到/login 如何利用pushstate,以便在位置栏中输入手动地址,并从路由器和html链接浏览

我不确定我是否理解pushstate和路由的情况,但我一直在尝试使用pagejs或grapnel或其他类似javascript路由器路由单页应用程序

我想要的是能够通过我的程序导航,并通过在位置栏中手动输入路线导航(这样我就可以向第三方发送指向spa各个部分的链接)。例如,我无法使用以下代码手动导航到/测试路线

以下是使用pagejs的示例

我还让我的nodejs后端在收到/login请求时重定向到/login

如何利用pushstate,以便在位置栏中输入手动地址,并从路由器和html链接浏览地址? 我错过了什么

一些示例代码:

page('/',index);
page('/signin',signin);
page('/test',test)
page();

function index() {
  console.log('in index')
  new WelcomeView();
  console.log('rerouting');
  page('/signin');
}

function signin() {
  console.log('in signin')
  //new SigninFormView();
}

function test() {
  console.log('in test');
}
在welcome.html中

click <a href="/#test">lets see</a>
这有以下结果:

1) 导航到/我将获得已导航到登录路径的欢迎页面和控制台日志

2) 在位置栏中手动写入链接/signin,我再次导航到重定向的/route

3) 在位置栏中手动写入链接/#sign,我再次导航到重定向的/route

4) 再次单击welcome.html中的链接将通过/route重定向我

5) 单击welcome.html中的链接并将其更改为/test可以工作

每当您(手动或其他方式,通常通过设置
window.location='myurl'
)更改地址栏中的任何内容时,浏览器将始终对此发出请求,如果没有办法,那么这将是一个安全问题,因为页面可能会劫持您的浏览器,通过不允许导航到任何其他url。如果您想通过在位置栏中键入特定url来加载SPA中的特定url,则需要服务器做出响应。在SPA中,您通常会返回加载SPA的相同html。现在,pagejs似乎不尊重位置栏中的url,并不断加载
/
(我相信我以前见过),作为一种解决方法,您可以在加载应用程序时尝试将
page()
设置为
window.location.pathname
,看看这是否能解决第二个问题


另外,默认情况下,hashbang URL不会在page中启用,您需要在
page({hashbang:true})

中启用它们。您可以提供一个示例项目/代码来说明您的具体情况吗?谢谢,我最终使用了Grapnel,它在使用散列输入时尊重路由。@arisalexis我很想看看您的路由解决方案和链接。目前,我正在尝试使用grapnel,但遇到类似问题。我没有使用用于路由器实例化的选项,如pushstate等。我还让后端服务器将任何请求转发到不存在的资源,如/login to/#login。然后我在html中的所有链接都指向/#login。然后,在地址栏中键入它,路由器实例化工作。如果对你不起作用,请告诉我。
//router redirect to webapp
app.use(function(req, res, next) {
  const redirectUrl=(req.secure ? 'https://' : 'http://') + req.headers.host +'/#'+req.originalUrl.substring(1);
  res.redirect(redirectUrl);
});