阻止sammy.js窃取'真正的链接'

时间:2013-08-31 01:21:26

标签: javascript knockout.js sammy.js

我最近开始使用knockout.js和sammy.js来改进我的应用程序。但是我遇到了一些问题。

我在页面上有一些有效的链接 - 用户应该实际导航到该位置,而不是使用sammy.js模仿导航行为。我只想通过sammy.js路由基于散列的链接,但它也会拦截不包含任何哈希值的链接。

例如,

拦截<a href="/logout">logout</a>

执行路由的js部分是:

Sammy(function () {
    this.get('#/', function () {
         ...
    });

    this.get('#:id', function () {
         ...
    });

    this.get('', function () { this.app.runRoute('get', '#/') });
}).run();

我认为this.get('' .. )部分是调用此行为的罪魁祸首 - 我是从knockout.js教程得到的,该教程说该行必须允许其他来源的用户正确浏览我的网页。 knockout.js代码运行的页面是/w/。我希望sammy.js只能在/w/中使用,或者至少允许用户导航到/logout。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:10)

我使用Sammy已经有一段时间,但我认为您可以使用disable_push_state设置关闭此行为:

Sammy(function() {
  this.disable_push_state = true;
  ...
});

答案 1 :(得分:1)

您可以使用“around”功能。有很多选择。我建议如下,

假设有一些网址。在点击该URL时,您希望将服务器与页面进行通信。例如,注销网址如“/ logout”。

现在按以下方式制作该网址

"/logout?reload=true"

这样,您可以通过遵循Sammy的代码来控制

Sammy(function(){

    this.around(function(callback) {
        if(this.params.reload === 'true')       
           location.replace(this.path);
        else
           callback();
    });
    // Your routers are going to be here

}).run()

答案 2 :(得分:0)

我发现如果我将window.location与启动时存储的窗口位置的副本进行比较,我可以安全地逃脱Sammy陷阱。如果基本网址匹配,我运行基本路由。如果它们不匹配,我重新加载window.location并卸载Sammy.js。

function myUrl() {
    var url= window.location.href;
    if (window.location.hash) {
        url= url.replace(window.location.hash, "");
    }
    if (window.location.search) {
        url= url.replace(window.location.search, "");
    }
    return url;
}

...

Sammy(function () {

    var myLocation = myUrl();

    ...

    this.get('', function () { 
        if (myLocation === myUrl()) {
            this.app.runRoute('get', '#/');
        } else {
            window.location.reload(true);
            this.unload();
        }
    });
}).run();