Javascript 在iframe中解析xml

Javascript 在iframe中解析xml,javascript,ajax,iframe,rss,prototypejs,Javascript,Ajax,Iframe,Rss,Prototypejs,我希望能够从js访问rss提要。我可以将两台服务器配置为使用同一个域(但不同的子域,例如static.benanderson.us和tech.benanderson.us)。我希望我可以使用document.domain属性来解决xss问题。下面是一个片段(不是实时的): 然而,这是行不通的。我无法确定document.domain是否适用于xhr请求,因此我将其打包并切换到iframe解决方案,因为我在过去做过类似的事情 $('my_iframe').src='http://tech.bena

我希望能够从js访问rss提要。我可以将两台服务器配置为使用同一个域(但不同的子域,例如static.benanderson.us和tech.benanderson.us)。我希望我可以使用document.domain属性来解决xss问题。下面是一个片段(不是实时的):

然而,这是行不通的。我无法确定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中查看这个.contentDocument,但是getElementsByTagName错误地显示了一条“权限被拒绝…”消息


任何关于如何让这两种解决方案都发挥作用的想法都将非常棒。我知道我可以做代理——这不是我感兴趣的。

你不能这样做,这是同一原产地政策不允许的


您只能将document.domain设置为当前域的superdomain,但同一来源策略必须匹配允许的整个域名(tech.benanderson.us!=benanderson.us)

这与JS技术无关,但作为一种解决方法,您可以在同一子域上设置服务器端脚本,仅从另一子域获取所需内容。

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

<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=”因此,在这种情况下,您必须通过window.frames[“my_frame”].window.frames[“content_frame”]引用它,您应该会得到它


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

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

    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";

显然没有办法做到这一点。然而,我能想出一个像样的解决办法。rss xml来自blogger(tech.benanderson.us)。因此,我在那里添加了一个javascript函数,可以将xhr添加到rss中。然后这个javascript将document.domain设置为benanderson.us并进行回调。总而言之:

:

:


您好,您是否尝试使用相同的域和子域?在xhr尝试中没有,因为我无法在生产中这样做。是的,我试过了。这就是为什么我认为我已经找到了问题的根源。我想也许我只是编码不正确。我没有理由不能在另一个框架中访问xml,对吗?不能具体做什么?在iframe示例中,如果iframe包含html,则它可以工作。即使子域不同(使用document.domain),文档也可以(通过js)访问其内部iframe中的html。在哪个浏览器中?它不应该在任何浏览器中工作(在ff和opera中也不工作)。人们总是这样做(我只是尝试了一下,效果很好)。我想我可能已经发现了这个问题。您必须在包含页面和内部iframe中显式设置document.domain。由于这是在javascript中完成的,我担心如果返回xml可能会不走运。当然,如果您同时设置了这两个选项,它就可以工作了,我刚才说的是您的用例+1@andersonbd1有什么原因不能在static.benanderson.us上使用服务器端代理来检索提要吗?是的,我只能使用静态html、js和css。我不能使用脚本。我在问题中清楚地说明了这一点。我现在看到了关于代理的部分,但获取脚本并不完全相同。无论如何,我的错…这构成了一个代理解决方案?CWS-我误读了你的解决方案。完全是我的错。让我知道我怎样才能弥补。我已经有一段时间没有登录了,所以现在纠正可能太晚了。也许我可以窥探一下你的答案,然后投票表决。再次道歉。哈哈,别担心。很好不管怎么说,这只是点。我只想澄清一下。谢谢。我现在有点生气。这与我的解决方案有什么不同?
    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";
Event.observe(window, 'load', function() {
  document.domain = 'benanderson.us';
  $('my_iframe').src='http://tech.benanderson.us/2001/01/js.html';
});
function renderFeed(feedXml) {
  ...
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);
  }
});