easyui tree 根据url自定义图标

约定不等于承诺〃 2022-07-15 13:49 382阅读 0赞

近期由于项目中需要使用easyui tree树形列表,并在系统中动态配置节点的图标,根据官方demo,配置图标只能使用iconCls树形来对每个节点进行图标的设置,这使得在数据库存储中需要存储icon.css中的类名(类似icon-save)或者自定义的类名,同时,这需要提前在系统中对不同的图标url设置好不同的类名,如果图片不在系统中已知,则无法改变图标。同时,由于本系统中需求比较特殊:各个功能在系统中进行配置,每一个功能是一个节点,每个节点需要可配置图标,而且要求数据库中存储的是图标的文件路径,数据库中结构如下:
这里写图片描述

图标路径存储在WebPath字段中,要求根据其路径生成图标。对此,初步想法是测试
1、直接将该url赋值给iconCls字段,因为查阅资料可以发现extjs等部分控件可以将url直接赋值给iconCls字段,对此进行测试:
在Dreamweaver 中添加如下代码,直接初始化一个tree,并添加一个img确保图标路径正确

  1. <h2>Editable Tree</h2>
  2. <p>Click the node to begin edit, press enter key to stop edit or esc key to cancel edit.</p>
  3. <div style="margin:20px 0;"></div>
  4. <div class="easyui-panel" style="padding:5px">
  5. <ul id="tt" class="easyui-tree" data-options=" url: 'tree_data1.json', method: 'get', animate: true, onClick: function(node){ $(this).tree('beginEdit',node.target); } "></ul>
  6. </div>
  7. <img src="01.png"/>

tree_data1.json中数据如下:

  1. [{
  2. "id":1,
  3. "text":"Folder1",
  4. **"iconCls":"01.png",**
  5. "children":[{
  6. "text":"File1",
  7. "checked":true
  8. },{
  9. "text":"Books",
  10. "state":"open",
  11. "attributes":{
  12. "url":"/demo/book/abc",
  13. "price":100
  14. },
  15. "children":[{
  16. "text":"PhotoShop",
  17. "checked":true
  18. },{
  19. "id": 8,
  20. "text":"Sub Bookds",
  21. "state":"closed"
  22. }]
  23. }]
  24. },{
  25. "text":"Languages",
  26. "state":"closed",
  27. "children":[{
  28. "text":"Java"
  29. },{
  30. "text":"C#"
  31. }]
  32. }]

设置一个节点的iconCls,如上代码中加粗部分,查看显示效果,结果如下图:
这里写图片描述
发现修改的第一个节点Folder1图标还是默认的,说明并没有效果,F12查看此时的DOM节点,如下图:
这里写图片描述
发现类名为tree-icon的span节点上只是多了一个 01.png的类名,说明iconCls的配置只是将配置的字符以类名直接添加到span上,显然不会有任何效果。

