Comments 136
Ого. Не знал. Неожиданное поведение. Наверное, хотели сделать как лучше…
mathiasbynens.github.io/rel-noopener
Для всех остальных, кто считает что оригинал статьи https://medium.com/@jitbit/target-blank-the-most-under... — сравните для начала дату публикации. Моя статья вышла 3го мая. Англоязычная — 4го.
Но указывать источник было бы неплохо. Особенно, если вы привнесли какую-то лепту и дописали пару слов от себя. Чего стесняться?
Что в таком случае эти пользователи делают на вашем сайте? Найти и нажать на кнопку Оплатить для них точно также будет нерешаемой задачей. Не говоря уже о том, что платежные реквизиты как-то нужно вводить, а это точно будет происходить не на вашем сайте.
Стоит ли говорить, что если б линк открывался в этой же вкладке, мне б пришлось как минимум воспользоваться кнопкой «бэк» и еще пролистать страницу, чтобы найти нужный коммент?
Тут же якори. Нажал просто переместило на позицию комментария, без обновления страницы. Нажал назад опять же переместило обратно без обновления. Пролистывать не нужно.
но вы говорите от лица неопытного пользователя, и я как скромный сайтостроитель категорически с вами не согласен, вы бы это тоже поняли если бы понаблюдали за реальным поведением разных пользователей на сайте. ну через вебвизор к примеру.
И говорю от лица опытного пользователя. Которорый перекращает пользоваться сайтами, которые ведут себя непредсказуемо.
Культурные особенности, кстати: в US, к примеру, Гугл так себя не ведёт по умолчанию, а в России… пришлось, да.
Контрольный вопрос: чем вы пользуетесь вместо Гугла и Яндекса?DuckDuckGo. Технически, возмозможно, это результататы Google или Яндекс, но с точки зрения конечной веб-страницы, очень адекватный сайт.
средним колесиком мышиА есть другие?!
Извините, наболело как со стороны пользователя, так и боль со стороны разработчика.
Гугл в этом плане раздражает что навязывает открытие новой вкладки.
Я вот считаю, что никакой автоматический алгоритм эту задачу решить не может (если бы мог, я бы уже давно написал расширение для своего браузера). На примере того же Facebook: иногда я нахожу сам пост бесполезным, и все, что мне нужно — поскорее перейти на сайт. А иногда я хочу присоединиться к дисскусии в комментариях, и после просмотра сайта я хочу вернуться в то же место, с которого начал. Итого, мое решение об открытии ссылки в той же вкладке, или в новой, принимается мной на основе анализа содержимого исходной страницы. И простыми регулярками тут уже не обойдешься.
Во-первых, я ещё не дочитал обсуждение и почти наверняка захочу к нему вернуться.
Во-вторых, я мог начать набирать ответ и его нельзя потерять.
Во-первых, я ещё не дочитал обсуждение и почти наверняка захочу к нему вернуться.Зависит от того, как я попал на этот сайт. Если я искал решение проблемы через Google, то этот форум — только дополнительный посредник. В большинстве случаев я понимаю сразу, что именно по этой ссылке находится решение. И форум этот я хочу скорей закрыть.
Во-вторых, я мог начать набирать ответ и его нельзя потерять.Тот редкий случай, когда бы я простил сайту confirm на unload.
Лучше избежать проблемы вообще, чем подпирать её костылями.
А раз так, то лучше уж сделать изящное решение: настройки сохранять автоматически, какие-нибудь контентные данные, чаты, статьи — сохранять данные в форме и восстанавливать при релоаде.
Пароли не сохранять, понятно. Сверху к этому прикрутить сохранение данных при потере сети в local storage или вроде того.
В идеальном случае пользователь просто не заметит этого всего. А вот если что-то пойдет не так — будет приятно удивлен.
Полностью проблемы не избежать, в конце концов. Более того, меня бы раздражало сообщение при закрытии страницы, если я вдруг передумал отправлять форму.
P.S.: возможно, в браузеры не помешало бы добавить функцию «открыть принудительно в текущей вкладке» (по аналогии с контрол-кликом), но это не отменяет полезности тэга «target».
«infinite-scroll» лентеТо есть проблема в _blank, а не в таких лентах?
Меня на Ютубе сие бесит. Для долгосрочных дискуссий интерфейс вообще не пригодный. Пагинацией и не пахнет, просмотром отдельных комментариев тоже. Поискал расширения какие, приложения для комментирования — не видать. Думал сам что-то наварганить, глянул запросы — а там AJAX куски HTML возвращает, как в старые добрые. Гляну публичный API ещё, может, хоть там что-то вменяемое.

