Js переключение между вкладками браузера
Репутация: нет
Всего: нет
Здравствуйте. Помогите пожалуйста со скриптом который по замыслу должен делать следующее.
1. Перемещаться по вкладкам firefox.
2. Вызывать событие submit для форму на каждой вкладке. Форма везде одна и та же.
2-ой пункт я реализовал в кач-ве скрипта для greasemonkey:
В результате при нажатии Alt + G выполняется submit(). Теперь хочу сделать тоже самое, но чтобы выполнялось sumbit() для всех открытых вкладок. Проблема в том, что не могу сообразить, как мне с помощью скрипта переключаться между вкладками.
Заранее спасибо за помощь.
Репутация: 7
Всего: 22
Репутация: нет
Всего: нет
Если не получится изнутри, то может быть снаружи? Как-то же в 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? Если да, пожалуйста, помогите мне! Заранее спасибо. (Мне очень жаль, если этот вопрос неясен, не стесняйтесь комментировать и задавать вопросы об этом.)
Читайте также: