Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在打开新窗口之前,如何确保单击函数中的所有代码都已执行?_Javascript_Angularjs_Tracking - Fatal编程技术网

Javascript 在打开新窗口之前,如何确保单击函数中的所有代码都已执行?

Javascript 在打开新窗口之前,如何确保单击函数中的所有代码都已执行?,javascript,angularjs,tracking,Javascript,Angularjs,Tracking,我有一个功能,点击时触发,向谷歌发送一个跟踪事件,向我的服务器发送一个请求,在数据库中创建一个记录 对于桌面用户来说一切都很好,但对于一些移动用户来说,谷歌会记录我的数据库没有记录的点击事件。经过一些研究,我认为我已经缩小了问题的范围,通过web视图打开一个新窗口会导致前一个窗口停止执行JavaScript,因此对我的服务器的请求永远不会被发送。我暂时缓解了这个问题,在打开窗口时增加了一点延迟,但最近我注意到web浏览器中内置的弹出窗口拦截器正在阻止窗口,所以我不得不消除延迟 Html: 使用承

我有一个功能,点击时触发,向谷歌发送一个跟踪事件,向我的服务器发送一个请求,在数据库中创建一个记录

对于桌面用户来说一切都很好,但对于一些移动用户来说,谷歌会记录我的数据库没有记录的点击事件。经过一些研究,我认为我已经缩小了问题的范围,通过web视图打开一个新窗口会导致前一个窗口停止执行JavaScript,因此对我的服务器的请求永远不会被发送。我暂时缓解了这个问题,在打开窗口时增加了一点延迟,但最近我注意到web浏览器中内置的弹出窗口拦截器正在阻止窗口,所以我不得不消除延迟

Html:

使用承诺:

new Promise(function(resolve, reject) {
  // your code to your server
  // after your server replied to the call
  resolve();
}).then(function(data) {
  // google track code
});

你能发布你的代码吗?在手机屏幕上点击某个东西与在电脑上点击某个东西并不完全相同。根据你的编码方式,你可能无法正确处理触摸事件以执行点击逻辑。我添加了一个简化版本的代码。这与使用回调有什么不同吗?我将$window.open调用放入回调中,弹出窗口阻止程序停止了它。Links.save(linkObj);它应该返回一个承诺,以便在这里连接对google tracking和window.open的调用。你收到我的消息了吗?使用承诺不起作用。在手机上,从任何类型的回调启动窗口打开都会被阻止。
$scope.captureClick = function(link){
  //Send Google Analytics click event
  ga('send', 'event', 'click');

  var linkObj = {
    //Create object with click details
  };
  Links.save(linkObj);

  $window.open(link);
};
new Promise(function(resolve, reject) {
  // your code to your server
  // after your server replied to the call
  resolve();
}).then(function(data) {
  // google track code
});