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 · 5177 次点击
    这是一个创建于 3790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是这样的,最近在试着用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   ·   我们的愿景   ·   实用小工具   ·   1220 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:11 · PVG 02:11 · LAX 11:11 · JFK 14:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.