<p>[编辑] 添加了一个缺失的括号。 在一个动态插入的 iframe 中

申报这个

[DllImport("user32")]
private static extern bool SetForegroundWindow(IntPtr hwnd);
[DllImport("user32")]
private static extern bool ShowWindowAsync(IntPtr hwnd, int a);

如果我们在一个单独的函数中提取文档调用的函数,并在超时100毫秒后调用它,那么这个函数可以工作,但是我们不能冒险在生产中使用速度慢的计算机。

$(document).ready(function() { setTimeout(ApplyGalleria, 100); });

我的问题是: 当动态 iframe 准备好而不仅仅是它的父级时,我们应该绑定哪个 jQuery 事件来执行我们的代码?

357544 次浏览

在处理 iframe 时,我发现使用 load 事件而不是 document ready 事件已经足够好了。

如果在 Windows 上使用

Process process = new Process();
process.StartInfo.FileName = "Test.txt";
process.Start();

在 IFrames 中,我通常通过在代码块的末尾放一个小脚本来解决这个问题:

<body>
The content of your IFrame
<script type="text/javascript">
//<![CDATA[
fireOnReadyEvent();
parent.IFrameLoaded();
//]]>
</script>
</body>

适用于.Net Framework,但是适用于 Net core 3.1,还需要将 UseShellExecute 设置为 true

Process process = new Process();
process.StartInfo.FileName = "Test.txt";
process.StartInfo.UseShellExecute = true;
process.Start();

这个工作大部分时间对我来说。有时最简单和最天真的解决方案是最合适的。

此代码位于 iframe 中,但绑定到父文档中控件的事件。它适用于 FireFox 和 IE。

相反,我为了自己的目的实现了一个轮询解决方案:

$(function() {
function manipIframe() {
el = $('body', $('iframe').contents());
if (el.length != 1) {
setTimeout(manipIframe, 100);
return;
}
el.html('Hello World!');
}
manipIframe();
});

我将 UITextField的委托设置为 ViewController类。

这不需要被调用的 iframe 页面中的代码,所有代码都驻留在父框架/窗口中并执行。

viewDidLoad法。

- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}

还可以在控制器中创建方法

 -(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}

我正在用 jQuery ajax 将 PDF 加载到浏览器缓存中。然后使用浏览器缓存中已有的数据创建嵌入元素。我想它也可以和 iframe 一起工作。


var url = "http://example.com/my.pdf";
// show spinner
$.mobile.showPageLoadingMsg('b', note, false);
$.ajax({
url: url,
cache: true,
mimeType: 'application/pdf',
success: function () {
// display cached data
$(scroller).append('<embed type="application/pdf" src="' + url + '" />');
// hide spinner
$.mobile.hidePageLoadingMsg();
}
});

您还必须正确设置您的 http 头。


HttpContext.Response.Expires = 1;
HttpContext.Response.Cache.SetNoServerCaching();
HttpContext.Response.Cache.SetAllowResponseInBrowserHistory(false);
HttpContext.Response.CacheControl = "Private";

然后在连接检查器在 IB 连接事件“确实在退出时结束”到它。

