2011-12-04 122 views
12

我是新来的Jquery和JS树,但学习爱它。我使用php生成的xml设置了一个树形菜单 (参见下面的代码)。它的工作原理为 ,但有一个例外 - 链接无效。JS树链接不活跃

我知道有一些基本的东西我不明白。短期我只是 希望链接功能正常的链接。长期来看,我希望他们 触发ajax调用,将重新加载页面上的特定div。

任何人都可以指向正确的方向吗?非常感谢您的帮助!

$(function() { 
     $("#mainMenu").jstree({ 
       xml_data : { data : <?php $menu->deliver(); ?> }, 
       core : { animation : 1000 } 
       ui : { select_limit : 1, selected_parent_close : false }, 
       themes : { theme : "default", dots : true, icons : false }, 
       types : { types : { "heading" : { select_node : true } } }, 
       plugins : [ "themes", "xml_data", "ui", "types" ] 
     }); 
}); 

示例XML(单项):

"<root><item id='pubPages_home' parent_id='0'><content><name href='? 
a=pubPages&amp;f=home'>Public Home</name></content></item><root>" 
+0

什么链接不起作用?如果你点击节点名称?你想要发生什么?你能提供jsfiddle样本吗? – Radek

+1

@Radek节点按预期工作(打开和关闭树)。 a标签hrefs不起作用。当悬停在链接上时,浏览器可以识别它们,但点击不会将浏览器发送到链接。我怀疑JS树已经调用preventDefault()来点击一个标签。 –

回答

2

我认为你需要明确写入了树节点的链接点击处理程序。 JsTree为自己带来点击事件,不要让它进入重定向页面。

我会尝试走这条路:

$('#mainMenu').bind('select_node.jstree', function(e,data) { 
    window.location.href = data.rslt.obj.attr("href"); 
}); 
3

我知道这是老了,但我来到这里寻找一个快速解决。 LuborBílek大部分都是正确的,但请记住,jsTree将绑定单击的锚元素的父项<li>

我解决了这个做:

.bind('select_node.jstree', function(e,data) { 
    window.location.href = data.rslt.obj.find('a').attr("href"); 
}); 

这样一来,该事件将绑定到孩子<li>而不是<li>本身<a>,这样你可以对你的锚href属性,而不是您的列表项。

0

我找到一个简单的方法。

$('#'+target).jstree({ 'core' : { 
    'data' : treeInfo 
} }); 

$(".jstree-anchor").click(function() 
{ 
    document.location.href = this; 
}); 

我发现jstree对li列表使用了“jstree-anchor”类。 所以,我可以从这个对象中找到href链接,我可以使这个链接没有任何包围功能。

1

我试试这个代码:

window.location.href = data.rslt.obj.find('a').attr("href"); 

它提高data.rslt未定义的错误,所以我不能用它获得的href!

这里是我使用的码:

$("#mytree").bind("select_node.jstree", function(e, data) { 
    window.location.href = data.node.a_attr.href; 
}); 

是与jstree的版本?我jstree版本:3.0.0-bata10

14
  .bind("select_node.jstree", function (e, data) { 
       var href = data.node.a_attr.href 
       document.location.href = href; 
      }) ; 

jstree版本:“3.0。0" , 的jQuery:最后

更新: 或对我来说最好的办法:

.bind("select_node.jstree", function (e, data) { 
    $('#jstree').jstree('save_state'); 
}) ; 

.on("activate_node.jstree", function(e,data){ 
    window.location.href = data.node.a_attr.href; 
}) 
1

我解决了,现在这个问题有点蛮力

<li id="child_node_1"><span onClick="javascript:window.location.href='your_page.html'" title="Lassie come home!">your text here</span></li> 

好,易于。

1

试试这个:

jQuery("#mytree ul").on("click","li.jstree-node a",function(){ 
    document.location.href = this; 
}); 

感谢jQuery event delegation,此事件将委托给<a>要素。 如果你不使用事件委托,它会在第一次点击每个锚点时触发。

+0

为什么OP要“试试这个”?你能提供一个解释,这将有利于OP以及将来访问SO吗? –

1

通常我们需要一起控制“Container Nodes”和“Child Nodes”的动作。

因此,我们可以做thomething,如:

$("#jstree-div").jstree().delegate("a","click", function(e) { 
      if ($("#jstree-div").jstree("is_leaf", this)) { 
       document.location.href = this; 
      } 
      else { 
       $("#jstree-div").jstree("toggle_node", this); 
      } 
     }); 

“is_leaf”是来检查,如果一个节点没有孩子jsTree功能之一。