К счастью, запас ранее накопленной кармы позволяет со спокойствием относиться к такому весеннему обострению.
«Не умножай сущности без необходимости», говорят тебе мудрые олдскульные разработчики, %юзернейм%
(как же раздражает невозможность плюсануть комментарий старее пары дней.
Если ты в основном занят и читаешь сайт эпизодически или случайно обнаружил интересный топик в еженежельном дайджесте, то, увы… упс. Ты превращаешься в пассивного наблюдателя. В результате чего возможность поставить оценку остается только у специального контингента юных бездельников (не в обиду юным бездельникам будет сказано), у которых, должно быть масса времени на ежедневное чтение всякой «цифровой макулатуры», что безусловно сказывается на качестве материалов и в перспективе приведет Хабру к полному унынию. К бабке, что называется, не ходи).
Какая полезная привычка :)
У меня такая же привычка. Ещё со времен, когда нужно было некоторое время ждать загрузки страницы. Открываешь новую страницу через колесо мыши и пока она грузится ты дочитываешь прошлую страницу. С таким раскладом и правда не работает данная уязвимость, подтверждаю :)
При таком раскладе подмены страницы не происходит
Что кстати говоря ещё больше удивляет — а зачем они сделали именно такое поведение для target=_blank
? По логике вещей открытие колесом или иным способом в новой вкладке вручную, не должно принципиально отличаться от target=_blank
. Т.е. или этого несчастного opener
-а не должно быть вовсе, либо он должен быть и при middle-клик-открытии.
При просмотре вашего поста и переходе по ссылке(фишинг, все дела), меня разлогинивает в оригинальном ФБ, и после логина вижу:
«Ваш аккаунт временно заблокирован»....«Скорее всего, ваш аккаунт был взломан в результате ввода вашего пароля на похожем на Facebook веб-сайте. Такой тип атаки называется фишингом. Подробнее в Справочном центре.»
Похоже они как-то автоматически палят потенциальный фишинг, включая window.opener и помечают аккаунты как suspicious
Опа… в Firefox rel="noopener"
пока еще не работает :(
Это хорошо! Пойду добавлю к ссылкам rel="noopener noreferrer"
about:config:
set browser.link.open_newwindow 1
Отлично работает, но если кликать где-то вне браузера, то активная ссылка в браузере заменится той, на которую кликнули, вместо открытия новой вкладки. Так что решение не подходит.
А нужно было это затем, что:
1) да, я опытный пользователь и знаю как и где мне открыть новую вкладку, если это нужно;
2) напрягают сайты, которые в своей же строке поиска уводят меня на другую вкладку, хотя я перемещаюсь в пределах одного и того же сайта. (например поиск azlyrics.com).
<a href=blob://></a>
В чем преимущество такого поведения не понятно, но напрягает. Интуитивно закрываешь рекламную страницу, теряешь историю, введенную информацию и тд.
После этого аттрибут target был удален из Strict спецификаций (HTML4 & XHTML), ну да кто об этом знает? Все просто писали себе doctype-ы.
А вранье про заботу о мобильных клиентах, которые хотят открыть ссылку в новой вкладочке. Я уж не говорю, что загруженные страницы нынче могут сжирать неприлично памяти, но есть еще и ограничение на количество открытых окон браузера. Или вы сейчас скажете, что никогда не встречали уведомления, что «Достигнут максимум открытых окон, ссылка открыта не будет».
Перестаньте использовать эту мерзость. Займитесь лучше повышением культуры пользования браузером у ваших мам. Кстати да, моя мама не понимает что такое новая вкладка, или, например, другой документ в MDI-интерфейсе (Word & Excel, например, хотя эти нынче используют нестандартную реализацию с выносом кнопки в панель задач). А кнопки Вперед-Назад у нее всегда на виду и предельно понятны. И кстати, на телефоне кнопка Назад аж хардварная.
Ну и коротенько о «оставить ценного пользователя на своем сайте». Когда пользователь начинает подчищать вкладки, уверен на 70%, что он закроет и Ваш сайт, не льстите себе. А иногда и случайно ткнув крестик.
Так что перестаньте нести ерунду! Оставьте за пользователем право открыть ссылку, как ему нравится.
Я хочу, чтобы ссылки открывались в новой вкладке по дефолту, когда я с планшета. Да и не только когда я с планшета, а, пожалуй, всегда. А если я захочу открыть ссылку в той же вкладке я согласен сделать контрол-клик.
>Я уж не говорю, что загруженные страницы нынче могут сжирать неприлично памяти
Плевать, у меня в планшете 4ГБ оперативы.
>Или вы сейчас скажете, что никогда не встречали уведомления, что «Достигнут максимум открытых окон, ссылка открыта не будет».
Никогда не встречал.
>А кнопки Вперед-Назад у нее всегда на виду и предельно понятны
Нажимая кнопку «назад» на Хабре с сношу себе всю статистику по непрочитанным комментам. Восстановить эту информацию невозможно, насколько я понимаю.
Я открываю страницу в той же вкладке в 2 случаях, когда я целенаправленно хочу уйти с сайта и когда я перехожу на новую страницу форума/ленты хабра/etc. В остальных 98% случаев я всегда открываю ссылку в новой вкладке. Так что, юзкейсы у всех разные, не нужно думать, что ваш единственно верный.
Еще раз. Вам никто не запрещает открыть ссылку в новом окне. Но расскажите мне, где вы видели пункт меню в браузере «Открыть в этой же вкладке»
Еще раз. Вам никто не запрещает открыть ссылку в новом окне. Но расскажите мне, где вы видели пункт меню в браузере «Открыть в этой же вкладке»
Еще раз, я хочу, чтобы можно было все ссылки всегда открывать вмновом окне и только по специальному действию типа контрол-клик открывать их в том же. Сейчас браузеры не имеют подобной настройки, открывать ссылки в новом окне на планшете неудобно. Поэтому я рад, что разработчики некоторых сайтов идут навстречу пользователям. Конечно, было бы лучше, чтобы подобное поведение настраивалось, но пока имеем, что имеем.
В конце концов вам никто не мешает скопировать адрес ссылки и вставить ее в адресную строку того же окна. Или кликнуть на ссылку и нажать на крестик.
Хотя апдейтов браузера не было крайние 2 дня.
Версия 50.0.2661.94 m
Вы используете самую новую версию Chrome.
У меня и сейчас показывает свежую стабильную версию как 50.0.2661.94 m

