当client端JS返回false是,如何让页面redirect到一个新页面 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
catsky
V2EX    Python

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

  •  
  •   catsky
    catsky 2013-12-07 21:37:48 +08:00 5721 次点击
    这是一个创建于 4390 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的,最近在试着用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
    }
    11 条回复    1970-01-01 08:00:00 +08:00
    chairuosen
        1
    chairuosen  
       2013-12-07 21:51:28 +08:00   1
    window.location.href=""
    用来控制地址的
    catsky
        2
    catsky  
    OP
       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
        3
    chairuosen  
       2013-12-07 22:00:21 +08:00
    @catsky 不太了解python,不过在后端直接控制前端页面刷新好像是不可能的。除非在前端的js里控制。
    zenxds
        4
    zenxds  
       2013-12-07 22:44:49 +08:00
    没在那边登陆过,但是根据我的经验应该是这样的,三角形的链接是一直指向登陆的,当用户登陆的状态加载JS把三角的跳转阻止掉就可以了,未登陆的情况下不进行处理
    strak47
        5
    strak47  
       2013-12-07 22:50:13 +08:00
    大多数redirect 不是用 raise redirect吗...
    cyr1l
        6
    cyr1l  
       2013-12-08 00:58:29 +08:00
    <html>
    <meta http-equiv="refresh" cOntent="0;url=http://www.baidu.com/">
    </html>
    txlty
        7
    txlty  
       2013-12-08 01:52:53 +08:00
    不了解python,但类似return redirect('/signin')这样的语句,是在http报文头里增加Location:并生效的。
    如果页面已经输出,http会话已经结束,也就无法控制信息头。这种语句就不会起作用。
    有些语言,会发出一个警告错误。类似headers already sent....

    另外,js的return false无法“返回”给服务端。只能作为一个参数向服务端发起请求。
    txlty
        8
    txlty  
       2013-12-08 02:08:31 +08:00   1
    晕倒!!看了一下news.dbanotes.net的实现方法,和楼主说的不是一回事。
    登陆后href里的url加上了&by=xxx &auth=xxx 两个参数。并且加上了Onclick="return vote(this)"。
    登录前,相当于正常点击链接并跳转到对应地址,如果by / auth参数为空,则返回登录页面。
    登录后,点击链接仍然访问对应地址,但通过return false阻断跳转,并执行去掉三角的操作。
    txlty
        9
    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
        10
    txlty  
       2013-12-08 02:27:17 +08:00
    更正一下,请求类型是Accept,返回的数据类型才是Content-Type
    catsky
        11
    catsky  
    OP
       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请求,感觉怪怪的,以前没看到过
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3826 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 05:17 PVG 13:17 LAX 21:17 JFK 00:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86