最近因为浏览器更新了,使用好好的screenfull.js突然报错了:Failed to execute 'requestFullscreen' on 'Element': parameter 1 ('options') is not an object
于是进入node_modules找到screenfull.js的模块,找到报错的地方,
elem = elem || document.documentElement;
// Work around Safari 5.1 bug: reports support for
// keyboard in fullscreen even though it doesn't.
// Browser sniffing, since the alternative with
// setTimeout is even worse.
if (/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)) {
elem[request]();
} else {
elem[request](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT);
}
此处调用requestFullscreen 时传入的是一个布尔值,是通过判断Element.ALLOW_KEYBOARD_INPUT的到的,该值意为支持键盘输入。实际测试在71,70 及 59 版本 该值均是 undefined ,而且不传入也同样可以键盘输入。不太清楚是否是早期版本非标准的实现。
查阅MDN文档,Chrome在71版本实现了 FullscreenOptions (划重点),该参数参数必须是一个对象,实测 undefined 或不传也是可以的 ,但传入一个布尔值就直接抛出了异常。对象属性只有一个 navigationUI。
navigationUI 的值:
auto : 默认 ,交给处理
hide : 隐藏导航界面
show: 显示导航界面,收缩界面元素留出更多的空间给页面展示。
我在chrome中又尝试了这个几个值,未发现界面有什么不同之处。
于是,只要对这个文件的上部分增加一个判断即可
elem = elem || document.documentElement;
// Work around Safari 5.1 bug: reports support for
// keyboard in fullscreen even though it doesn't.
// Browser sniffing, since the alternative with
// setTimeout is even worse.
if (/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)) {
elem[request]();
} else {
// elem[request](keyboardAllowed && Element.ALLOW_KEYBOARD_INPUT);
if (keyboardAllowed) {
elem[request](Element.ALLOW_KEYBOARD_INPUT);
} else {
elem[request]({ navigationUI: "auto" });
}
}
然后保存,再重新点击全屏,即不会报错了(注意,若果重新安装了依赖可能问题会重新出现,得重新修改)。