Одно дело — увидеть подобные «перлы» от бухгалтера, другое — от web-разработчика.
А вот rel=«noopener» должен выключать такое поведение. Т.е. у разработчика есть выбор какое поведение ему нужно.
Де факто, же это «гадость полнейшая», когда речь о cross-domain scope.
P.S.: Может можно на серверной стороне поотключать средствами заголовков, типа Server-Side Access Control через HTTP_ORIGIN?
Вижу только один путь: раз это «баг» идёт от JS, то JS-ом он и должен решаться, у кого js не работает, у того и «баг» не работает — всё просто.
А js-ом это как раз полечить можно вдоль и поперёк.
А js-ом это как раз полечить можно вдоль и поперёк.
Какое конкретно решение Вы предлагаете?
<a>
и добавить им noopener
в ref
.2. переопределить
window.open
и стирать window.opener
у всех новооткрываемых окон.Таким грешат многие сайты, а некоторые, даже не считают это за проблему «на своей стороне»Воу воу воу, то что там «с формой бобра» по ссылке — это совсем из другой оперы, да и повеселее будет — это подмена url'a в адресной строке на «чтохочу.com» и она работает в Chrome.
Вот это день «интересных историй»… я думал такие забавы остались где-то в середине 00-ых… печаль.
Еще туда же, к примерам, проблема общая:
<a href="//evil.com" target="_blank" rel="noreferrer">CLICK</a> <!-- window.opener нет -->
<map><area href="//evil.com" target="_blank" rel="noreferrer">CLICK</area></map> <!-- window.opener нет -->
<svg><a xlink:href="//evil.com" rel="noreferrer">CLICK</a></svg> <!-- window.opener есть -->
<form action="//evil.com" target="_blank" rel="noreferrer"><input type="submit"></form> <!-- window.opener есть -->
<form id="test" rel="noreferrer"></form><button form="test" formtarget="_blank" formaction="//evil.com">CLICKME</button> <!-- window.opener есть -->
<math href="//evil.com" xlink:show="new" rel="noreferrer">CLICKME</math> <!-- window.opener есть -->
Uncaught SecurityError: Blocked a frame with origin «null» from accessing a frame with origin «null». Protocols, domains, and ports must match.
На более свежих версиях ещё не проверял, — может быть, эту защиту сломали.
М, да-а-а, *facepalm*.
Выломать это можно так: пропатчить opera.dll, изменив строку «opener» на «opera», 0.
Для Opera 12.18, 32-bit, Windows это будет по адресу 0C6E414.
Опасный target="_blank"