我是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)
}
Run Code Online (Sandbox Code Playgroud)
使用日志记录,我能够确定它在此行中失败:
var $doc = $("#" + strFrameName).contents();
Run Code Online (Sandbox Code Playgroud)
但同样,这只发生在某些页面上,我无法在该用户网站之外的任何实例中重新创建.
我的问题:这里有更好的方法吗?或一种使$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:
// …Run Code Online (Sandbox Code Playgroud) 我通过以下方式动态创建IFRAME:
var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';
document.body.appendChild(wrapUpIframe);
Run Code Online (Sandbox Code Playgroud)
在动态创作之后,我document.domain被缩短Servername.dc.com到只有dc.com,
但是当我尝试访问时,contentWindow我得到了一个Access被拒绝的错误:
document.getElementById("WrapUpDialog3").contentWindow.SomeFunction();
Run Code Online (Sandbox Code Playgroud)
注意:当我在HTML中静态定义IFRAME时,它可以正常工作.
我还试图document.domain通过以下方式更改我的IFRAME :
WrapUpDialog3.document.domain = dc.com;
Run Code Online (Sandbox Code Playgroud)
我检查了两个document.domain和我的IFRAME域,它们都是相同的.
我能做什么?
我正在使用IE9.
我迫切需要一些帮助.
我创建了一个非常平行的<script>,并重现了我在其他地方写过的另一个更复杂的<script>的问题.
这是它的作用:
涉及的三个文件是:
这一切都适用于Firefox,Safari和Chrome.它崩溃的地方是Internet Explorer和Opera.会发生什么是main.js中的render()函数执行,并且触发了所有三个警报,但<iframe>中的文档没有被覆盖.我无法分辨出正在创建或写入的文档,或者根本不是.
如果我在render()函数的开头添加调试代码(如console.log(document)),那么工作浏览器似乎可以获得现有<iframe>文档的句柄并列出下面包含的属性.Internet Explorer似乎也可以找到某种文档.我只是不知道为什么不让我覆盖它.
这可能是范围问题吗?也许我不正确地使用document.write(),document.open()或document.close()方法,Firefox和其他一些浏览器只是让我逃脱它?
一个可能的线索:如果我把render()函数的内容拿出来(即,只是把它们放在main.js中的load()之后),这样可以正常工作.这告诉我,我不是如何使用document.open()等,但是在执行callback()函数时,文档对象不可用,或者超出了范围,或类似的东西.
这让我非常难过,这是一个非常重要的项目,即将到期.如果它让我摆脱这种干扰,我不会超越黑客或解决方法.任何帮助或见解都将非常感激!
console.log()的文档属性列表:
ATTRIBUTE_NODE: 2
CDATA_SECTION_NODE: 4
COMMENT_NODE: 8
DOCUMENT_FRAGMENT_NODE: 11
DOCUMENT_NODE: 9
DOCUMENT_POSITION_CONTAINED_BY: 16
DOCUMENT_POSITION_CONTAINS: 8
DOCUMENT_POSITION_DISCONNECTED: 1
DOCUMENT_POSITION_FOLLOWING: 4
DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 32
DOCUMENT_POSITION_PRECEDING: 2
DOCUMENT_TYPE_NODE: 10
ELEMENT_NODE: 1
ENTITY_NODE: 6
ENTITY_REFERENCE_NODE: 5
NOTATION_NODE: 12
PROCESSING_INSTRUCTION_NODE: 7
TEXT_NODE: 3
URL: "http://localhost/projects/test/ajax_loader/document_write/index.html"
activeElement: HTMLBodyElement
addEventListener: function addEventListener() {
adoptNode: function adoptNode() {
alinkColor: ""
all: HTMLCollection
anchors: HTMLCollection
appendChild: function appendChild() … 短/通用版本:
我正在开发一个应用程序(不幸的是,出于其他原因),将document.domain每个页面的顶部设置为"true"域的子字符串:对于子域名,例如sub.app.local,document.domain = "app.local".我也在动态创建一个iframe并将其添加到页面中.iframe加载与父页面位于同一服务器上的文件.稍后,一些Javascript需要访问contentDocumentiframe 的属性.
这在现代浏览器中很好,但由于此错误导致IE9中出现问题.(请参阅最佳答案以获得对此原因的详细解释.)AFAIK,每个比IE9更新的浏览器都会自动继承document.domain以编程方式创建的iframe,因此这是IE9特有的.由于我的场景的一些独特要求(tldr:iframe src需要更改),上面帖子中的答案对我不起作用.
更长/特定于应用程序的版本:
我在IIS上运行的应用程序中使用FineUploader,将文件上传到S3.在现代浏览器中,一切都运行良好,但IE9支持给我带来麻烦,即使在遵循文档(支持IE9及更早版本)配置iframeSupport.localBlankPagePath选项之后也是如此.我有点难过!
Location密钥的HTTP 303响应,以及指向我的空白文档的值.如果我将整个网址粘贴到地址栏中,页面会正常加载,并且按预期显示为空白.X-Frame-Options SAMEORIGIN到服务器的响应标头,如此处所示,但它没有帮助.我在控制台中遇到的错误是:
[Fine Uploader 5.0.3] Error when attempting to access iframe during handling of upload response (Access is denied.
)
[Fine Uploader 5.0.3] Amazon likely rejected the upload request
Run Code Online (Sandbox Code Playgroud)
UPDATE
我已经确定它不是开箱即用的原因是因为应用程序设置document.domain了页面加载,并且它与(子集)不同location.host.FineUploader的303重定向机制到空白页面工作正常,但document.domainiframe的不同之处(由于IE9没有继承属性),因此拒绝访问.
实际的S3上传工作正常 …
javascript internet-explorer internet-explorer-9 fine-uploader