Js переключение между вкладками браузера

Обновлено: 07.07.2024

Репутация: нет
Всего: нет

Здравствуйте. Помогите пожалуйста со скриптом который по замыслу должен делать следующее.
1. Перемещаться по вкладкам firefox.
2. Вызывать событие submit для форму на каждой вкладке. Форма везде одна и та же.

2-ой пункт я реализовал в кач-ве скрипта для greasemonkey:

В результате при нажатии Alt + G выполняется submit(). Теперь хочу сделать тоже самое, но чтобы выполнялось sumbit() для всех открытых вкладок. Проблема в том, что не могу сообразить, как мне с помощью скрипта переключаться между вкладками.

Заранее спасибо за помощь.

Репутация: 7
Всего: 22

А с чего ты взял, что это можно сделать? - Каждая вкладка - фактически отдельное окно со своим контентом, песочницей и ДОМом и у каждой вкладки "свой javascript". У тебя не получится это делать изнутри.

Репутация: нет
Всего: нет

Если не получится изнутри, то может быть снаружи? Как-то же в firefox происходит управление вкладками, да и переключаться между ними можно с помощью Ctr+Tab. Вот здесь вопрос - можно ли реализовать это событие переключения между вкладками с помощью пользовательского скрипта, если нет - то как такое еще можно сделать. Теперь если мою задачу сформулировать по-другому - то получится такая:

Как реализовать в firefox такой цикл:

Пока не перебраны все вкладки
делать на каждой вкладке submit();
Конец цикла.

Репутация: 7
Всего: 22

Блин, не понял "в лоб", объясню по-другому: представь, что у тебя на компе есть 2 (как минимум) операционных системы - допустим, Win7 и WinXP, выбор между которыми ты производишь при загрузке компа. Можешь ли ты из Win7 сделать, скажем, отправку почты или серфинг, в WinXP? А почему?

Ctrl-Tab можешь перехватывать как хочешь, но у самого браузера по этому поводу есть свои соображения, с которыми спорить сложно.

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

Репутация: нет
Всего: нет

Спасибо за подробное объяснение. Но я как полный ламер все равно мало что понял). А решение нашел. Даже два.
1. Т.к. window - это объект браузера, то можно написать расширение для firefox, которое решит проблему.
2. Более простой вариант. Все вкладки у меня открываются также с помощью скрипта, поэтому я в этом скрипте могу завести массив ссылок на них:

а потом уже работать с ним.

Если есть предложения по первому варианту - написание расширения. Буду рад услышать, как это примерно можно осуществить, т.к. с этим дела еще не имел.

Цитата

Если все упирается в решение такой задачи, то она делается ну точно не через клиентскую реализацию

К сожалению, возможности серверной реализации нет, т.к. нет к нему доступа

Политика «Одинакового источника» (Same Origin) ограничивает доступ окон и фреймов друг к другу.

Политика "Одинакового источника"

Два URL имеют «одинаковый источник» в том случае, если они имеют совпадающие протокол, домен и порт.

Эти URL имеют одинаковый источник:

А эти – разные источники:

Политика «Одинакового источника» говорит, что:

  • если у нас есть ссылка на другой объект window , например, на всплывающее окно, созданное с помощью window.open или на window из <iframe> и у этого окна тот же источник, то к нему будет полный доступ.
  • в противном случае, если у него другой источник, мы не сможем обращаться к его переменным, объекту document и так далее. Единственное исключение – объект location : его можно изменять (таким образом перенаправляя пользователя). Но нельзя читать location (нельзя узнать, где находится пользователь, чтобы не было никаких утечек информации).

Доступ к содержимому ифрейма

Внутри <iframe> находится по сути отдельное окно с собственными объектами document и window .

Мы можем обращаться к ним, используя свойства:

  • iframe.contentWindow ссылка на объект window внутри <iframe> .
  • iframe.contentDocument – ссылка на объект document внутри <iframe> , короткая запись для iframe.contentWindow.document .

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

Для примера давайте попробуем чтение и запись в ифрейм с другим источником:

Код выше выведет ошибку для любых операций, кроме:

  • Получения ссылки на внутренний объект window из iframe.contentWindow
  • Изменения location .

С другой стороны, если у ифрейма тот же источник, то с ним можно делать всё, что угодно:

Событие iframe.onload – по сути то же, что и iframe.contentWindow.onload . Оно сработает, когда встроенное окно полностью загрузится со всеми ресурсами.

…Но iframe.onload всегда доступно извне ифрейма, в то время как доступ к iframe.contentWindow.onload разрешён только из окна с тем же источником.

Окна на поддоменах: document.domain

