gpt4 book ai didi

jquery - 在某些页面上 IE 中的 iframe 访问被拒绝

转载 作者:行者123 更新时间:2023-12-03 22:09:22 25 4
gpt4 key购买 nike

我是 printThis 的作者,这是一个用于打印的 jquery 插件。

https://github.com/jasonday/printThis

我有一个用户提出了一个问题,我无法解决该问题,不幸的是,我无法共享该页面(隐私问题)。

在用户的站点上,该问题出现在 IE 的某些页面上,但其他页面上则没有。由于 iframe 仍为空,因此打印失败。

IE 中的错误是在 jQuery 中:

contents: function (a) {
return f.nodeName(a,
"iframe") ? a.contentDocument || a.contentWindow.document : f.makeArray(a.childNodes)
}

使用日志记录,我能够确定它在这一行失败:

var $doc = $("#" + strFrameName).contents();

但同样,这种情况仅发生在某些页面上,我无法在此用户网站之外的任何实例中重新创建。

我的问题:这里有更好的方法吗?或者让 $doc 对象更加防弹的方法?

<小时/>
// -----------------------------------------------------------------------
// printThis v1.1
// Printing plug-in for jQuery
//
// Resources (based on) :
// jPrintArea: http://plugins.jquery.com/project/jPrintArea
// jqPrint: https://github.com/permanenttourist/jquery.jqprint
// Ben Nadal: http://www.bennadel.com/blog/1591-Ask-Ben-Print-Part-Of-A-Web-Page-With-jQuery.htm
//
// Dual licensed under the MIT and GPL licenses:
// http://www.opensource.org/licenses/mit-license.php
// http://www.gnu.org/licenses/gpl.html
//
// (c) Jason Day 2012
//
// Usage:
//
// $("#mySelector").printThis({
// debug: false, //show the iframe for debugging
// importCSS: true, // import page CSS
// printContainer: true, // grab outer container as well as the contents of the selector
// loadCSS: "path/to/my.css" //path to additional css file
// });
//
// Notes:
// - the loadCSS option does not need @media print
//------------------------------------------------------------------------

(function($) {
var opt;

$.fn.printThis = function (options) {
opt = $.extend({}, $.fn.printThis.defaults, options);

var $element = (this instanceof jQuery) ? this : $(this);

// if Opera, open a new tab
if ($.browser.opera)
{
var tab = window.open("","Print Preview");
tab.document.open();


}
// add dynamic iframe to DOM
else
{
var strFrameName = ("printThis-" + (new Date()).getTime());

var $iframe = $("<iframe id='" + strFrameName +"' src='about:blank'/>");

if (!opt.debug) { $iframe.css({ position: "absolute", width: "0px", height: "0px", left: "-600px", top: "-600px" }); }

$iframe.appendTo("body");

}
// allow iframe to fully render before action
setTimeout ( function () {

if ($.browser.opera)
{
var $doc = tab.document;
} else
{
var $doc = $("#" + strFrameName).contents();
}



// import page css
if (opt.importCSS)
{
$("link[rel=stylesheet]").each(function(){
var href = $(this).attr('href');
if(href){
var media = $(this).attr('media') || 'all';
$doc.find("head").append("<link type='text/css' rel='stylesheet' href='" + href + "' media='"+media+"'>");
}
});
}

// add another stylesheet
if (opt.loadCSS)
{
$doc.find("head").append("<link type='text/css' rel='stylesheet' href='" + opt.loadCSS + "'>");

}

//add title of the page
if (opt.titlePage)
{
$doc.find("head").append('<title>'+opt.titlePage+'</title>');
}
//grab outer container
if (opt.printContainer) { $doc.find("body").append($element.outer()); }
else { $element.each( function() { $doc.find("body").append($(this).html()); }); }

//$doc.close();
// print
($.browser.opera ? tab : $iframe[0].contentWindow).focus();
setTimeout( function() { ($.browser.opera ? tab : $iframe[0].contentWindow).print(); if (tab) { tab.close(); } }, 1000);

//removed iframe after 60 seconds
setTimeout(
function(){
$iframe.remove();
},
(60 * 1000)
);
}, 333 );
}


$.fn.printThis.defaults = {
debug: false, //show the iframe for debugging
importCSS: true, // import page CSS
printContainer: true, // grab outer container as well as the contents of the selector
loadCSS: "", //path to additional css file
titlePage: "" //add title to print page
};


jQuery.fn.outer = function() {
return $($('<div></div>').html(this.clone())).html();
}
})(jQuery);

更新

问题归因于document.domain

此类页面设置了 document.domain,并且 IE 不会从父级继承 document.domain

为了修复该部分,我将 iframe 创建更改为标准 javascript,并将源设置为在 iframe 创建时写入 document.domain

    var printI= document.createElement('iframe');

printI.name = "printIframe";

printI.id = strFrameName;

document.body.appendChild(printI);

printI.src = "javascript:document.write('<head><script>document.domain=\"mydomain.com\";</script></head><body></body>')";


var $iframe = $("#" + strFrameName);

因此,这修复了访问被拒绝的问题,但是现在框架将无法打印。我尝试了很多不同的方法来访问该对象,但是它们都不起作用。

A)在这种情况下如何访问框架(我已经尝试了 SO 中概述的大多数方法)以使 IE 识别并打印

B) 谁能想到更好的方法来使用 jQuery 创建 document.domain 并将其放入 iframe 中? (不能是之后,因为会出现访问被拒绝的问题)

最佳答案

在您的代码中,您使用 setTimeout 在 iframe 加载后执行您的函数。

// allow iframe to fully render before action
setTimeout ( function () {
...
}, 333 ); //333ms

但这是一个错误,因为您不知道给定的时间是否足以加载 iframe。 Javascript 执行是异步的,因此不能保证 setTimeout 会在 iframe 加载之前偏移函数的执行。由于不同页面的加载时间不同。有些无法正确执行代码,指向您发现导致错误的行。

var $doc = $("#" + strFrameName).contents();  //only after loading

正确的方法是使用事件loadonload来了解DOM对象是否已正确加载。

<script>
document.getElementById("myframe").onload = function() {
alert("myframe is loaded");
};
</script>
//or
<iframe id="myFrame" onload="myFunction();"></iframe>

关于jquery - 在某些页面上 IE 中的 iframe 访问被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14879192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com