javascript - 如何将函数绑定(bind)到DOM事件一次且仅一次,使其不会在事件触发时执行第二次?

标签 javascript jquery jquery-ui jqgrid

所以我有 <a href='[link'] rel='Tab'> 形式的 anchor 标签我在页面加载时应用以下内容:(我的意思是“文档准备就绪”)

jQuery("a[rel*=Tab]").click(function(e) {
                e.preventDefault();//then I do some stuff to open it in jq ui tab}

现在的问题是,当我执行此操作并稍后通过 javascript 生成新链接时,在我使用 JqGrid 加载第二页的情况下,有新的 <a rel='neoTab'>在我第一次运行时不存在 jQuery("a[rel*=Tab]").click(function(e)所以他们不会工作...所以我可以运行jQuery("a[rel*=Tab]").click(function(e)在每次创建新链接但旧链接会加载多个选项卡的事件中,有没有一种方法可以选择之前未选择的所有“a[rel*=Tab]”?

注意:我可以并且已经通过算法方法解决了这个问题,您可以通过下面的详细信息看到,我只是认为有一些我不知道的语法可以防止需要使用这个技巧!

不必要的细节:

var neoTabitStat = 0;
var openTabs = new Array();
openTabs[0] = 'inbox';
if(!(currentBox=='inbox'||currentBox=='outbox') ) {var currentBox = 'inbox';}

function initNeoTab(a){
    if(neoTabitStat==0) {
        jQuery("a[rel*="+a+"]").click(function(e) {
            e.preventDefault();
            tabIt(jQuery(this).attr('href')+'&nohead=1',jQuery(this).attr('title'),jQuery(this).attr('data-hovercard'));
        });
    neoTabitStat++;
    }
}

function tabIt(a,b,c) {
    c = typeof(c) != 'undefined' ? c : 0;
    lastOpen = openTabs.length;
    if(lastOpen<6) { 
        if(openTabs.indexOf(c)<0) {
            openTabs[lastOpen] = c;
            jQuery("#tabs").tabs("add" , a , b, lastOpen+1 );
        }
        $tabs.tabs('select', openTabs.indexOf(c) );
    }else{
        var tabErrDig = jQuery('<div style="display:hidden">You have opened the maximum amount of tabs please close one to open another tab.</div>').appendTo('body');
        tabErrDig.dialog({width:500,title:'Maximum Tabs Opened',modal: true,
                buttons: {
                    Ok: function() {
                        jQuery( this ).dialog( "close" );
                    }
                }
        });
    }
}

jQuery(document).ready(function() {  initNeotab('nameOfrelAttr4existingLinks'); }
myGrid = jQuery("#list").jqGrid({/*alot of stuff...*/} , gridComplete: function() { initNeotab('nameOfrelAttr4generatedLinks');
}

更新: 正如 Wrikken 建议的那样,jQuery().live 我检查了一下,这正是我所需要的,但我无法让它实际工作,在某些情况下它不会工作。对于编写不同解决方案的其他所有人,您熟悉 .live() 吗?如果是,为什么我不能在这里使用它?

结论 特别感谢 fudgey、patrick dw 和 wrikken。所有答案都有帮助。 .delegate() .为我工作但出于某种原因.live()没有。路上的事jqGrid将元素添加到表中。我会让这个问题暂时悬而未决。再次感谢您的帮助。 +1 给所有人

最佳答案

在 jQuery 中,使用 the live() function

关于javascript - 如何将函数绑定(bind)到DOM事件一次且仅一次,使其不会在事件触发时执行第二次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3951313/

相关文章:

javascript - 将参数附加到数组并评估每个数组元素

javascript - 在 Node 应用程序中加载脚本

javascript - jQuery 获取 IFRAME 内容并将其设置为 div

javascript - 使用 getbBox 获取 svg 中每个组的坐标不起作用?

javascript - jQuery 完整版和缩小版主要功能差异?

jquery - 将 JQuery Sortable(新顺序)保存到 ASP.Net MVC Controller ?

jquery-ui - src= 用于 jquery-ui.min.js?

javascript - Polymer.Dart 事件监听

javascript - 从响应对象中获取特定值

javascript - jQuery 在 slideDown/Up 期间滞后