点燃下一个事件,但之后不会

时间:2010-07-30 21:20:25

标签: javascript jquery html javascript-events

对于某个页面,我已经获得了一个包含在标签内的链接,如下所示:

<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 个答案:

答案 0 :(得分:1)

尝试阻止事件在标签处传播。

$(document).ready(function(){
    $('label').click(function(e){
        e.stopPropagation();
    });
});

答案 1 :(得分:0)

您可以使用$(elem).one(fn) - http://api.jquery.com/one/

答案 2 :(得分:0)

也许您应该将html更改为:

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

并且根本不使用javascript?

答案 3 :(得分:0)

好吧,如果您允许在客户端更改html,您可以随时移动标签之外的链接,

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

demo

答案 4 :(得分:0)

这一个:

<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;
});

适合我。也许有污点干扰你的剧本?

答案 5 :(得分:0)

尝试使用.one()代替.click()

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

答案 6 :(得分:0)

KISS

$(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;
    });
});