По определению, если у двух URL разный домен, то у них разный источник.

Для этого в каждом таком окне нужно запустить:

После этого они смогут взаимодействовать без ограничений. Ещё раз заметим, что это доступно только для страниц с одинаковым доменом второго уровня.

Ифрейм: подождите документ

Когда ифрейм – с того же источника, мы имеем доступ к документу в нём. Но есть подвох. Не связанный с кросс-доменными особенностями, но достаточно важный, чтобы о нём знать.

Когда ифрейм создан, в нём сразу есть документ. Но этот документ – другой, не тот, который в него будет загружен!

Так что если мы тут же сделаем что-то с этим документом, то наши изменения, скорее всего, пропадут.

Нам не следует работать с документом ещё не загруженного ифрейма, так как это не тот документ. Если мы поставим на него обработчики событий – они будут проигнорированы.

Как поймать момент, когда появится правильный документ?

Можно проверять через setInterval :

Коллекция window.frames

Другой способ получить объект window из <iframe> – забрать его из именованной коллекции window.frames :

  • По номеру: window.frames[0] – объект window для первого фрейма в документе.
  • По имени: window.frames.iframeName – объект window для фрейма со свойством name="iframeName" .

Ифрейм может иметь другие ифреймы внутри. Таким образом, объекты window создают иерархию.

Навигация по ним выглядит так:

  • window.frames – коллекция «дочерних» window (для вложенных фреймов).
  • window.parent – ссылка на «родительский» (внешний) window .
  • window.top – ссылка на самого верхнего родителя.

Можно использовать свойство top , чтобы проверять, открыт ли текущий документ внутри ифрейма или нет:

Атрибут ифрейма sandbox

Атрибут sandbox позволяет наложить ограничения на действия внутри <iframe> , чтобы предотвратить выполнение ненадёжного кода. Атрибут помещает ифрейм в «песочницу», отмечая его как имеющий другой источник и/или накладывая на него дополнительные ограничения.

Существует список «по умолчанию» ограничений, которые накладываются на <iframe sandbox src=". "> . Их можно уменьшить, если указать в атрибуте список исключений (специальными ключевыми словами), которые не нужно применять, например: <iframe sandbox="allow-forms allow-popups"> .

Другими словами, если у атрибута "sandbox" нет значения, то браузер применяет максимум ограничений, но через пробел можно указать те из них, которые мы не хотим применять.

Вот список ограничений:

allow-same-origin "sandbox" принудительно устанавливает «другой источник» для ифрейма. Другими словами, он заставляет браузер воспринимать iframe , как пришедший из другого источника, даже если src содержит тот же сайт. Со всеми сопутствующими ограничениями для скриптов. Эта опция отключает это ограничение. allow-top-navigation Позволяет ифрейму менять parent.location . allow-forms Позволяет отправлять формы из ифрейма. allow-scripts Позволяет запускать скрипты из ифрейма. allow-popups Позволяет открывать всплывающие окна из ифрейма с помощью window.open .

Больше опций можно найти в справочнике.

Пример ниже демонстрирует ифрейм, помещённый в песочницу со стандартным набором ограничений: <iframe sandbox src=". "> . На странице содержится JavaScript и форма.

Обратите внимание, что ничего не работает. Таким образом, набор ограничений по умолчанию очень строгий:

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

И это работает отлично. Я попытался открыть их новыми вкладками:

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

И это откроет новый URL-адрес на той же вкладке, даже если вы находитесь на другой вкладке. Но он не переключится на эту вкладку. Я думаю, что это работает, потому что, когда я говорю "_newtab_home", он в основном называет эту вкладку, и все с этой целью откроется на этой вкладке. Что классно, и я это понимаю, но как я могу открыть эту вкладку всякий раз, когда она загружает новый URL-адрес? Я хочу открыть новую вкладку для местоположений, которые не были посещены, но после их посещения и попыток вернуться на главную страницу (" http://exampleurl.com/example "), я хочу, чтобы она вернитесь на вкладку, в которой она уже была открыта. Я знаю, что есть способ переключить вкладки в JavaScript с помощью номеров табуляции, например:

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

Я думаю, что есть шесть разных мест, которые вы можете посетить на моем сайте с помощью клавиш. Я хочу, чтобы каждое местоположение имело свою собственную вкладку для открытия, и я хочу вернуться к этой вкладке всякий раз, когда вы нажимаете клавишу, которая снова открывает ее. Можно ли это сделать в JavScript? Если да, пожалуйста, помогите мне! Заранее спасибо. (Мне очень жаль, если этот вопрос неясен, не стесняйтесь комментировать и задавать вопросы об этом.)

Читайте также: