【发布时间】:2020-07-07 10:48:19
【问题描述】:
一个应用正在使用带有 InAppBrowser 插件版本 3.2.1 的 Cordova 来加载在 Asp.Net 4.5.2 中构建的网页。我们一直在遇到不稳定的行为,所以我制作了一个页面来发现问题并在这里分享。
此页面包含一个非常简单的按钮,在 onclick event 中执行 JS:
<button onclick="alert('1'); alert('2'); alert('3');"> EXECUTION</button>
完美运行,但是当网站嵌入app时,执行顺序倒退,显示:
- 警报 3
- 警报 2
- 警报 1
使用不显眼的 JS 获得相同的结果:
<button id="testButton">Test</button>
$(document).ready(function () {
$("#testButton").click(function () {
alert('1');
alert('2');
alert('3');
});
});
在 ios 中使用 Safari 运行网站效果很好。
有什么想法吗?
更新
正如 @Bergi 在 cmets 中所建议的,添加睡眠 timeout 可以验证管理同步调用的问题。以下代码以正确的顺序触发警报:
$("#testButton").click(function () {
alert('1');
setTimeout(function () { alert('2'); }, 2000);
setTimeout(function(){ alert('3'); }, 4000);
});
但不是在超时更近的时候。以下以错误的顺序显示警报:
$("#testButton").click(function () {
alert('1');
setTimeout(function () { alert('2'); }, 1);
setTimeout(function(){ alert('3'); }, 2);
});
更新 2
正如@Bergi 在 cmets 中提出的,我已经尝试过:
$("#testButton").click(function () {
var x = []; x.push(1); x.push(2); alert(x);
});
如果结果正确,则会显示一条警报,其中包含:“1,2”。
Issue已被举报。
【问题讨论】:
-
我猜他们的嵌入没有提供适当的
alert同步版本,一次渲染它们(在彼此之上)。您可以尝试在两者之间添加一些sleep()调用来验证这一点。 -
"有什么想法吗?" - 不要使用
alert():-) -
@MarioLevrero 你是说 actual 代码向后运行(所以这不是警报显示方式的产物)?请同时提供该代码
-
@MarioLevrero 就像您执行
var x = []; x.push(1); x.push(2); alert(x)时会发生什么一样 - 它会引发异常吗?或提醒2,1?还是按预期工作? -
@Bergi 的第一条评论听起来像是答案。您可以在每个
alert()调用之间通过某种日志记录或断点轻松确认这一点,而不是超时。此浏览器是否支持console.log或debugger语句?如果没有,您可以在两者之间放置fetch或XMLHttpRequest调用以获取服务器上一些不存在的资源,例如fetch("log-one"),fetch("log-two")。获取将失败并出现 404 错误,但您可以检查服务器日志以查看它们到达的顺序。我敢打赌,在您点击任何警报之前,它们都会连续到达。
标签: javascript cordova cordova-plugins inappbrowser