【发布时间】:2010-10-16 23:43:47
【问题描述】:
所以我有<a href='[link'] rel='Tab'> 形式的锚标记,我在页面加载时应用以下内容:(我的意思是'文档准备好')
jQuery("a[rel*=Tab]").click(function(e) {
e.preventDefault();//then I do some stuff to open it in jq ui tab}
现在的问题是,当我这样做时,稍后通过 javascript 生成新链接,在我使用 JqGrid 加载第二页的情况下,当我第一次运行 jQuery("a[rel*=Tab]").click(function(e) 时,新的 <a rel='neoTab'> 不存在所以他们不会工作......所以我可以在每个创建新链接的事件中运行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
【问题讨论】:
-
你尝试了什么?能发一下代码吗?另外,
<a>元素是否被添加到#list容器中?我真的建议使用.delegate()。它与.live()相同,但将其本地化在特定容器上。这样更有效率。 -
@patrick 是的,我现在最终使用了委托,因为所有内容都被添加到#list 中。因为它是 jqGrid 正在处理的表的 id。我认为 jqGrid 中的方法会有更好的解决方案,所以我将等待 jqGrid 专家的一些答案,同时自己进行更多的研究,但到目前为止我的代码已经工作了。
标签: javascript jquery jquery-ui jqgrid