在旧 iPhone 和旧三星 S4 上的网络浏览器中存在微妙的 javascript 问题。它在使用了 2 年的 Acer 手机上运行良好。试图查明问题,我将 JS 分成几个script
块并alert
在每个块中调用:
<script>
// ...JS code...
alert('JS0 end');
</script>
<script>
try{
alert('JS1 start');
// button handler to scan a barcode
function scan_barcode() {
$('#div_viewarea').show();
$('#input_barcode').val('');// clear the barcode field
log('scanning...');//clear message field
// install the handler to process a barcode fount by quagga
Quagga.onDetected(quagga_found_barcode);//callback stops Quagga
// The Quagga config data for the LiveStream method accessing the camera directly
var quagga_config_livestream = {
inputStream: {
//constraints: { width: 500, height: 500 },
//area: { top: '50%', right: '50%', left: '50%', bottom: '50%' },
target: document.querySelector('#div_viewarea'),
name: "Live",
type: "LiveStream"
},
quagga_decoders
};
// initialize/start/run the Quagga barcode module
Quagga.init(quagga_config_livestream, quagga_on_init);
return;
}
alert('JS1 end');
}
catch(e){
alert('exception 1: ' + e);
}
</script>
<script>
// ...JS code...
alert('JS2 end');
</script>
在 Acer 手机上,我得到了 JS0/1/2 的对话框,但在 iPhone 上只有 JS0+2,所以在我显示完整 JS 代码的中间脚本块中出现了问题。
在 Windows 上的 firefox 上运行该页面,F12 调试器显示没有问题。但是在手机浏览器上没有 F12 调试器。
我还尝试使用 获取 JS 异常try/catch
,但没有为异常显示对话框。
所以我的问题是: - 中间脚本块有什么问题?- 如何在手机上调试 JS 代码?- 有没有比仅仅分成几个脚本块更好的方法?
顺便说一句,第二个代码块中的代码在旧手机上并不是很有趣,因为根据Quagga上的文档,旧手机不支持 MediaDevices API。但是如果我把所有的JS代码放在一个脚本块里,中间出问题的JS就根本跑不起来了。
更新:
我认为这是旧浏览器/设备中的错误。不过,它在三星 S4 上的 Firefox 中运行良好。我能够将问题隔离到变量的分配,quagga_config_livestream
但发现既没有触发异常,也没有alert
显示它的对话框,这非常令人惊讶。因为这个错误发生在一段与不支持 MediaDevices API 的旧设备无关的 JS 代码中,我只是将那几行 JS 沙箱化到它自己的script
块中,并且不会费心安装新工具来远程调试它设备本身的代码。