Запустите следующее событие, но не после этого - PullRequest
2 голосов
/ 31 июля 2010

Для страницы мне дали ссылку, заключенную в ярлык, например:

<label for='checkbox_elem'>
    Links to <a href='somepage.php' target='anotherwindow'>another page.</a>
</label>

Когда пользователь нажимает на ссылку во всех браузерах, страница появляется в новой вкладкекак и предполагалось, но в Firefox флажок, связанный с меткой, также выбран.Это нежелательное поведение.

Я хочу запустить несколько jQuery, чтобы разрешить всплывающую ссылку, но после этого убить событие.У меня есть следующее, которое работает, но не очень элегантно:

$(document).ready(function(){
    $('label a').click(function(e){
        open($(this).attr('href'), $(this).attr('target'));
        return false;
    });
});

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


Кроме того, я пытался w / stopPropagation, но не добился большого успеха.

Также обратите внимание, что приведенное выше решение работает, но я ищу что-то более элегантное для общей остановки распространения событий после их первого вызова.(Первый собственный вызов. Если я добавлю обратный вызов, я все еще хочу, чтобы сработало поведение собственного элемента, но не его родительского).

Спасибо, Джо

Ответы [ 7 ]

1 голос
/ 02 августа 2010

Попробуйте остановить распространение события на метке.

$(document).ready(function(){
    $('label').click(function(e){
        e.stopPropagation();
    });
});
0 голосов
/ 03 августа 2010

ПОЦЕЛУЙ

$(document).ready(function(){
    $('label a').click(function(e){
        open($(this).attr('href'), $(this).attr('target'));
        $(this).parent().click(); //Click the label again to reverse the effects of the first click.
        return false;
    });
});
0 голосов
/ 02 августа 2010

Попробуйте использовать .one() вместо .click():

$(document).ready(function(){
    $('label a').one(function(e){
        open($(this).attr('href'), $(this).attr('target'));
        return false;
    });
});
0 голосов
/ 02 августа 2010

Это:

<label> test <a href="#">Test</a> <input type="checkbox" name="check[]" /></label>

Или даже:

<label for="test1"> test <a href="#">Test</a> <input type="checkbox" name="test1" id="test1" class="checkbox" /></label>

И JS:

$('a').click(function(e){
    var t=$(this);
    window.open(t.attr('href'), t.attr('target'));
    return false;
});

У меня работает.Может быть, что-то мешает вашему сценарию?

0 голосов
/ 02 августа 2010

Что ж, если вам разрешено изменять html на стороне клиента, вы всегда можете переместить ссылки за пределы метки следующим образом:

$(document).ready(function(){ 
    $('label').find('a').each(function(){
        var $anchor = $(this);        
        $(this).closest('label').after($anchor);
    });
});​

demo

0 голосов
/ 31 июля 2010

Может быть, вы должны изменить свой HTML-код на:

<label for='checkbox_elem'>Links to </label>
<a href='somepage.php' target='anotherwindow'>another page.</a>

и вообще не использовать javascript?

0 голосов
/ 31 июля 2010

Вы можете использовать $ (elem) .one (fn) - http://api.jquery.com/one/

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