小编Kon*_*nel的帖子

如果响应是404,如何使用Service Worker来缓存跨域资源?

W3:

6.2跨源资源和CORS
应用程序倾向于缓存来自CDN或其他来源的项目.可以直接使用<script>, <img>, <video> 和<link>元素请求其中许多.如果这种运行时协作在离线时破坏,那将是极大的限制.类似地,当设置适当的CORS头时,XHR可能有许多种类的非原始资源.

ServiceWorkers通过允许Caches获取和缓存非原始项来实现此功能.但是,有一些限制.首先,与在Cache中作为Response属性设置为"basic"的Response对象管理的同源资源不同,存储的对象是类型属性设置为"opaque"的Response对象.类型为"opaque"的响应提供的API比响应类型为"basic"的表达要少得多; 无法读取或设置主体和标题,也不检查其内容的许多其他方面.它们可以以与响应类型为"基本"相同的方式传递给event.respondWith(r)方法,但不能以编程方式有意义地创建.这些限制对于保留平台的安全不变量是必要的.允许缓存存储它们允许应用程序在大多数情况下避免重新构建.

我已将CORS标题设置为:

Access-Control-Allow-Origin:https://xxx.xx.x.com
Access-Control-Allow-Credentials:true
Run Code Online (Sandbox Code Playgroud)

但我仍然得到一个"不透明"的响应,我无法确保代码是200.如果我缓存这些不成功的响应,它将导致一些问题.

例如,一个网络密码导致404到跨域资源,并且我将其缓存,然后在网络问题得到纠正时,我将始终使用此404缓存响应.同源资源没有这个问题.

javascript caching cross-domain service-worker

8
推荐指数
1
解决办法
1万
查看次数

为什么这一系列承诺会立即解决?

有人可以向我解释为什么d立即解决下面代码中的结果promise()?

//promises that are never resolved nor rejected
var a = new Promise(function(r,re){});
var b = new Promise(function(r,re){});
var c = new Promise(function(r,re){});

var d = [a, b, c].reduce(function (previousPromise, promise) {
    return previousPromise.then(promise);
  }, Promise.resolve());
Run Code Online (Sandbox Code Playgroud)

我创建永远未决承诺的阵列,因此所得到的承诺应等待所有后续承诺到结束也永远挂起(这里所提出).我已经使用了一段时间的承诺,但我在这里显然遗漏了一些东西.

Chrome DevTools  - 承诺执行代码

javascript promise ecmascript-6 es6-promise

7
推荐指数
1
解决办法
272
查看次数

Chrome - 检测浏览器关闭或标签关闭

当用户关闭chrome中的选项卡或窗口时,我在页面上使用了两个监听器,但它们似乎不起作用

chrome.tabs.onRemoved.addListener(function (integer tabId, object removeInfo) {alert("Haooooo")});

chrome.windows.onRemoved.addListener(function (integer windowId) {alert("Haooooo")});
Run Code Online (Sandbox Code Playgroud)

但是,以下函数检测窗口关闭或制表符关闭,但也会在刷新时触发.有没有人能够检测到仅适用于Chrome的浏览器/标签关闭.我不是在寻找这个在任何其他浏览器中工作.只在chrome中寻找解决方案

window.addEventListener("beforeunload", function (e) {          
          var confirmationMessage = "See you later" ;
          (e || window.event).returnValue = confirmationMessage;
          return confirmationMessage;
}
);
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome google-chrome-extension

7
推荐指数
1
解决办法
7080
查看次数

默认情况下,为Visual Studio 2012中的每个项目激活代码分析

有没有办法默认为每个项目激活Visual Studio 2012的代码分析功能?并且,如果可能,默认情况下将规则设置为"Microsoft All Rules".

每次创建新项目时,我都必须在项目属性中手动激活"在构建时启用代码分析",并且必须将规则设置为所有规则.有时我会忘记这样做,并且必须解决更多问题.如果它默认激活我可以防止.

.net code-analysis default visual-studio-2012

6
推荐指数
1
解决办法
1270
查看次数

测试同步代码

我有一段使用node-sync的代码,如下所示:

