разбирать xml в фрейме - PullRequest
       52

разбирать xml в фрейме

2 голосов
/ 02 октября 2009

Я хочу получить доступ к RSS-каналу от js. У меня есть возможность настроить оба сервера на использование одного и того же домена (но разных поддоменов - например, 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

Странная вещь в том, что я могу просматривать this.contentDocument в firebug, однако это getElementsByTagName, который выдает ошибку с сообщением «access denied ...».

Любые мысли о том, как заставить любое из этих решений работать, были бы великолепны. Я знаю, что могу сделать прокси - это не то, что мне интересно.

Ответы [ 5 ]

2 голосов
/ 09 октября 2009

по-видимому, нет способа сделать именно это. Однако я смог найти достойное решение. RSS XML поступает от блоггера (tech.benanderson.us). Поэтому я добавил туда функцию javascript, которая может сделать XRR в 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 голосов
/ 06 октября 2009

Это совсем не говорит о технических особенностях JS, но в качестве обходного пути вы можете настроить серверный скрипт на том же поддомене, который просто выбирает то, что вам нужно, с другого поддоменов.

0 голосов
/ 09 октября 2009

Ниже приведен реально работающий код, 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";
0 голосов
/ 06 октября 2009

Проблема заключается в том, что для document.domain необходимо задать значение benanderson.us как на странице загрузки iframe, так и на странице в iframe. Это немного глупо в этом случае, так как вы не можете просто поместить 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 = http://tech.benanderson.us/feeds/posts/default" Так, в этом случае, вам нужно сослаться на него через window.frames ["my_frame"]. window.frames ["content_frame"], и вы должны получить его.

ПРИМЕЧАНИЕ. Я не проверял этот код.

0 голосов
/ 04 октября 2009

Вы не можете сделать это, это не разрешено той же политикой происхождения

Вы можете установить только document.domain как супердомен текущего домена, вы делаете это, но та же самая политика происхождения должна соответствовать целому доменному имени, которое ей разрешено (tech.benanderson.us! = Benanderson.us)

...