2009-11-23 2 views
2

Мне нужно вызвать событие click по ссылке, а затем, если ни один из прослушивателей не заблокировал значение по умолчанию, измените местоположение.Имитировать собственный щелчок

Это то, что я получил до сих пор:

var $el = $('a#my_special_link'); 
var onClick = $el.attr('onclick'); 

// Hack to capture the event object 
var ev_reference; 
var ev_capture = function(ev) { ev_reference = ev; } 
$el.bind('click', ev_capture); 

// Don't leave out the onClick handler 
if (typeof onClick == 'function') 
    $el.bind('click', onClick); 

$el.trigger('click'); 

// Clean up 
$el.unbind('click', ev_capture); 
if (typeof onClick == 'function') 
    $el.unbind('click', onClick); 

// Redirect if necessary 
if (! ev_reference.isDefaultPrevented()) 
    window.location = $el.attr('href'); 

Любые предложения по улучшению приветствуются.

PS: Да, именно так будет работать регулярная связь, за исключением того, что вы можете выполнять некоторую другую обработку между ними.

PPS: Нет, просто делается $ el.trigger ('click'); будет не изменить местоположение.

ответ

1

http://docs.jquery.com/Events/trigger#eventdata

$('a#my_special_link').trigger("click"); 
+0

Это не будет перенаправлять или что угодно. Он выполняет только обработчик событий. –

+0

Точно. Я уже запускаю обработчики событий. Мне нужна перенаправляющая часть. – scribu

0

"если ни один из слушателей не предотвратили по умолчанию, изменить расположение."

Звучит так, как ведет себя нормальная связь ...?

В любом случае, если вы пытаетесь найти «return false», он не будет найден с использованием isDefaultPrevented(), который вернет true, если preventDefault() вызывается из одного и того же объекта события. В этом примере, я посылаю объект события whatever() и если эта функция устанавливает preventDefault(), окно переедет в любом случае (это то, что вам нужно ...?)

$('a#my_special_link').bind('click', function(e) { 
    whatever(e); 
    if (e.isDefaultPrevented()) { 
    window.location = $(e.target).attr('href'); 
    } 
}); 
+0

Любой обработчик - за исключением onClick = "" - который возвращает false или вызовы ev.preventDefault() вызовет isDefaultPrevented(), чтобы вернуть true, так что это не проблема. Проблема в том, что я не тот, кто пишет атрибут onClick = "". Я просто должен справиться с этим. – scribu

+0

ОК, так как вы хотите справиться с этим? это похоже на то, что вы можете просто вызвать клик с помощью триггера («щелчок»), а затем позволить браузеру перенаправлять естественным образом, если eventHandler не заблокировал значение по умолчанию. – David

+0

По соображениям безопасности, я полагаю, браузер не будет перенаправлять _not_, если вы просто вызываете событие click. – scribu

0

Если я правильно понимаю ваш вопрос, у вас есть элемент a, который вы не контролируете, у которого есть атрибут onclick, который возвращает false. Возврат false из обработчика onclick предотвращает щелчок по ссылке, чтобы перейти на связанную страницу. И ты этого не хочешь.

Вы можете сохранить функцию onclick обработчика, а затем удалить его из зацепления элемента:

var $a = $('#my_special_link'); 
var onclickHandler = $a.attr('onclick'); 
$a.removeAttr('onclick'); 

Тогда кал хранимой функции обработчика в персонализированном обработчике щелчка:

$a.click(function() { 
    // ... 
    onclickHandler(); 
    // ... 
}); 
+0

Да, я уже делаю это с помощью $ el.bind ('click', onClick); Не знаю, удалять ли атрибут onclick. – scribu

4

enter code here Чтобы извлечь мой примечания к другим сообщениям: (другой способ сказать один и тот же базовый материал)

 <a href="somewhere" id="mylink">MyLink</a> 
     <script>jQuery('#mylink').click(function(){ 
      // do whatever I want here, then redirect 
      window.location.href = "http://stackoverflow.com"; 
     }); 
     function doClick(){ 
      jQuery('#mylink').trigger('click'); 
     }; 
     // trigger the redirect now 
     doClick(); 
     </script> 

EDIT1: @ comments:

Если «другое», которое вы описываете, возвращает false, вы в этот момент прекратите обратный вызов с помощью false - так что вы правы, но не имеете никакого отношения к этому обработчику. Который когда-либо один ударяет первым, выполняется, а другой никогда не возвращается, и этот переадресовывает до того, как другой попадает в журнал, если он выполняется первым.

Для того, чтобы поставить свой журнал, вы положить, что, где у меня

"// do whatever I want here, then redirect" 

комментарий Чтобы удалить другое событие, а затем связать с этим только:

<a href="somewhere" id="mylink">MyLink</a> 
     <script>jQuery('#mylink').unbind('click').bind('click', function(){ 
      // do whatever I want here, then redirect 
      window.location.href = "http://stackoverflow.com"; 
     }); 
     function doClick(){ 
      jQuery('#mylink').trigger('click'); 
     }; 
     // trigger the redirect now 
     doClick(); 
+0

Это не сработает с другим обработчиком. Например: JQuery ('# MyLink') нажмите (функция() { console.log ('другой обработчик'); возвращение ложным; });. – scribu

+0

Проблема в том, что у меня нет контроля над другими обработчиками. Я просто должен убедиться, что они выполнены, а затем решить, следует ли мне перенаправлять или нет. – scribu

+0

Unbind может получить контроль над другим, но, конечно, если ссылка будет выполняться на другом сайте, у вас НЕ будет выбора, поскольку поезд покинет станцию, и страница будет заменена. –

Смежные вопросы