2、经过上面的测试,发现url直接赋值的形式无法解决,但是根据上面的DOM结构可以看出,设置的图标就是将类名为tree-icon的span元素的background属性设置为指定的图片,而且默认的样式都是采用外部连接方式进行设置的。这样,根据CSS的优先级,只需要通过内联方式设置background样式将background属性覆盖即可。结合API和对各个事件、方法的测试,选定formatter属性对数据进行一定的处理,在调试过程中发现formatter属性对应的方法传递node参数,而且node中有一个属性“domId”即为最终DOM加载完成后树节点的Id,则可以通过该id找到子节点中类名为tree-icon的span元素,对它的background进行设置,代码如下

  1. $.ajax({
  2. type: "POST",
  3. url: "/Service/LSPRTAPI.asmx/GetMenuData",
  4. contentType: "application/json; charset=utf-8",
  5. data:'{"parentNo":"'+parentNo+'"}',
  6. dataType: 'json',
  7. success: function (data) {
  8. var icon = [];
  9. var paradata = eval('(' + data.d + ')');
  10. $('#tree' + parentNo).tree({
  11. data: paradata,
  12. onSelect: function (node) {
  13. if (node==null || node.Url == null || node.Url.length<=0) {
  14. return;
  15. }
  16. LoadUrl(node.Url, node.text);
  17. },
  18. formatter: function (node) {
  19. icon.push({ "domId": node.domId, "webPath": node.Webpath });
  20. return node.text;
  21. }
  22. });
  23. //根据url修改图标,使用内联样式覆盖外部链接
  24. $.each(icon, function (index, val) {
  25. $('#' + val.domId + ' .tree-icon').css("background", "url(" + val.webPath + ") no-repeat center center");
  26. });
  27. }

根据调试得到返回的JSON数据如下:

  1. [
  2. {
  3. Parentno: "122",
  4. id: "123",
  5. text: "出让方模块",
  6. Fk_App: "LSPRT",
  7. Url: "",
  8. Webpath: "",
  9. children: [
  10. {
  11. Parentno: "123",
  12. id: "130",
  13. text: "出让用户管理",
  14. Fk_App: "LSPRT",
  15. Url: "admin\/BidTransferUser.aspx?ustate=0",
  16. Webpath: "img\/no.png"
  17. },
  18. {
  19. Parentno: "123",
  20. id: "131",
  21. text: "出让信息审核",
  22. Fk_App: "LSPRT",
  23. Url: "admin\/BidTransferAudit.aspx?ustate=0",
  24. Webpath: "img\/no.png"
  25. },
  26. {
  27. Parentno: "123",
  28. id: "132",
  29. text: "出让挂牌设置",
  30. Fk_App: "LSPRT",
  31. Url: "admin\/BidTransferBoard.aspx?ustate=1",
  32. Webpath: "img\/01.png"
  33. }
  34. ]
  35. },
  36. {
  37. Parentno: "122",
  38. id: "134",
  39. text: "受让方模块",
  40. Fk_App: "LSPRT",
  41. Url: "",
  42. Webpath: "",
  43. children: [
  44. {
  45. Parentno: "134",
  46. id: "2116",
  47. text: "受让用户管理",
  48. Fk_App: "LSPRT",
  49. Url: "admin\/BidAssigneeUser.aspx?ustate=0",
  50. Webpath: "img\/01.png"
  51. },
  52. {
  53. Parentno: "134",
  54. id: "2117",
  55. text: "受让信息审核",
  56. Fk_App: "LSPRT",
  57. Url: "admin\/BidAssigneeAudit.aspx?ustate=0",
  58. Webpath: "img\/01.png"
  59. },
  60. {
  61. Parentno: "134",
  62. id: "2118",
  63. text: "取消受让审核",
  64. Fk_App: "LSPRT",
  65. Url: "admin\/BidAssigneeCancel.aspx?ustate=1",
  66. Webpath: "img\/01.png"
  67. }
  68. ]
  69. },
  70. {
  71. Parentno: "122",
  72. id: "2119",
  73. text: "组织交易",
  74. Fk_App: "LSPRT",
  75. Url: "admin\/BiddingList01.aspx",
  76. Webpath: "img\/01.png"
  77. },
  78. {
  79. Parentno: "122",
  80. id: "2120",
  81. text: "鉴证书模块",
  82. Fk_App: "LSPRT",
  83. Url: "",
  84. Webpath: "",
  85. children: [
  86. {
  87. Parentno: "2120",
  88. id: "2121",
  89. text: "鉴证书管理",
  90. Fk_App: "LSPRT",
  91. Url: "ab\/abList01.aspx",
  92. Webpath: "img\/01.png"
  93. },
  94. {
  95. Parentno: "2120",
  96. id: "2122",
  97. text: "鉴证书变更管理",
  98. Fk_App: "LSPRT",
  99. Url: "ab\/abReplaceList01.aspx",
  100. Webpath: "img\/01.png"
  101. }
  102. ]
  103. }
  104. ]

最后效果如图:
这里写图片描述
这里有几点需要注意:
1、在使用formatter属性时,tree是还没有生成DOM节点,所以这里只是将domId和Webpath进行存储,等树加载完成后,再获取DOM节点进行CSS属性设置
2、tree的onSuccessLoad事件触发时,是数据加载完成,并不是tree的DOM节点已经生成
3、测试时发现,图标最好是16*16大小,太大可能会显示不正常

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读

    相关 EasyUI中使用定义的icon图标

     我们在web开发中为了界面的更加漂亮,我们可能会使用EasyUI框架来帮我们实现一些好看的效果,那么在框架里面提供了很多的样式和图标,但是有时候自带的图标已经满足不了我们啦,

    相关 mui定义图标

    研究了一下自定义图标,不仅仅可以在h5里面用,还可以在小程序或者别的开发环境里面用。 首先找到图标源,我自己找的是阿里巴巴矢量图库。 ![watermark_type_Zm