0

如果有人知道为什么window.open()Meteor.call(). window.open(url)您可以通过在客户端上调用a 的回调来轻松重现这一点Meteor.call('method',argument,callback(e,r){...})。在回调之外它工作,在回调内部,window.location = url正确重定向。

我的数据库中有一些来自 filepicker.io 的安全 URL。由于提前生成所有策略和签名效率低下,因此我想在有人实际尝试检索这些文件时在 click 事件中生成它们。不幸的是,在 的客户端回调中Meteor.call('methodname',param,callback(e,r){...})window.open(url)似乎不起作用,我不知道为什么。

模板

<template name="upload">
  <div class="btn-group btn-group-vertical">
    {{#each files}}
      <button id="fp" class="btn btn-primary">{{filename}}</button>
    {{/each}}
  </div>
</template>

客户端/client.js

Template.upload.files=function(){
    return files.find({});
}
Template.upload.events({
  'click #fp':function(){
    // window.open(this.url)
    // if I uncomment the above line, a new window
    // opens with the unsigned url
    // (this.url is a valid mongo cursor)
    Meteor.call('signedUrl',this.url,function(err,result){ // result is signed url
      console.log(result); // loggs the correct url in the console
      // window.location = result;
      // if uncommented, the line above redirects correctly 
      window.open(result); // does NOT open the new window with the signed url
    });
  }
});

服务器/server.js

Meteor.methods({
  signedUrl: function(url) {
    // some proven-to-work-code that you can find at
    // http://stackoverflow.com/questions/18546676
    console.log(signed_url); // loggs the correctly signed url on the server
    return signed_url;
  }
});

提前感谢您的任何提示!此致

4

1 回答 1

1

这很可能被 chrome/safari 的反弹出过滤器捕获。

您可能希望以非恶意方式使用新窗口,但现代浏览器需要用户输入才能打开新窗口。在回调中没有用户输入“触发器”,因此浏览器可能会认为它是弹出/广告。

真的没有太多的方法可以通过这个。您可以在回调运行时创建一个新按钮,然后要求用户单击它以打开一个新窗口。

于 2013-09-02T17:18:48.953 回答