当client端JS返回false是,如何让页面redirect到一个新页面

2013-12-07 21:37:48 +08:00
 catsky
是这样的,最近在试着用python实现news.dbanotes.net,碰到一个问题。
当用户每个标题变的三角形是,就可以给该文章投票。
当其已经是登陆用户时,没有问题,点击三角形,文章point+1,页面没有刷新。
非登陆状态下,点击三角形,页面会redirect到登陆界面。
看了下HTML源代码,有一下JS脚本。 最后一行,return false,应该是保证页面没有刷新?
那么,非登陆情况下,页面又是怎么redirect到另外一个页面的??不得其解啊,请各位v友帮助。

我在server端的建了个/vote URL mapping, 做了redirect ,但是页面不会redirect,无法实现像news.dbanotes.net这样的效果。 自己在用flask实现。

//news.dbanotes.net HTML页面 的vote JS函数
function vote(node) {
var v = node.id.split(/_/); // {'up', '123'}
var item = v[1];

// adjust score
var score = byId('score_' + item);
var newscore = parseInt(score.innerHTML) + (v[0] == 'up' ? 1 : -1);
score.innerHTML = newscore + (newscore == 1 ? ' point' : ' points');

// hide arrows
byId('up_' + item).style.visibility = 'hidden';
try { byId('down_' + item).style.visibility = 'hidden'; }
catch(err) {} // ignore

// ping server
var ping = new Image();
ping.src = node.href;

return false; // cancel browser nav
}
5189 次点击
所在节点    Python
11 条回复
chairuosen
2013-12-07 21:51:28 +08:00
window.location.href=""
用来控制地址的
catsky
2013-12-07 21:55:27 +08:00
@chairuosen 谢谢,我本来是打算在后台的python代码里来实现

@app.route("/vote")
def vote():
user_id = request.args.get('uid', '')

if user_id == '':
return redirect('/signin') # 不起作用,页面无法重定位
....
chairuosen
2013-12-07 22:00:21 +08:00
@catsky 不太了解python,不过在后端直接控制前端页面刷新好像是不可能的。除非在前端的js里控制。
zenxds
2013-12-07 22:44:49 +08:00
没在那边登陆过,但是根据我的经验应该是这样的,三角形的链接是一直指向登陆的,当用户登陆的状态加载JS把三角的跳转阻止掉就可以了,未登陆的情况下不进行处理
strak47
2013-12-07 22:50:13 +08:00
大多数redirect 不是用 raise redirect吗...
cyr1l
2013-12-08 00:58:29 +08:00
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
txlty
2013-12-08 01:52:53 +08:00
不了解python,但类似return redirect('/signin')这样的语句,是在http报文头里增加Location:并生效的。
如果页面已经输出,http会话已经结束,也就无法控制信息头。这种语句就不会起作用。
有些语言,会发出一个警告错误。类似headers already sent....

另外,js的return false无法“返回”给服务端。只能作为一个参数向服务端发起请求。
txlty
2013-12-08 02:08:31 +08:00
晕倒!!看了一下news.dbanotes.net的实现方法,和楼主说的不是一回事。
登陆后href里的url加上了&by=xxx &auth=xxx 两个参数。并且加上了onclick="return vote(this)"。
登录前,相当于正常点击链接并跳转到对应地址,如果by / auth参数为空,则返回登录页面。
登录后,点击链接仍然访问对应地址,但通过return false阻断跳转,并执行去掉三角的操作。
txlty
2013-12-08 02:19:12 +08:00
访问对应地址是通过在页面上新建一个image实现的。
var ping = new Image();//新建一个图片
ping.src = node.href; //图片src为a标签里的herf值。相当于向href值发去一个get请求。
.....
return false; 让链接失效,不跳转。
这么玩有个小缺点。那就是服务端会收到一堆Content-Type:image请求而标准的应该是text/html;
浏览器会产生一个提示:Resource interpreted as Image but transferred with MIME type text/html:
txlty
2013-12-08 02:27:17 +08:00
更正一下,请求类型是Accept,返回的数据类型才是Content-Type
catsky
2013-12-08 08:26:16 +08:00
@txlty 谢谢。 后来我也看了非登陆状态下的代码,其在那个三角形的链接上没有这一段 “onclick=’return vote(this)‘“, 这样我就明白了。非登陆状态下,就是一个href链接,页面跳转; 登陆状态下,onclick函数返回false,页面不跳转,但是通过vote js函数进行get请求,增加页面point更新和服务器vote API 调用。

非常感谢。

另外,用new Image()进行一个API get请求,感觉怪怪的,以前没看到过

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/92213

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX