Запускать 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.