javascript - jQuery UI 对话框中的 IFrame 有时不会在 Chrome 中加载内容,直到对话框被移动或调整大小(但适用于 FF 和 Edge)
问题描述
这真的很奇怪。我有一个网站,它大量使用 jQuery UI 对话框来显示 iframe。iframe 从网站本身加载内容,因此不存在来源问题。
在 FireFox 和 Edge 中完美运行。但是在 Chrome(我的版本是 87)中,它有时只显示一个白色的空白对话框,直到您单击标题栏并移动它!或者,直到您打开开发人员工具。
这让我非常抓狂,但如果其他人也有同样的奇怪问题,我最终找到了两个解决方案(发布在下面)。
解决方案
第一步:当 iframe 完成加载时,我必须添加一些代码。前任:
// if we are inside our iframe...
$(document).ready(function() { parent.nudgeiFrame(); });
这会调用父页面上的一个函数,该函数正在加载对话框,而不是来自 iframe 本身!
解决方案#1(不太优雅)
在短暂的延迟之后,它会将整个对话“微调”一个像素。这工作得非常好,但如果他们不断重新加载它,它的缺点是让你的对话框慢慢地在屏幕上向下移动。大多数用户可能永远不会注意到它,所以我保留了这个选项一段时间:
function nudgeiFrame() {
setTimeout(function() {
$("div[role=dialog]").each(function() {
$(this).addClass('ui-draggable-dragging');
$(this).addClass('ui-dialog-dragging');
var y = $(this).css('top');
var oldy = y;
y = parseFloat(y.replace("px", ""));
var newy = (y + 1) + "px";
$(this).css('top', newy);
});
}, 75);
}
解决方案#2(更优雅)
我发现(通过几个小时的测试)我真正需要做的就是向对话框(而不是 iframe)添加内容。
我决定添加一个简单的,这样它就不会导致对话框调整大小或类似的东西。信不信由你,这行得通,不会造成我能看到的任何不良影响。
function nudgeiFrame() {
setTimeout(function() {
$("div[role=dialog]").each(function() {
$(this).append("<span></span>");
});
}, 75);
}
我希望这可以帮助那里的人。我花了这么长时间才弄清楚。
推荐阅读
- angular - 在 Angular 中的 TextArea 内的当前(或最后一个)插入符号位置插入文本;元素不被解释为 TextArea
- docker - 为什么相同的 Docker 映像会在不同的存储库上生成具有不同 SHA-256 的不同清单?
- c# - 由于游戏对象处于非活动状态,无法启动 Couroutine
- c++ - 何时在 GCC 的成员函数指针中使用 delta?
- indexing - 为什么在 EF Core 中默认只为复合 PK 定义一个索引?
- python - 如何根据深度嵌套的键对嵌套字典列表进行排序?
- c# - 使用 EF 框架的 .NET 核心 MVC - 将数据从一个控制器传递到另一个控制器
- docker - 如何将多个参数传递给容器
- database - 如何对标称属性进行一次热编码以输出为完整的二进制文件?
- jmeter - 处理 JTL 日志阶段失败并出现错误“groovy.lang.MissingPropertyException: No such property: jtl for class: java.lang.String”