首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >window.location在儿童iframe中的使用

window.location在儿童iframe中的使用
EN

Stack Overflow用户
提问于 2010-02-17 12:44:59
回答 3查看 9.2K关注 0票数 3

我在一个与iframe相关的问题上遇到麻烦。

我有一份文件(父母),里面有一个iframe (子)。如果父文档调用子文档中的函数,该函数使用window.location将childs url更改为相对url,则该url将变为相对于父文档。让我来说明一下。

父文档: /test/parent.html

儿童文件:/projects/ Child .Child

儿童法典:

代码语言:javascript
复制
function moveOn(){
    window.location.href = "newPage.html";
}

父代码:

代码语言:javascript
复制
childDocument.contentWindow.moveOn();

结果:子文档尝试访问/test/newPage.html而不是/projects/newPage.html

有办法从家长那里解决这个问题吗?我所处的情况是,我不能对子文档代码进行更改,只能在父文档代码中进行更改。

谢谢你,尼克

编辑:

这是实际代码

在parent (/testr/testr.html)中:

代码语言:javascript
复制
testr.appHolder = $("childIframe"); 
testr.appHolder.src = "../projects/test.html"; 
testr.functionName = "moveOn"; 
testr.appHolder.contentWindow[testr.functionName]();

在子项目(/projects/test.html)中:

代码语言:javascript
复制
function moveOn(){ 
  window.location.href = "newPage.html"; 
}

这是实际代码

在parent (/testr/testr.html)中:

代码语言:javascript
复制
testr.appHolder = $("childIframe"); 
testr.appHolder.src = "../projects/test.html"; 
testr.functionName = "moveOn"; 
testr.appHolder.contentWindow[testr.functionName]();

在子项目(/projects/test.html)中:

代码语言:javascript
复制
function moveOn(){ 
  window.location.href = "newPage.html"; 
}
EN

回答 3

Stack Overflow用户

发布于 2012-04-24 04:22:48

终于有了一个完整的解决方案!

代码语言:javascript
复制
childDocument.contentWindow.setTimeout( childDocument.contentWindow.moveOn, 0 );

这要求子文档在零毫秒内执行给定的函数(moveOn),并且它在子文档的上下文中执行,甚至在Internet爆炸物中也是如此。

哇哦。

票数 4
EN

Stack Overflow用户

发布于 2012-04-24 01:17:16

HTML规范说:

设置位置属性时,浏览器必须解析相对于条目脚本的基本URL的参数,如果成功,则必须将浏览上下文导航到指定的url。

获取您所追求的行为的一种(hacky)方法是直接编辑locationlocation属性:有效地自己实现相对url的解析。

在您的例子中,您将使用您孩子的现有url编辑url“手动”。

点解

一种“聪明”的方法是添加一个斜杠,将文件名转换为“目录”,然后用"dotdot“擦除它,然后是您想要的相对url。

代码语言:javascript
复制
childDocument.contentWindow.location.pathname += "/../newPage.html";

(此代码也可以在子代码中工作,但您刚才提到您不能更改子代码。)

看看这是怎么回事。

路径开始于

/projects/child.html

然后你就把它附加进去

/projects/child.html/../newPage.html

浏览器将此解析为

/projects/newPage.html

不幸的是,我认为这对你来说不是一个完美的解决方案。听起来每个“子”页面都包含指向链中下一页的硬编码链接,该链接可以是任何页面。获取任何给定子页面的“下一步”相对url将需要孩子的合作。

如果以可预测的方式命名子页,并且知道总页数,并且知道子目录的基url,则可以让父页正确地控制子目录。这是很多的假设。

Sidenote:我正在研究一个更优雅、更健壮的解决方案。祈祷吧。

票数 -1
EN

Stack Overflow用户

发布于 2012-04-24 01:44:36

啊哈。我找到了baseURI的属性。现在我们在谈。

根本的问题是,正在执行代码的文档(父)的baseURI被设置为父的位置。在更改子页面的位置之前,要将页面的baseURI设置为与子页面的位置相同,以便在子页面的上下文中解析相对url。

简言之,很高兴说:

代码语言:javascript
复制
var originalURI = document.baseURI; // store for setting back after the move
document.baseURI = childDocument.location; // setting parent's baseURI (NO EFFECT!)
childDocument.contentWindow.moveOn();
document.baseURI = originalURI; // restore original baseURI

不幸的是,baseURI属性是只读。幸运的是,它的值来自<base>标记,您可以用脚本修改它。通过将父标记设置为引用childUrl,可以获得给定子对象所需的功能:

代码语言:javascript
复制
<head>
<base href="/path/to/child.html" />
</head>

不幸的是,这使得您的父级中的任何相对链接相对于子级,这不是您想要的。我们需要在单击链接之后设置它,并在将子节点告知moveOn()之后将其设置回原来的位置。

如果在父<base />中包含一个空<head>标记,默认情况下它不会影响baseURI。因此,当您想在子程序中执行moveOn()函数时,您可以这样说:

代码语言:javascript
复制
var baseElement = document.getElementsByTagName("base")[0];

// adopt the child's location as baseURI
baseElement.href = childDocument.location; 

childDocument.contentWindow.moveOn();

// revert back to the parent's original baseURI
baseElement.removeAttribute("href"); 

(希望这能帮上忙-两年过去了.(公顷)

编辑:

再一次,互联网爆炸者成了派对上的便便者。似乎在加载后对任何标记的更改都是不履行的。因此,除非您不必支持IE (HA!),否则此解决方案将无法工作,除非您很乐意将孩子的位置硬编码到父标记中。再说一次,这些都是很大的假设。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2280640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档