遵循约克普博士和大卫 · 默多克的想法,我实现了一个更完整的版本。 > var iframe = window.frameElement; 如果(iframe){ 它对父级和 iframe 以及 iframe 进行 需要 jQuery 控制。

ContentDocument = document;//标准化: 一些浏览器不设置 contentDocument,只设置 contentWindow

Iframe 代码:

var iframe = window.frameElement;


if (iframe){
iframe.contentDocument = document;//normalization: some browsers don't set the contentDocument, only the contentWindow


var parent = window.parent;
$(parent.document).ready(function(){//wait for parent to make sure it has jQuery ready
var parent$ = parent.jQuery;


parent$(iframe).trigger("iframeloading");


$(function(){
parent$(iframe).trigger("iframeready");
});


$(window).load(function(){//kind of unnecessary, but here for completion
parent$(iframe).trigger("iframeloaded");
});


$(window).unload(function(e){//not possible to prevent default
parent$(iframe).trigger("iframeunloaded");
});


$(window).on("beforeunload",function(){
parent$(iframe).trigger("iframebeforeunload");
});
});
}
Var parent = window.parent;

家长测试代码:

$(function(){
$("iframe").on("iframeloading iframeready iframeloaded iframebeforeunload iframeunloaded", function(e){
console.log(e.type);
});
});
$(Parent.document) . ready (function (){//wait for father to make sure it has jQuery ready

这正是我遇到的问题。我创建了一个小的 jquery 插件,它似乎可以支持 iframe 准备工作。它使用轮询检查 iframe 文档 readyState 和内部文档 url 以及 iframe 源代码,以确保 iframe 实际上已经“就绪”。

Var parent $= parent.jQuery; 家长 $(iframe)触发器(“ iframeloading”) ;

“ onload”的问题是,您需要访问添加到 DOM 的实际 iframe,如果您不这样做,那么您需要尝试捕获 iframe 加载,如果它被缓存,那么您可能不会。我需要的是一个可以随时调用的脚本,并确定 iframe 是否“准备好”。

$(函数(){

问题是:

家长 $(iframe)触发器(“ iframeready”) ; }); $(window) . load (function (){//kind 的不必要,但在这里需要完成

确定本地 iframe 是否已加载的圣杯

这是我最后想出来的小提琴。

家长 $(iframe)触发器(“ iframeloaded”) ;

Https://jsfiddle.net/q0smjkh5/10/

}); $(窗口) . unload (函数(e){//不可能防止默认

在上面的 jsfiddle 中,我正在等待 onload 给 dom 添加一个 iframe,然后检查 iframe 内部文档的就绪状态——应该是跨域的,因为它指向了 Wikipedia ——但 Chrome 似乎报告“完成”。插件的 iready 方法然后在 iframe 实际准备就绪时被调用。回调试图再次检查内部文档的就绪状态——这次报告跨域请求(这是正确的)——无论如何,它似乎对我的需要有用,并希望它能帮助其他人。

<script>
(function($, document, undefined) {
$.fn["iready"] = function(callback) {
var ifr = this.filter("iframe"),
arg = arguments,
src = this,
clc = null, // collection
lng = 50,   // length of time to wait between intervals
ivl = -1,   // interval id
chk = function(ifr) {
try {
var cnt = ifr.contents(),
doc = cnt[0],
src = ifr.attr("src"),
url = doc.URL;
switch (doc.readyState) {
case "complete":
if (!src || src === "about:blank") {
// we don't care about empty iframes
ifr.data("ready", "true");
} else if (!url || url === "about:blank") {
// empty document still needs loaded
ifr.data("ready", undefined);
} else {
// not an empty iframe and not an empty src
// should be loaded
ifr.data("ready", true);
}


break;
case "interactive":
ifr.data("ready", "true");
break;
case "loading":
default:
// still loading
break;
}
} catch (ignore) {
// as far as we're concerned the iframe is ready
// since we won't be able to access it cross domain
ifr.data("ready", "true");
}


return ifr.data("ready") === "true";
};


if (ifr.length) {
ifr.each(function() {
if (!$(this).data("ready")) {
// add to collection
clc = (clc) ? clc.add($(this)) : $(this);
}
});
if (clc) {
ivl = setInterval(function() {
var rd = true;
clc.each(function() {
if (!$(this).data("ready")) {
if (!chk($(this))) {
rd = false;
}
}
});


if (rd) {
clearInterval(ivl);
clc = null;
callback.apply(src, arg);
}
}, lng);
} else {
clc = null;
callback.apply(src, arg);
}
} else {
clc = null;
callback.apply(this, arguments);
}
return this;
};
}(jQuery, document));
</script>
家长 $(iframe)触发器(“ iframe 卸载”) ; });

基本上,其他人已经发布了,但恕我直言,有点干净:

$('<iframe/>', {
src: 'https://example.com/',
load: function() {
alert("loaded")
}
}).appendTo('body');
$(window) . on (“ before unload”,function (){ 父元素 $(iframe)触发器(“ iframe before unload”) ; }); });

这个来自 这个答案的函数是处理这个问题的最佳方法,因为对于 iframe,$.ready显式失败。决定是这样的不支持这个。

}

家长测试代码:

$(function(){
$("iframe").on("iframeloading iframeready iframeloaded iframebeforeunload iframeunloaded", function(e){
console.log(e.type);
});
});

如果 iframe 已经加载,则 load事件也不会触发。非常令人沮丧的是,这仍然是一个问题,在2020年!

function onIframeReady($i, successFn, errorFn) {
try {
const iCon = $i.first()[0].contentWindow,
bl = "about:blank",
compl = "complete";
const callCallback = () => {
try {
const $con = $i.contents();
if($con.length === 0) { // https://git.io/vV8yU
throw new Error("iframe inaccessible");
}




successFn($con);
} catch(e) { // accessing contents failed
errorFn();
}
};
const observeOnload = () => {
$i.on("load.jqueryMark", () => {
try {
const src = $i.attr("src").trim(),
href = iCon.location.href;
if(href !== bl || src === bl || src === "") {
$i.off("load.jqueryMark");
callCallback();
}
} catch(e) {
errorFn();
}
});
};
if(iCon.document.readyState === compl) {
const src = $i.attr("src").trim(),
href = iCon.location.href;
if(href === bl && src !== bl && src !== "") {
observeOnload();
} else {
callCallback();
}
} else {
observeOnload();
}
} catch(e) {
errorFn();
}

}