Запуск букмарклета в iFrame, который поступает из другого домена
Можно ли запустить букмарклет в iFrame из другого домена?
Например, у меня есть страница, загруженная из http://example.com, у которой есть iFrame, источник которого установлен в http://example2.com. Когда я запускаю букмарклет, он всегда запускается на http://example.com, так как это основная страница. Я хочу запустить его на другом iFrame, хотя.
Когда я пытаюсь взаимодействовать с iFrame (например, изменяя исходный атрибут на javascript:alert('test')
), Chrome показывает следующую ошибку:
Небезопасный JavaScript пытается получить доступ к кадру с URL http://example.com из фрейма с URL http://example2.com. Домены, протоколы и порты должны соответствовать.
Я попытался перетащить букмарклет в фрейм, но он говорит:
Не удалось загрузить ресурс
Можно ли мне взаимодействовать с iFrame с помощью букмарклета в Chrome?
Ответы
Ответ 1
Существует способ сделать передачу междоменного сообщения (не произвольное выполнение кода) с помощью window.postMessage
, но все кадры A (если они не относятся к тому же происхождению) передают ему сообщение, надеющееся, что B имеет функцию обратного вызова, которая прослушивает это сообщение.
Итак, если вы управляете экземпляром example.com(что в кадре, который не получает букмарклет), вы можете заставить букмарклет передать сообщение в iframe и обрабатывать его в iframe.
Иначе я не думаю, что у вас есть решение здесь, кроме очень сложных (например, проксирование).
Другие ссылки:
Ответ 2
iFrames имеют много безопасности на них, как и на вызовы ajax.
Любая попытка использовать их в междоменном режиме приведет к ошибке безопасности.
Представьте, что вы могли взаимодействовать с другими iFrames в разных доменах. Вы могли бы сделать iFrame (например, страницу входа в facebook), имеющую ширину и высоту 100%, и добавить функцию для выполнения в событии отправки, которое отправит вам имя пользователя и передаст его перед отправкой.
Таким образом, у вас будет много проблем с тем, что вы пытаетесь сделать. В основном вы не можете общаться со страницей, которой у вас нет. Вы можете использовать firebug, чтобы редактировать его с помощью вкладки html.
Надеюсь, что поможет
Ответ 3
Один из вариантов, если вы не контролируете страницу или iframe, - это загрузить iframe в новое окно. Атрибут src
iframe доступен для чтения родительским JS, который затем может открыть новую вкладку или окно. Затем пользователь может щелкнуть по букмарклету второй раз, чтобы загрузить его на эту новую страницу.