Доступ к содержимому iframe в Adobe Air

У меня было много проблем с выяснением того, как я могу получить доступ к контенту в iframe в Air. Вот пример кода jquery, который я тестировал.


$(document).ready(function(){
    $("#frame").ready(function(){
        air.trace($("#frame").contents().find("body").html());
        air.trace(window.frames["frame"].innerHTML);
        air.trace(document.getElementById("frame").innerHTML);
    });
});

Я использую iframe.

<iframe src="http://google.com" id="frame" width="100%" sandboxRoot="http://google.com/" documentRoot="/" name="frame" height="600"></iframe>

Вывод из приведенного выше кода


null
undefined


Как видите, содержимое всегда равно null, undefined или пустой строке. Я пропустил что-то, что мешает мне получить доступ к содержимому iframe? Любые предложения будут ценны.


person tomfmason    schedule 24.04.2009    source источник
comment
Похоже, что iframe был удален, когда я его опубликовал. Это мой первый пост здесь, поэтому я не совсем уверен, как я могу опубликовать это.   -  person tomfmason    schedule 24.04.2009


Ответы (3)


Решение было здесь http://help.adobe.com/en_US/AIR/1.1/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7f08.html

Вот пример того, как я заработал.

<iframe src="http://google.com/local/iframe.html" id="frame" width="100%" sandboxRoot="http://google.com/local/" documentRoot="app:/" name="frame" height="600"></iframe>

Все, что запрошено из корня песочницы (например, http://google.com/local), будет использоваться из корня документа. и будет рассматриваться так, как если бы он был из того же домена (google.com).

В iframe.html я могу получить доступ к iframe для Google так же, как если бы он был из того же домена.

Я знал, что должен быть способ сделать это :)

person tomfmason    schedule 25.04.2009
comment
У меня такая же проблема, и я не могу понять ваше решение. Не могли бы вы объяснить немного больше? Особенно почему src=google.com/local/iframe.html, когда изначально это был google.com?? - person anand.trex; 09.08.2009

Как и многие другие, я также изо всех сил пытался понять это.

Решение приведено выше tomfmason, но даже тогда мне понадобилась целая вечность, чтобы на самом деле понять, что происходит.

Чтобы помочь всем, кто все еще пытается использовать AIR html+js для создания веб-браузера или получения данных с удаленной веб-страницы, я создал очень простой проект AIR 3.2 (файл .zip размером 1,7 МБ), который можно найти в:

http://adobe-air-js.blogspot.com/2011/12/air-reading-dom-of-remote-web-page.html

AIR на самом деле довольно удобен, если преодолеть начальные сложности. Я считаю его на порядок более надежным/пригодным для использования, чем Титаниум.

Удачи! ~ Крис

person Chris Banford    schedule 28.12.2011

Adobe AIR — это просто браузер (WebKit на самом деле) и, таким образом, следует правилам, которым следуют браузеры. Правило, которое регулирует вашу проблему здесь, называется «политикой того же происхождения».

Если он не находится в том же домене, браузер не позволит вам получить доступ к данным или контенту с этого сайта, поэтому вы получите этот результат. Используйте AJAX API на основе Json, если вы хотите получить данные из другого домена.

Пример кого-то еще с этой проблемой:

person cgp    schedule 24.04.2009
comment
Это немного округляет: добавлено. - person cgp; 24.04.2009
comment
Я знаком с той же политикой происхождения, но не думал, что она будет применяться в воздухе. Я не вижу большого практического применения для локального iframe. Это на самом деле обескураживает, поскольку не позволяет мне добавлять функции, которые зависели от возможности доступа к dom iframe. - person tomfmason; 24.04.2009
comment
На самом деле воздух совсем другой. У него есть возможность настроить мост песочницы между родительским окном и дочерним iframe, но вам нужен доступ к фактическому коду кода, чтобы выставить что-либо из дочернего. Это лаваш, так как все, что я хочу сделать, это прочитать дом. Меня совершенно не волнуют вызовы методов внутри фрейма. Я предполагаю, что моя единственная альтернатива - использовать прокси-сервер на стороне сервера и настроить мост, прежде чем возвращать контент клиенту. - person tomfmason; 24.04.2009
comment
@altCognito: AIR — это определенно не просто переупакованный браузер. Он включает в себя браузерный движок — webkit, но не во всей красе. - person dirkgently; 24.04.2009
comment
Мне было бы в хорошем смысле любопытно, каковы аргументы в пользу того, что это не просто перепакованный браузер. Нет ничего плохого в том, чтобы быть переупакованным браузером. - person cgp; 24.04.2009