DynaTree имеет два выделенных узла по правому клику после левого клика - PullRequest
2 голосов
/ 10 ноября 2011

Моя проблема заключается в том, что всякий раз, когда я щелкаю левой кнопкой мыши по узлу dynatree, затем правой кнопкой мыши щелкаю по другому узлу dynatree, чтобы отобразить мое контекстное меню, узел, по которому щелкнули левой кнопкой мыши, остается подсвеченным синим, поэтому я получаю два узла синим цветом.Если затем я щелкну правой кнопкой мыши по последующим узлам, подсветка будет работать правильно, но выделенный левой кнопкой мыши узел останется выделенным.

При обработке щелчком левой кнопки мыши предыдущий узел очищается при наведении мыши.Я запускаю обработку контекстного меню с помощью

document.oncontextmenu=contextMenu 

, который также вызывается при наведении мыши.

Я попытался захватить событие нажатия правой кнопки мыши и сделать узел контекстного меню активным, думая, что это изменится.состояние левого узла, по которому щелкнули, но не так.

$("#tree").mouseup(function(e){
   if(e.button == 2){
      e.target.setActive();// right mouse up
  }     
}); 

Как получить последний узел, по которому щелкнули левой кнопкой мыши, чтобы он не выделялся при щелчке правой кнопкой мыши по другому узлу?Не выглядит правильным выделение двух узлов одновременно.Я заметил, что демо контекстного меню dynatree не отменяет выделения ранее щелкнувшего левой кнопкой мыши узла, когда щелкают правой кнопкой мыши другой узел, так это задумано ??Можете ли вы обойти это?

Спасибо, Ал

Ответы [ 4 ]

2 голосов
/ 10 ноября 2011

ОК, это работает

В моем myfile.js после создания dynatree я добавил:

var dtnode;   //dynatree node Global <--ADDED
var elem;     //DOM node Global  <--ADDED


Function BuildTree()


//ADDED following code after the dynatree was loaded 

$("#tree").mouseup(function(e){
if(e.button == 2){ //RIGHT MOUSE UP 
    if(!(elem == null)){
        var elem2 = e.currentTarget.document.activeElement;
        dtnode = tree.getDtNodeFromElement2(elem);
        dtnode.deactivate();
        elem = null;
        }   
}else{//LEFT MOUSE UP
    if(!(elem == null)){
        elem = null;
    }
    elem = e.currentTarget.document.activeElement;  
}   
}); 

//In jquery.dynatree.js
//$Version: 1.1.1$
//$Revision: 481, 2011-03-02 07:25:35$

//The following changes were made:

getSelectedNodes: function() {
    return this.tree.getSelectedNodes();
},

// AFTER THE ABOVE FUNCTION THE FOLLOWING FUNCTION WAS ADDED

getDtNodeFromElement2: function() {
    return this.tree.getDtNodeFromElement2();
},

//********************************************************

getSelectedNodes: function(stopOnParents) {
    var nodeList = [];
    this.tnRoot.visit(function(node){
    if( node.bSelected ) {
        nodeList.push(node);
        if( stopOnParents === true ){
           return "skip"; // stop processing this branch
        }
    }
});
return nodeList;
},

// AFTER THE ABOVE FUNCTION THE FOLLOWING FUNCTION WAS ADDED 

getDtNodeFromElement2: function(elem) {
    var sourceNode = getDtNodeFromElement(elem);
    return sourceNode;
},

Резюме: Отслеживая последний элемент, подлежащий щелчку левой кнопкой мыши, и открывая метод dynatree getDtNodeFromElement через getDtNodeFromElement2, можно вызывать метод деактивации в последнем левом нажатом узле всякий раз, когда происходит первый щелчок правой кнопкой мыши по узлу. Это исключает одновременное выделение узлов дерева.

1 голос
/ 26 сентября 2012

Я знаю, что это старый, но я столкнулся с той же проблемой. При попытке вручную управлять классами 'dynatree-active' на узлах для принудительной подсветки у меня были проблемы с выбором нескольких узлов. Используя левый клик и правый клик, dynatree управлял всеми выбранными и отменяемыми активными узлами.

$("#tree").mouseup(function(e){
        if(e.button == 2) e.target.click();
}); 

Я немного боролся с этим, надеюсь, это может спасти кого-то от боли.

1 голос
/ 12 июля 2012

Мне нужно добавить короткий метод, который я добавил в jquery.dynatree.js, чтобы он работал.

//--- Class members ------------------------------------------------------------

DynaTree.prototype = {
// Constructor
// member functions


getDtNodeFromElement2: function(elem) {
    var sourceNode = getDtNodeFromElement(elem);
    return sourceNode;
},
0 голосов
/ 11 ноября 2011

Еще одно изменение, которое я обнаружил, нажимая вокруг дисплея

Вместо

}else{//LEFT MOUSE UP
    if(!(elem == null)){
        elem = null;
    }
    elem = e.currentTarget.document.activeElement;  
}   

use

}else{//LEFT MOUSE UP
    if(!(elem == null)){
        elem = null;
    }
    elem = e.currentTarget.document.activeElement;
    if(elem.tagName != 'A'){
        elem = e.target;
    }  
}  

Это исправляет проблему, когда старая проблема с подсветкой появляется сноваэлемента, не являющегося элементом A, нажата.

Al

...