Google Chrome заблокировал перенаправление с помощью window.top.location в iframe - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу перенаправить свой веб-сайт с iframe на основной URL, вот мой код:

window.setTimeout(function() {
    window.top.location = jQuery("link[rel=canonical]").attr("href") + "#ref=shahrekhabar";
    return false;
}, 100);

Он работает в Firefox, но Google Chrome заблокировал этот тип перенаправления.Я пытаюсь использовать window.top.location.href и window.top.location.replace и window.top.location.assign, но не повезло.

Причина:

Некоторые спам-сайты показывают мой сайт в iframe, и я хочу уйти от них, и ядумаю, что перенаправление - хорошее решение.

1 Ответ

0 голосов
/ 25 декабря 2018

Изменить, чтобы ответить на ИСТИННЫЙ вопрос:

Распространенная проблема переполнения стека состоит в том, что пользователи часто спрашивают, как сделать что-то, что, по их мнению, решает проблему, с которой они сталкиваются, а не просто спрашивают нас, как решитьпроблема.Мы всегда рады услышать, как вы пытались решить вашу проблему, но всегда лучше, если мы знаем, что и в чем основная проблема.Итак, в вашем случае, учитывая ваш комментарий к моему ответу, вопрос должен был звучать так:

В настоящее время мой сайт отображается в фреймах на сайтах, которые я не контролирую?Я хотел бы помешать им сделать это, как я могу это сделать?В настоящее время я пытаюсь перенаправить свой сайт с iframe на основной URL, но он не работает в Chrome.... Остальная часть вопроса ...

Учитывая этот вопрос, мой первоначальный ответ бесполезен как:

  • Вы все еще не можете и не должны быть в состоянииизмените URL родительского окна.
  • Вы не являетесь владельцем сайтов, отображающих вашу страницу в iframe, что означает, что вы не можете зарегистрировать прослушиватель для обработки postMessage или CustomEvent.

Достаточно забавно, что вы пытаетесь сделать именно ту причину, по которой Chrome не позволяет вам делать это, хахаха.Но не волнуйтесь, есть еще решение.

Представляем CORS!

CORS или Cross Origin Resource Sharing - это название, когда сайт в одном домене обращается к ресурсам, которых нет втот же домен.Неважно, кому принадлежит какой-либо сайт, если два домена разные, это CORS.Теперь это хорошо для вас, потому что есть такие вещи, как политики CORS, где вы можете запретить кому-либо даже получить доступ к ресурсу в вашем домене, если они сделают запрос CORS.Имейте в виду, это будет означать, что вы не можете отображать свой сайт в iframe на другом из ваших сайтов, если они не находятся в одном домене, но, похоже, это того стоит.

InЕсли вам интересно, в отличие от того, что вы пытаетесь сделать, использование политики CORS является очень стандартной процедурой для разработчиков, которые не хотят, чтобы их сайты появлялись в фреймах, и фактически используется известными сайтами, такими как Facebook, Google.и даже хороший ole stackoverflow (я бы знал, я пытался найти способ просматривать несколько вопросов одновременно через iframes некоторое время назад).Ниже приведен пример, который показывает, что все это правда, наряду с примером сайта, который не заботится (editpad.org).Чтобы реализовать это на своем сайте , перейдите по этой ссылке .

<iframe src="https://www.editpad.org/"> </iframe>
<iframe src="https://www.google.com/"> </iframe>
<iframe src="https://www.facebook.com/"> </iframe>
<iframe src="https://stackoverflow.com/posts/53917955"> </iframe>

Старый ответ:

То есть вы пытаетесь изменить расположение родительского окна из iframe?Это звучит крайне опасно, и тот факт, что Firefox не блокирует , беспокоит меня.Хорошая работа, Chrome!

Почему бы вам этого не хотеть?

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

Возможные проблемы, которые могут возникнуть, если это разрешено на всех платформах:

  • Включите iframe в свои объявления и, как только ваше объявление будет показано, перенаправьте пользователя на ваш сайт.или, что еще хуже, перенаправьте их на зеркало текущего сайта, который вы размещаете, для сбора паролей / личной информации.
  • Если вы можете возиться с расположением окон (возможно, самая важная и статичная вещь при просмотре веб-страницы), почему вы не можете связываться с чем-либо?Можете ли вы зайти в родительское окно и настроить DOM или сделать выбор запроса для входных данных типа password, чтобы скопировать значения?Или как насчет тихого присоединения слушателей событий к родительскому окну, чтобы вы могли регистрировать все нажатия клавиш.

Как обойти это?

Не беспокойтесь слишком сильноо проблемах, о которых я говорил выше, поскольку их можно избежать, следуя соответствующим стандартам.Фактически, разработчики JavaScript предусмотрели именно эту проблему, поэтому вы можете публиковать сообщения в Windows .Посмотрите на эту ссылку и перейдите оттуда, не стесняйтесь комментировать, если у вас есть какие-либо вопросы, но это должно быть так же просто, как опубликовать сообщение, обнаружить его в родительском окне, а затем изменить местоположение по своему желанию.

Если вам нужно отправить данные из iframe в родительское окно или если ваш iframe не размещен в том же домене, вы можете вместо этого использовать CustomEvents (который я предпочитаю, даже если мой iframe находится в том же домене), который позволяет вамприсоедините объект данных.

Что касается того, почему любое из этих двух решений лучше, чем прямое управление родительским окном, то это все из-за того, что родительскому окну необходимо зарегистрировать прослушиватель для сообщения / пользовательского события.Если ваша страница не находится внутри iframe, она просто отправит себе сообщение, которое не будет прослушивать.Если ваша страница находится внутри iframe на той странице, на которой она должна быть включена, ваша родительская страница уже должна была зарегистрировать соответствующих слушателей.И нет никакого шанса для злонамеренного использования этих функций, потому что я снова должен зарегистрировать слушателя и выбрать, что будет сделано с событием, как только оно будет перехвачено.

...