开发者

Document.domain and <iframe>s breaks the "Back" button in Internet Explorer

开发者 https://www.devze.com 2022-12-14 12:58 出处:网络
This is a very urgent problem and I\'d be forever indebted to anyone who can lend some insight. I\'m going to be deploying a widget (called the \"ISM\") to a third-party site. That site uses the docu

This is a very urgent problem and I'd be forever indebted to anyone who can lend some insight.

I'm going to be deploying a widget (called the "ISM") to a third-party site. That site uses the document.domain JavaScript property to relax cross-domain restrictions (e.g., setting document.domain in "a.example.com" and "b.example.com" to both "example.com" so they can access each other's DOMs).

This causes problems with my script in Internet Explorer due to the way that I construct an <iframe> that is used to display my widget's HTML content. In Internet Explorer, using document.domain on a page, and then creating an <iframe> with JavaScript, will cause you to be immediately "locked out" of the <iframe> - i.e., you can create it, but it's not created in the correct document.domain, so you're not able to access its DOM due to security restrictions. This开发者_C百科 isn't a problem in any other browser.

To see what I'm talking about, load this page in IE:

http://troy.onespot.com/static/3263/stage1.html

You should see a JavaScript error: "Access is denied."

To get around this, I'm setting the dynamically created <iframe>'s "src" attribute to load a static HTML file that's hosted in the same domain (different subdomain), and setting its document.domain property to the appropriate value:

http://troy.onespot.com/static/3263/stage2.html

That gets around the security issue, and lets me write the document I originally wanted to write to the <iframe>:

http://troy.onespot.com/static/3263/stage3.html

With that document in place, my widget does some polling to our server to get some HTML content that I want to insert into another <iframe>, which will be visible to visitors of the parent page. I've roughly simulated that here (using static content, not actually contacting our server):

http://troy.onespot.com/static/3263/stage4.html

Here comes the problem. When I get that HTML content and insert it into the second <iframe>, I now face an unusual issue with a broken "Back" button. This happens in Firefox 3.0 and all version of IE (possibly other browsers), though it does not happen in some browsers I've tested (Firefox 3.5, Safari, Chrome). See this page:

http://troy.onespot.com/static/3263/stage5.html

If you click the "Google" link, all seems fine. But, when navigating back to the previous page (that has the latter test script), another JavaScript error is introduced: "Permission denied." This does not terminate the script, and does not appear to have any ill effects, other than the fact that I assume it's connected to the broken "Back" button functionality, which is a very big problem - the one I'm desperately trying to solve. I'm at a loss to debug this error since its call stack starts and stops in the jQuery script.

You can also encounter this error - with more serious symptoms - by going to the last link above (stage5.html - clear your browser cache first). Click the "Stage 5 (Again)" link, then, after that page has loaded, click the "Back" button.

The "Back" button is completely broken! You can't go anywhere except to another URL.

This is the problem that I need to solve as soon as possible. Any insights or help would be extremely appreciated!

I can't deviate from this method too much, so outside-the-box suggestions are definitely welcome, but I may not be able to use them due to the constraints of the widget's specifications. I would prefer to understand why the "Back" button is breaking and how to fix it, along with the "Permission denied" error related to jQuery.


It's really hard to try out fixes for this because of the multiple domains. One thing I've heard is that IE treats a blank src or "about:blank" as a different domain, but it treats 'javascript:""' as the same domain. Have you experimented with changing stage one to set the iframe src to things like:

iframe.src = 'javascript:""'

Or:

iframe.src = 'javascript:parent.getFrameHTML()'


Part of the problem seems to be that IE (at least IE 7) adds two entries to the history named "Domain" when I click on the "Stage 5 Again" link. When you use the little drop-down arrow next to the Back button you'll see the history of pages allowing you to step back more than one step. I see the previous two entries are listed as "Domain" and clicking either of those brings me to the same page. The fourth spot (after Current Page, Domain, Domain) is the correct "ISM Back Button" link to the original stage5.html page.

So the problem isn't exactly that the back button doesn't work, but just that the entries in the history are added and so the back button takes you to the wrong place. I don't have an answer as to why those "Domain" entries are being added to the history, but hopefully this helps point you in a useful direction.

Good luck!

0

精彩评论

暂无评论...
验证码 换一张
取 消