在iframe中解析xml

时间:2009-10-02 11:58:04

标签: javascript ajax iframe rss prototypejs

我希望能够从js访问rss feed。我能够将两个服务器配置为使用相同的域(但不同的子域 - 例如static.benanderson.us和tech.benanderson.us)。我希望我可以使用document.domain属性来解决xss问题。这是一个片段http://static.benanderson.us/example.js(实际上不是直播):

document.domain = 'benanderson.us';
new Ajax.Request('http://tech.benanderson.us/feeds/posts/default', { \\error

然而,这不起作用。我无法确定document.domain是否适用于xhr请求,因此我将其打包并切换到iframe解决方案,因为我过去做过类似的事情。

$('my_iframe').src='http://tech.benanderson.us/feeds/posts/default';
Event.observe($('my_iframe'), 'load', function() {
  try {
    log(this.contentDocument);  //this displays just fine
    var entries = this.contentDocument.getElementsByTagName('entry');  //error

奇怪的是我可以在firebug中查看this.contentDocument,但是getElementsByTagName错误地显示“权限被拒绝...”消息。

任何关于如何使这些解决方案起作用的想法都会很棒。我知道我可以做代理 - 这不是我感兴趣的。

5 个答案:

答案 0 :(得分:2)

这根本不涉及JS技术细节,但作为一种解决方法,您可以在同一个子域上设置服务器端脚本,只需从其他子域获取所需内容。

答案 1 :(得分:2)

显然没有办法做到这一点。无论如何,我能够提出一个像样的解决方案。 rss xml来自blogger(tech.benanderson.us)。所以我在那里添加了一个javascript函数,可以使xhr成为rss。然后这个javascript将它的document.domain设置为benanderson.us并进行回调。总结一下:

http://static.benanderson.us/example.js

Event.observe(window, 'load', function() {
  document.domain = 'benanderson.us';
  $('my_iframe').src='http://tech.benanderson.us/2001/01/js.html';
});
function renderFeed(feedXml) {
  ...

http://tech.benanderson.us/2001/01/js.html

var url = 'http://tech.benanderson.us/feeds/posts/default';
new Ajax.Request(url, {
  method: 'get',
  onSuccess: function(response) {
    document.domain = 'benanderson.us';
    top.renderFeed(response.responseXML);
  }
});

答案 2 :(得分:0)

您无法做到这一点,相同的原始政策不允许这样做

您只能将document.domain设置为当前域的超级域,您可以这样做,但相同的源策略必须匹配允许的整个域名(tech.benanderson.us!= benanderson.us)< / p>

答案 3 :(得分:-1)

问题是在加载iframe的页面和iframe中的页面上都需要将document.domain设置为benanderson.us。在这种情况下,这有点愚蠢,因为你不能只是将javascript放入rss feed中,所以你可能不得不在同一个子域上创建某种网关页面来为你加载该页面。这是一个懒惰的例子:

<html>
<frameset onload="document.domain='benanderson.us';window.frames['content_frame'].location=location.href.split('?request=')[1]">
<frame name=content_frame onload="window.frames['content_frame'].document.domain='benanderson.us'">
</frameset>
</html>

所以,假设我们称之为“gateway.html”,你把它放在tech.benanderson.us子域内,你会去“gateway.html?request = http://tech.benanderson.us/feeds/posts/default”所以,在这种情况下,你必须通过window.frames [“my_frame”]。window.frames [“content_frame”]引用它,你应该得到它。

注意:我没有测试过这段代码。

答案 4 :(得分:-1)

以下是一个实际工作的代码,parseXML是我围绕DOMXML的包装器,因此,您可以使用window.frames [“internal”]。document作为XML对象。这适用于Firefox和Opera。 “this”不起作用,因为“this”是iFrame“Element”而不是框架。抱歉语言,但你会明白的。

    document.getElementById("internal").onload=function() {
        //wrap xml for easy usage
        var ret=parseXML(window.frames["internal"].document);

        //show what happened
        showResult(ret, [
                new DataPair("başlık", "Eklenti Ekle"),
                new DataPair("nesne" , "Eklenti")
        ]);

        //no error
        if(ret.findNodeValue("error")=="no") {
            //close
            eklentiEkleKapat();
            //Protection from refresh
            document.getElementById("internal").onload=function() {}
            window.frames["internal"].location.href="about:blank";
            //activate attachments tab
            tab_eklentiler.activate(true);
        }
    }


    //I actually use a form to post here
    document.getElementById("internal").location.href="target.php";