【问题标题】:How do I get leaf nodes in jstree to open their hyperlink when clicked when using jstree ui?如何在使用 jstree ui 时单击 jstree 中的叶节点以打开其超链接?
【发布时间】:2013-09-04 10:26:04
【问题描述】:

我用jtree展示了一个层次结构,数据如下

<div id="songchanges"><ul>
<li id="phtml_1">
<a href="#">C:</a>
<ul>
<li id="phtml_2">
<a href="#">Music</a>
<ul>
<li id="phtml_3">
<a href="#">Z</a>
<ul>
<li id="phtml_4">
<a href="#">Hans Zimmer</a>
<ul>
<li id="phtml_5"><a href="FixSongsReport_00107_2013-09-04-11-11-55_body_blqxgT7E7YOmnBbjFXQGUg==.html">C:\Music\Z\Hans Zimmer\Hannibal</a></li>
</ul>
</li>
<li id="phtml_6">
<a href="#">The Zombies</a>
<ul>
<li id="phtml_7"><a href="FixSongsReport_00107_2013-09-04-11-11-55_body_er7mjWKbAaYaf8DygP84Fg==.html">C:\Music\Z\The Zombies\Best of The Zombies</a></li>
<li id="phtml_8"><a href="FixSongsReport_00107_2013-09-04-11-11-55_body_56XgVDhsjEKWXFd4OzVldA==.html">C:\Music\Z\The Zombies\The Zombies featuring Colin Blunstone & Rod Argent</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>

它显示正常,作为一个文件系统。

这是框架集的一部分,显示在屏幕的左侧,当用户单击叶节点时,我希望它打开右侧的附加链接(就像在我将 jtree 内容应用到它之前一样)

我的jtree配置如下

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" type="text/css" href="songkong.css">
<base target="main">
<script type="text/javascript" src="http://static.jstree.com/v.1.0pre/jquery.js"></script>
<script type="text/javascript" src="http://static.jstree.com/v.1.0pre/jquery.cookie.js"></script>
<script type="text/javascript" src="http://static.jstree.com/v.1.0pre/jquery.hotkeys.js"></script>
<script type="text/javascript" src="http://static.jstree.com/v.1.0pre/jquery.jstree.js"></script>
<link rel="stylesheet" href="/resources/demos/style.css" />
<script type="text/javascript" class="source below">
$(function () {
$("#songchanges")
.jstree({
"plugins" : ["themes","html_data","ui","crrm","hotkeys"],
"core" : { "initially_open" : [ "phtml_1" ] }
})
.bind("loaded.jstree", function (event, data) {
});
$("#songchanges").bind("open_node.jstree", function (e, data) {
data.inst.select_node("#phtml_1", true);
});
});
</script></head>

我阅读了 demo3 示例

$(function () {
    $("#demo3")
        .jstree({ "plugins" : ["themes","html_data","ui"] })
        // 1) if using the UI plugin bind to select_node
        .bind("select_node.jstree", function (event, data) { 
            // `data.rslt.obj` is the jquery extended node that was clicked
            alert(data.rslt.obj.attr("id"));
        })
        // 2) if not using the UI plugin - the Anchor tags work as expected
        //    so if the anchor has a HREF attirbute - the page will be changed
        //    you can actually prevent the default, etc (normal jquery usage)
        .delegate("a", "click", function (event, data) { event.preventDefault(); })
});

并尝试过,但 .delegate 选项无效,我假设我必须删除“ui”插件但尝试我的页面看起来就像我从未应用过 jstree。

绑定选项有点工作,因为每次我单击任何节点时,它都会显示一个烦人的警报窗口,显示 id。那么如何更改它以在右侧打开链接呢?

更新 找到这个答案Jstree nodes don't work when ui plugin is used

添加

  .bind("select_node.jstree", function (e, data) {
    var href = data.rslt.obj.children("a").attr("href");
    // this will load content into a div:
    $("#contents").load(href);
    // this will follow the link:
    document.location.href = href;
  }) 

现在链接在单击时打开,不幸的是它用页面替换了左侧框架,而我希望它把它放到右侧窗格中,任何想法。

【问题讨论】:

标签: javascript html jstree


【解决方案1】:

对于新版本;

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

【讨论】:

  • 最好使用 window.open( data.node.a_attr.href, data.node.a_attr.target ) 而不是这两行,因为它还可以正确处理(可选)target 声明。
  • 我要加if (href[0] !== "#")
【解决方案2】:

我知道这篇文章有点老了,但在这里我做了什么来完成这项工作:

html:

<div id="entryPointTree">
    <ul>
        <li>Produits des mains
           <ul>
              <li><a href="http://www.google.ca" class="jstree-clicked">Lien 1</a></li>
              <li>item 2</li>
           </ul>
        </li>
        <li>Produits des pieds</li>
    </ul>
</div>

js:

$(document).ready(function() {
    $("#entryPointTree").jstree({ "plugins" : ["themes","html_data","ui"] });
    $("#entryPointTree li").on("click", "a", 
        function() {
            document.location.href = this;
        }
    );
});

【讨论】:

  • 我刚刚测试过,它仍然可以正常工作,这与我能找到的所有其他过时的建议相反。请注意:您的示例中的第二行不需要点击行为起作用。
【解决方案3】:

我的 v3.3.4 解决方案,效果很好!

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

【讨论】:

    【解决方案4】:

    试试这个。

    $("#demo2").jstree().bind("select_node.jstree", function (e, data) { 
            var href = data.rslt.obj.children("a").attr("href"); 
            document.location.href = href; 
    
          //  $("#the_div").load(href); 
        }) ;
    

    【讨论】:

    • 我需要将第二行改为:var href = data.node.a_attr.href;
    • 较新版本 (3+) 的 data.rslt 不再可用。 data.node 返回节点对象
    【解决方案5】:

    其他答案都不符合我的要求:节点标题中有多个 &lt;a&gt; 标签。这对我有用:

    HTML

    <div id="object-tree">
      <ul>
         <li>SomeTitle <a href="/link1" target="_blank">link1><a href="/link2" target="_blank">link2</a></li>
      </ul>
    </div>
    

    Javascript

    jQuery('#object-tree').jstree().bind("select_node.jstree", function (e, data) {
      // Allow links to work from within jstree nodes
      window.open( jQuery(data.event.originalEvent.originalTarget).attr('href'), '_blank');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-04
      • 2021-04-30
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多