2015-04-30 3 views
0

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

$(function() { 
     $('#demo').jstree({ 
      ... 
       "contextmenu":{   
        "items": function($node) { 
         var tree = $("#demo").jstree(true); 
         return { 
          "Create": { 
           "separator_before": false, 
           "separator_after": false, 
           "label": "Create", 
           "action": function (obj) { 
            var newNode = createNode($node,tree); 
            //tree.edit(newNode); 

         tree.edit(newNode, null, function (the_node, rename_status) { 

          console.log("status:"+rename_status); 
         }); 
            } 
          } 
          } 
         }; 
        } 
       } 

      }) 
    }); 




function createNode($node,tree) 
    { 
     $newNode = tree.create_node($node); //create new node 
     return $newNode; 
    } 

ответ

1

jstree create_node функции не возвращает узел DOM, он возвращает идентификатор строки, как заявил здесь: http://www.jstree.com/api/#/?q=create_node&f=create_node%28[obj,%20node,%20pos,%20callback,%20is_loaded]%29

для того, чтобы иметь возможность прикрепить любое событие, которое нужно узел DOM, так переписать createNode функцию следующим образом:

function createNode($node,tree) { 
    $newNode = tree.create_node($node); //create new node 
    return tree.get_node($newNode, true); 
} 

Также имейте в виду, если вы приложите такой обработчик будет потерян, если родительский элемент этого узла будет закрыт и затем открыт, так как jstree сохраняет только видимые узлы в DOM. Если это не подходит для вас - используйте делегирование событий, например, добавив событие в контейнер дерева.


Согласно комментариях ниже, лучшим решением было бы использовать edit функцию обратного вызова (если вы используете jstree v.3.1.1 или более поздней версии):

tree.edit(newNode, null, function (the_node, rename_status) { 
    // any custom logic you need 
}) 

Здесь является окончательной демонстрацией с использованием обратного вызова редактирования и v.3.1.1: http://jsfiddle.net/DGAF4/498/

Если вы используете более раннюю версию ИЛИ вам не нравится кошка ching вызывает rename_node - прослушивает событие rename_node.jstree - это предпочтительный способ реагирования на изменение имени.

+0

Большое спасибо за информацию, я поеду со вторым подходом, поскольку первый, похоже, немного запутан для конечного пользователя. Я редактировал в своем сообщении выше. Событие нажатия клавиши запускается, но каким-то образом он не распознает ключ ввода, поэтому предупреждение не запускается в моем случае ... У вас есть идеи, что я пропустил? – user596502

+0

Ключ ввода захватывается текстовым полем переименования (отображается при вызове 'edit'). Мне нужно спросить - чего вы пытаетесь достичь? Привязать событие к каждому узлу или только в текстовом поле переименования? – vakata

+0

Я пытаюсь связать событие на каждом узле, поэтому, когда create_node завершен, мне нужно отправить имя вновь созданного узла (при нажатии на ввод) на сервер в то же время – user596502