Запускать javascript в атрибуте href с помощью jQuery.click() (или аналогичного)

К сожалению, я работаю с некоторым сторонним 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="#" onclick="location.href='http://www.google.com'; return false;">Click</a>) или немного менее ужасная onclick (<a href="#" id="horribleLink" onclick="doSomething()">Click</a>), но когда javascript находится внутри атрибут href, запуск 'click' ничего не делает.

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

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

Ответ 1

Принятый ответ здесь немного углубляется в отношении "почему это происходит": Можно ли вызвать jquery click(), чтобы следовать за <a> ссылку, если я не связал обработчик события со связью или уже нажал?. В принципе, кажется, вы не можете сделать клик() по ссылке, потому что браузер не поддерживает поддельный щелчок.

Один рабочий процесс:

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

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

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

Два режима работы:

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

Ответ 2

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

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

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

Ответ 3

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

eval($('#horribleLink').attr('href').replace('javascript:',''));

Ответ 4

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

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

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

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

Ответ 5

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

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

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