Открыть все ссылки в новых вкладках с помощью jQuery

#jquery #anchor #target #attr

#jquery #привязка #цель #attr

Вопрос:

У меня есть некоторые ссылки, которые динамически размещаются на моей странице с помощью JSON, и у меня нет возможности напрямую редактировать их. Я хочу заставить все ссылки открываться на новых вкладках, аля target="_blank"

Думал, что это сработает .. но, к сожалению, это не так. Есть идеи?

  $('a').attr("target","_blank");
  

Вот jsFiddle с динамическим кодом:
http://jsfiddle.net/danielredwood/mrgta/7

Ответ №1:

Вы могли бы сделать это (что позволяет браузеру пользователя решать, открывать ли новое окно или вкладку)

 $('a').live('click', function() {
    window.open($(this).attr('href'));
    return false;
});
  

Комментарии:

1. Интересно, почему это было отклонено? Это должно работать так, как рекламируется. Кроме того, мне нравится устанавливать target атрибут на _blank , как было предложено в других ответах, потому что я старой школы, и это работает хорошо. Но это конкретное решение — если кто-то вообще заботится о таких вещах — на самом деле то, которое следует рекомендовать, если кто-то заботится о проверке (поскольку target это устаревший атрибут).

2. PS, пожалуйста, посмотрите мой отдельный ответ на этой странице, который подтверждает этот же ответ по другой причине: время.

Ответ №2:

Ваша проблема может заключаться в выборе времени.

Имейте в виду, когда вы вызываете что-то вроде $('a').attr(...whatever...) , что это вступит в силу мгновенно для всех без исключения существующих элементов на странице. Итак, … если ваш tweet плагин асинхронен и выполнение его занимает более 0 миллисекунд, похоже, что ваш код пытается изменить атрибуты ссылок, которые еще даже не существуют на странице.

То есть вы могли бы (А) вызвать tweet плагин, (Б) изменить все ссылки на странице, а затем (В) плагин tweet завершит работу и добавит кучу новых ссылок на страницу, которые были пропущены ранее.

Итак, что вы могли бы попробовать, так это посмотреть, есть ли в tweet используемом вами плагине какой-нибудь «all-done» или другой обратный вызов завершения, который вы могли бы затем использовать для изменения тегов ссылок. Или, как было предложено в другом ответе, который я также поддерживаю, заключается в том, чтобы не просто пытаться изменить теги ссылок, но вместо этого прослушивать (в реальном времени) при любом нажатии на ссылку на странице и перехватывать их в этот момент времени. Таким образом, вам не нужно беспокоиться о сроках завершения работы плагина tweet, поскольку вы можете использовать делегирование событий ( live ), которое работает в любой момент времени. Смотрите ответ от Petah для получения отличного примера того, как это сделать.

Удачи!

Ответ №3:

Это работает для меня:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>

<body>


<a href="http://www.google.com">test</a>
<br />
<a href="http://www.yahoo.com">test2</a>

<script>
    $('a').attr('target', '_blank');
</script>

</body>

</html>
  

Комментарии:

1. Если вы замените 'new' на '_blank' , у вас это все еще работает? Просто спрашиваю. Если это произойдет, возможно, у OP есть другие проблемы. Если это не так, я хотел бы знать, почему.

2. @Dave Maple — Без кубиков. Загрузил jsFiddle для демонстрации. Опубликовано в вопросе

3. @Dave Maple — забыл упомянуть, что ваш код работает с существующими ссылками, но не со ссылками, загруженными через JSON.

4. @Dave: Да, у нее определенно есть другая проблема.

5. @Dave — это в jsFiddle. Используя подключаемый модуль Twitter.

Ответ №4:

Попробуйте:

 $('a').attr({ target: "_blank" });
  

Кроме того, попробуйте «_new» вместо пустого. Если это не сработает, почему бы не опубликовать сгенерированный html или весь ваш javascript-код целиком?

Ответ №5:

Это не работает, потому что <a> еще не является частью вашей страницы, когда $('a').attr("target","_blank"); запускается.

Комментарии:

1. @technopeasant, я не уверен.