Javascript 为什么';当URL中有编码字符时,后退按钮不起作用吗?
我是Angular(1.5.7)的新手,我正在尝试使用ui路由器在主页和搜索结果页面之间进行路由,并更改URL以反映搜索查询。我的大多数查询都包含中文字符,导致URL中出现编码字符,如下所示:Javascript 为什么';当URL中有编码字符时,后退按钮不起作用吗?,javascript,angularjs,encoding,angular-ui-router,Javascript,Angularjs,Encoding,Angular Ui Router,我是Angular(1.5.7)的新手,我正在尝试使用ui路由器在主页和搜索结果页面之间进行路由,并更改URL以反映搜索查询。我的大多数查询都包含中文字符,导致URL中出现编码字符,如下所示: http://localhost:3000/#/search/%E4%B8%AD%E6%96%87 我的问题是: 当URL中有汉字或任何其他编码字符时,后退按钮似乎不起任何作用 如果搜索URL中没有编码字符(例如,如果我搜索了helloWorld或what's up,浏览器的(我正在使用Chrome)“后
http://localhost:3000/#/search/%E4%B8%AD%E6%96%87
我的问题是:
当URL中有汉字或任何其他编码字符时,后退按钮似乎不起任何作用
如果搜索URL中没有编码字符(例如,如果我搜索了helloWorld
或what's up
,浏览器的(我正在使用Chrome)“后退”按钮工作正常,将我带回主页面。我已尝试侦听$stateChangeStart
和$stateChangeSuccessuccess
事件,并且它们不会仅在存在编码字符时触发
我有一个用于主页的控制器,用于将URL更改为搜索URL,还有一个用于搜索页面的控制器,用于从服务器获取结果。相关代码(如果需要其他内容,请告诉我):
有人能解释一下为什么后退按钮不起作用吗
编辑:Safari显示常规汉字(例如,
http://localhost:3000/#/search/中文代码>),后退按钮工作正常。因此,编码字符显然是问题所在。您可以制作一个硬编码的快速插入器来重新创建它吗?您在控制台中看到了什么吗?使用Chrome,在搜索框中键入普通英语。然后单击后退按钮,它将带您返回主页。然后尝试键入So我喜欢中国人中文. 它不会回来。我诚实的意见是,它一定与Angular Ui Router有关,我建议无论如何都要避免使用它(它真的没有用,如果你有一个,你会过度考虑管理全球状态IMHO)。今晚我不会有时间看这个库(坦白说,我不在乎,因为我不喜欢它)。我会说我用常规路由试过了,效果很好(确保在最新的chrome上进行分支并在url中键入字符),这很好。好的,我会研究使用ng路由。很多人似乎更喜欢ui路由器,所以我就这么做了。很多人做了很多愚蠢的事情。我更新了(所以拉)如果你真的需要ui路由器(或者你的项目已经在使用它),我会用它们打开一个bug(在确保没有bug之后)。
app.controller('MainController', ['$scope', '$window', function($scope, $window) {
$scope.search = function(searchTerm) {
if (!$scope.searchTerm || $scope.searchTerm === '') {
return;
}
$window.location.href = '#/search/' + $scope.searchTerm;
$scope.searchTerm = '';
}
}]);
app.controller('SearchController', ['$scope', '$http', '$stateParams', function($scope, $rootScope, $http, $stateParams) {
$http.get("http://localhost:3000/api/search/" + $stateParams.term)
.success(function(result) {
$scope.entries = result;
});
}]);
app.config([
'$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('home', {
url:'/home',
templateUrl:'/templates/home.html',
controller: 'MainController'
})
.state('search', {
url: '/search/{term}',
templateUrl: 'templates/search.html',
controller: 'SearchController'
});
$urlRouterProvider.otherwise('/home');
}]);