function funcA() {
  return new Promise(function(resolve, reject) {
    Sync(function () {
      return funcB.sync();
    }, function (err, result) {
      if(err) {
        reject(err);
      } else {
        resolve(result);
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

此代码使用mocha + chai进行测试:

it("should return array", function() {
  return funcA().then(function(result) {
    expect(result).to.be.an.instanceof(Array);
  });
});
Run Code Online (Sandbox Code Playgroud)

几个月前它工作得很好,但现在这个测试总是超时:

错误:超过2000毫秒的超时.确保在此测试中调用done()回调.

到目前为止我尝试过的:

  • 使用done()而不是返回一个承诺
  • 替换node-sync为synchronize.js
  • 增加超时

我发现的是,expect(...这个测试的一部分实际上是被调用的,但只有在摩卡杀死测试之后.无论当前设置的expect(..是什么超时间隔,都会在收到Error: timeout消息后约20毫秒被调用.

我通过setInterval(function(){}, 10)在测试文件的顶部添加来解决问题.我想知道为什么这有效,如果有更好的方法来解决这个问题?

[编辑]看起来这是一个特定于节点版本的问题.测试在0.12.4上失败,但在0.10.38上正确运行.

[编辑]实际代码可在此处获得.

mocha.js node.js

6
推荐指数
1
解决办法
1161
查看次数

远程调试 - 如何创建端口代理?

我正在尝试从方框B(Windows)访问在方框A(Debian)上运行的远程调试端口.在方框A上我运行带有--remote-debugging-port=9222标记的Chrome,我可以看到它正常工作(我可以localhost:9222从A上的其他浏览器访问).另外,我确定盒子A和B是连接的,因为我可以:80从盒子B上访问盒子A上运行的(apache)就好了.我现在需要做的是允许:9222在方框A上访问方框B.我已经完成了对端口转发和iptables规则的研究,但我没能使它工作.

编辑

机器B是Windows所以我不知道如何在那里使用ssh,我发现一个端口转发的应用程序似乎工作正常.它给了我一个错误:"收到连接但无法连接到主机-B:9222".所以看起来9222不适合外部连接.来自A上的netstat的输出给了我:

root@template:/home/developer# netstat -nap | grep 9222
tcp        0      0 127.0.0.1:9222      0.0.0.0:*    LISTEN      24300/user     
Run Code Online (Sandbox Code Playgroud)

google-chrome remote-debugging iptables portforwarding google-chrome-devtools

5
推荐指数
1
解决办法
1万
查看次数

为什么history.js使用setInterval(..,250)?

据我所知,History.js是HTML5历史/状态API的填充.因此,在现代浏览器中,它应该只使用popstate来监听URL更改.那么,为什么在最新的Chrome上我可以看到定时器每250ms发射一次?它看起来很浪费,并且每隔几秒触发一次垃圾收集器.

看看这个官方的History.js演示.

History.js演示页面每隔250ms触发一次计时器

javascript performance setinterval history.js html5-history

5
推荐指数
1
解决办法
333
查看次数

当地图最大缩小时,允许双指缩放手势

  1. 在移动设备上,请访问http://output.jsbin.com/bobaki/5
  2. 捏合按钮并单击它
  3. 尝试缩小以查看整个地图

这是不可能的,因为地图将劫持所有手势(即使它被最大限度地缩小).重新加载页面无济于事,因为重新加载之间会保留缩放设置.

我正在使用默认设置:

var map = new mapboxgl.Map({
    container: 'map',
    style: 'mapbox://styles/mapbox/streets-v10'
});
Run Code Online (Sandbox Code Playgroud)

并且我想更改它们,以便在最大限度地缩小地图时,mapbox会停止劫持和preventDefault缩小手势.

作为参考,这是它在我的手机上的样子(我无法显示URL栏,我无法向下滚动或缩小): 被困在地图上

zoom pinchzoom mapbox mapbox-gl-js

5
推荐指数
1
解决办法
175
查看次数

jspm不会将代码从ES6转换为ES5

运行jspm bundle-sfx some/input some/output.js不会将我的代码从ES6转换为ES5.这使输出文件不可用.

输入文件的示例内容:

[1,2,3,4].map((i)=>i*i);
Run Code Online (Sandbox Code Playgroud)

ecmascript-6 traceur jspm babeljs

4
推荐指数
1
解决办法
949
查看次数

是否可以在OSX Yosemite上制作Google Chrome Canary默认浏览器?

它以前是我的默认浏览器,但它不再起作用了.请看下面设置的屏幕截图.

这是Google Chrome的辅助安装,无法成为您的默认浏览器.

在此输入图像描述

macos google-chrome osx-yosemite

4
推荐指数
1
解决办法
1430
查看次数