Запустите javascript в атрибуте href с помощью jQuery .click () (или аналогичного) - PullRequest
11 голосов
/ 03 августа 2011

К сожалению, я работаю с каким-то сторонним javascript, который вставляет ссылки на мои страницы.Вместо того, чтобы просто использовать эти ссылки как есть, я хочу использовать прокси-элементы, которые при щелчке вызывают событие click для сторонних ссылок.

Сторонние ссылки упаковывают javascript в атрибут href, например так::

<a id="horribleLink" href="javascript:doSomething()">Click me</a>

Мой прокси-элемент выглядит следующим образом:

<button rel="horribleLink" class="linkProxy">No, click me</button>

И немного jQuery'd Javascript, чтобы связать их вместе:

$('button.linkProxy').click(function(){
    $('#' + $(this).attr('rel')).click();
});

Теперь,это прекрасно работает, если сторонняя ссылка просто стандартная ссылка (<a id="horribleLink" href="http://www.google.com">Click</a>) или чуть менее ужасный щелчок (<a href="#" id="horribleLink" onclick="doSomething()">Click</a>), но когда javascript находится внутри атрибута href, срабатывает кнопка'вообще ничего не делает.

Может кто-нибудь сказать мне, почему, и если есть разумный обходной путь?

Обновлен Как сказал Миллиметрик, основная причина заключается в том, что браузерыпредотвратить «фальшивые клики» на якорях - я удалил мой пример «стандартной ссылки», так как это еще одна ситуация, которая не работает.Однако обработчик onclick работает, как и следовало ожидать.

Ответы [ 5 ]

11 голосов
/ 03 августа 2011

Принятый ответ здесь немного углубляется в вопрос «почему это происходит»: Могу ли я вызвать jquery click (), чтобы перейти по ссылке , если я не связал обработчик событий с нимпривязать или нажать уже? .По сути, кажется, что вы не можете выполнить щелчок () по ссылке, потому что браузер не поддерживает поддельные нажатия.

Один обходной путь :

ЕслиВы устанавливаете location.href для этих случаев, он работает:

$('button.linkProxy').click(function(){
    location.href = $('#' + $(this).attr('rel')).attr('href');
});

Рабочая скрипка: http://jsfiddle.net/uv29x/3/

Два обходных пути :

Вы можете просто получить ссылку на эти ссылки и сделать на них eval(), верно?

4 голосов
/ 03 августа 2011

Установите window.location в значение href.

$('button.linkProxy').click(function(){
    window.location = $('#'+$(this).attr('rel')).attr('href');
});

DEMO: http://jsfiddle.net/dmSUm/

2 голосов
/ 03 августа 2011

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

eval($('#horribleLink').attr('href').replace('javascript:',''));
0 голосов
/ 10 декабря 2014

Используйте собственный метод Javascript click, и вы получите рабочий щелчок!

$('button.linkProxy').click(function(){
    $('#' + $(this).attr('rel')).click()[0].click();
});

Я сохранил jQuery click , предполагая , что Javascript clickобходить jQuery trigger s, и в этом случае вы захотите сохранить оба.В противном случае, если я неправ (или вам не нужно учитывать trigger), вы можете уменьшить его до:

$('button.linkProxy').click(function(){
    $('#' + $(this).attr('rel'))[0].click();
});
0 голосов
/ 03 августа 2011

Если я правильно понимаю вопрос, проблема в том, что у вас есть что-то вроде этого:

 <a href="javascript:alert('hello');" onclick="javascript:alert('clicked');">Test</a>

И вы утверждаете, что когда javascript находится на href, событие onclick не вызывается.Правильный?Если так, то, что я вижу, так это то, что оба увольняются, сначала по клику, а затем по javascript внутри href.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...