说我做以下事情:
我需要做到这一点,以便用户返回主页(/)而不是返回/ posts/1
所以我需要允许骨干哈希路由工作,但不能修改历史记录.我个人更喜欢保留历史,但这是项目的要求.
我正在创建一个应用程序,我登录/注销有一个家,关于,配置文件等.它使用反应路由器,但是当我登录时,我希望应用程序转换到它所在的最后一条路线,它有时适用于例如,如果我访问,然后登录并登录,它会带我回到约,但如果我访问应用程序根目录'/'然后去登录,并登录,它会带我回到我曾经在的第一页(当您打开浏览器或选项卡时,这将是默认页面).我这样写了,我觉得我这样做的方式非常幼稚.我在渲染方法中做到了,它被称为很多.我认为它有时会这样做,但我不完全确定.希望得到一些建议,代码:
constructor(props, context) {
super(props, context);
this.state = UserStore.getState();
this.context = context;
}
render() {
console.log(this.state.user.get('authenticated'));
if(this.state.user.get('authenticated')){
this.context.history.goBack();
}
return (
//stuff
)
Run Code Online (Sandbox Code Playgroud)
我是否应该在我访问的每条路线上将状态推入历史记录中,我还注意到,如果我在登录之前等待一段时间,有时它会正确执行,也许它会将其添加到历史记录中稍晚或需要一些时间?不完全确定如何调试它,console.log(this.context.history)只是显示了它的一些功能,我想我可能会在错误的地方看?
路线:
export default (
<Route component={App}>
<Route path="/" component={Dashboard} />
<Route path="dashboard" component={Dashboard} onEnter={requireAuth} />
<Route path="about" component={About} />
<Route path="profile" component={Profile} onEnter={requireAuth}/>
<Route path="login" component={LoginSignupPage} />
<Route path="channels" component={Channels} />
</Route>
);
Run Code Online (Sandbox Code Playgroud)
注入反应路由器
import React from 'react';
import ReactDOM from 'react-dom';
import Iso from 'iso';
import createBrowserHistory from 'history/lib/createBrowserHistory';
import { Router } from 'react-router'; …Run Code Online (Sandbox Code Playgroud) 我有Android Web View的问题.当我覆盖函数shouldOverrideUrlLoading在我的类中扩展WebViewClient然后WebView.canGoBack()总是返回false.
以下是我的代码
public class SMWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
view.loadUrl(request.getUrl().toString());
return true;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String uri) {
view.loadUrl(uri);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的活动中:
@BindView(R.id.main_webview) SMWebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
webView.setWebViewClient(new SMWebViewClient(){
@Override
public void onPageFinished(WebView view, String url){
}
});
webView.clearCache(true);
webView.clearHistory();
webView.loadUrl(Constant.baseUrl + Constant.homeUrl);
}
Run Code Online (Sandbox Code Playgroud)
问题是函数webView.canGoBack(总是在我的活动中)总是返回false:
@Override
public void onBackPressed() {
//ALWAYS FALSE
if …Run Code Online (Sandbox Code Playgroud) 我正在使用HTML 5历史API来保存ajax请求时的状态,如果用户请求同一页面没有ajax请求,我提供完整的html内容.
浏览器的"重新打开最后关闭的选项卡"功能带来了最后的ajax请求内容而无需点击服务器.如果浏览器会在没有带上一个请求内容的情 但浏览器只显示最后的ajax请求内容.
我在Chrome 17,Firefox 10上遇到过这种情况.(我没有在ie9上尝试过,因为它没有支持历史记录api)
什么是这个问题的众所周知的解决方案?
编辑:这些ajax请求只是向服务器"获取"请求.
它真的不可能在jsfiddle.net中展示它,因为几乎没有理由.您可以在本地主机中演示它,如下所示.
向服务器发出"get"请求并拉出json对象,然后将该url推送到历史api中,如下所示.
history.pushState(null,null,url);
Run Code Online (Sandbox Code Playgroud)
然后关闭该选项卡,然后单击浏览器的"重新打开上次关闭的选项卡"功能.你看到了什么 ?Json回应身体?浏览器显示它而不向服务器发出请求,对吧?
仅在Chrome中出现奇怪的后退按钮行为.
我有两个页面 - 网格和表单
场景:
1.当从网格导航到表格时一切都很好 - 网格被添加到历史记录中.
2.当表单通过post发送到服务器时,我使用RedirectToAction再次重定向(302)到网格 - 表单被添加到历史记录中.
3.在重定向后再次从网格导航到窗体时,包含网格地址的历史记录点不会添加到历史记录中
现在,您必须在后退按钮上单击两次才能返回到网格.
如果您多次重复所有步骤并观看历史堆栈,您将看到一个悲伤的表单条目列表,中间没有网格
编辑:这是指向显示问题的页面的链接,在chrome中打开它并按照说明操作 - 查看操作中的Chrome历史记录错误
我发现的唯一"解决方案"是在表单的链接中添加一些随机的废话,但我真的很讨厌这个.
model-view-controller google-chrome post-redirect-get browser-history
我想实现一个应用程序来获取Android默认浏览器历史记录并将浏览器历史记录保存到xml文件.但浏览器历史记录不会将某些设备保存到xml文件中.
我已经实现了我的应用程序以获取浏览器历史信息以保存到xml文件,如下所示:
private void browserHistoryDOM() {
try{
File newxmlfile = new File("/sdcard/Xmlfiles/briwserHistory.xml");
newxmlfile.createNewFile();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("root");
document.appendChild(rootElement);
Cursor mCur = managedQuery(Browser.BOOKMARKS_URI,Browser.HISTORY_PROJECTION, null, null, null);
mCur.moveToFirst();
if (mCur.moveToFirst() && mCur.getCount() > 0) {
while (mCur.isAfterLast() == false) {
Element em = document.createElement("bookmarkIdx");
em.appendChild(document.createTextNode(mCur.getString(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX)));
rootElement.appendChild(em);
long callDate = Long.parseLong(mCur.getString(Browser.HISTORY_PROJECTION_DATE_INDEX));
SimpleDateFormat datePattern = new SimpleDateFormat ("dd-MM-yyyy/h:m:s:a");
datePattern.setTimeZone(TimeZone.getTimeZone("GMT"));
String date_str = datePattern.format(new Date(callDate));
Element em1 = document.createElement("dateIdx");
em1.appendChild(document.createTextNode(date_str));
rootElement.appendChild(em1);
Element em2 …Run Code Online (Sandbox Code Playgroud) 我使用JSF 2 PrettyFaces,也是<h:link>和<f:param>标签广泛地获得可收藏的页面(这是伟大的最终忘记在JSF应用程序所有的POST请求).
但是,其中一些链接只会更改页面的一小部分(主要是当用户停留在同一视图中时),因此发送ajax请求会更好.但是,<f:ajax>不能用<h:link>,只是<h:commandlink>.我也可以使用commandlink以多种方式发送参数,但在这种情况下,URL在请求后保持不变.因此它与页面内容不同步,并且不可刷新.
我已经看到使用链接发送GET和ajax请求(在使用ajax修改页面时指向新URL)的网站,但到目前为止我还没有找到任何解决方案.
在ajax请求完成后(或用户点击时),我可以用jsf以某种方式刷新URL吗?或者我是否必须使用一些外部JS库?
编辑:这里需要的JS库是新的JavaScript History API.更多信息. 我猜JSF目前不使用这个API.但是我仍然从JSF开发人员的角度对这个问题感兴趣.
此外,它是否计划在未来发布JSF?结合<f:ajax>使用<h:link>将是一个完美的解决方案.
我正在寻找一种方法来获取用户在Android浏览器应用程序上访问的当前URL.我发现我可以Browser.BOOKMARKS_URI使用以下技术从数据库中获取最后访问过的URL :
Cursor cursor = context.getContentResolver().query(Browser.BOOKMARKS_URI,
Browser.HISTORY_PROJECTION, null, null,
Browser.BookmarkColumns.DATE + " DESC");
cursor.moveToNext();
String url = cursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
cursor.close();
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,Browser.BOOKMARKS_URI当用户按下以便导航到浏览器中的上一页时,db不会更新,并且查询返回不正确的结果.
请参阅以下示例:
有没有人知道如何返回用户正在查看的正确网址?
看来这一行在statechange事件中:
$('#content').load(State.data.home_page);
...导致同一页面加载多次,导致我的网站出现故障.我该怎么做才能解决这个问题?

(function($) {
function loadHome() {
$('#content').load(site.url + '/ #primary', function() {
$(this).fadeIn(50);
});
}
// User event
$('.site-title a').on('click', function(e) {
e.preventDefault();
var newData = { home_page: site.url + '/ #primary' };
History.pushState(newData, site.title, site.url);
loadHome();
});
// History event
History.Adapter.bind(window, 'statechange', function(){
var State = History.getState();
$('#content').load(State.data.home_page);
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
好的,所以我学到了.pushState实际的电话statechange.
所以基本上,我在想这就是发生的事情:
.site-title apushState()调用哪些调用statechange加载页面的一部分.loadHome()也称为加载相同的.我可以看到这就是为什么我得到同一页面的多个实例.我以为statechange只有当用户点击浏览器上的后退按钮时才会调用.这样可以解决问题,但我仍然不知道如何向前推进.假设这是罪魁祸首,我不知道.load在这个statechange事件中用什么代替那条线.
我有一个文章组件,显示帖子列表.该列表是分页的,因此每页最多可显示10个帖子.有一个"下一页"按钮,单击时将更新组件状态和相应的url参数,如下所示:
第1页:/ news
第2页:/ news?page = 2
第3页:/ news?page = 3
...等等.设置constructor()和render()方法的方式,如果用户直接导航到/ news?page = 3,它将读取此URL参数并显示正确的帖子.
我遇到的问题是浏览器后退和前进按钮似乎没有重新呈现页面.因此,如果用户点击"下一页"按钮几次然后点击后退按钮,则URL将更新,但页面将不会重新呈现.有没有办法强迫它这样做?
我猜测有一种方法可以通过添加一个window.history监听器来实现这一点,但我不确定是否有推荐的练习gatsby-link.
以下是该组件的精简版本供参考:
import React, { Component } from 'react';
import { navigateTo } from 'gatsby-link';
import getUrlParameter from '../functions/getUrlParameter';
export default class extends Component {
constructor(props) {
super(props);
/* external function, will grab value
* of ?page= url parameter if it exists */
const urlParamPage = getUrlParameter('page');
const currentPage = urlParamPage ? urlParamPage : 1;
this.state = { …Run Code Online (Sandbox Code Playgroud) browser-history ×10
ajax ×3
android ×3
java ×2
javascript ×2
react-router ×2
reactjs ×2
back-button ×1
backbone.js ×1
gatsby ×1
history.js ×1
html5 ×1
jquery ×1
jsf-2 ×1
url ×1
web ×1
webview ×1