2012-06-26 25 views
0

我想创建一个上下文驱动菜单。这个菜单出现在用户点击树中的任何节点时。每个节点都有一个类“treedropdownmenu”。在点击的节点上,上下文驱动菜单应该打开。我使用Delete菜单选项传递了一个方法“_deleteClick”。但它给我一个错误:“_deleteClick”菜单找不到。以javascript形式写入函数

我在小部件下面的代码罚款:

$(".treedropdownmenu").live("click", function (event) { 
    var pos; 
    if(($(window).height() - event.pageY) < 80) { 
     pos = { 
      left: event.pageX + 20, 
      top: event.pageY - 60 
     }; 
    } else { 
     pos = { 
      left: event.pageX + 20, 
      top: event.pageY + 20 
     }; 
    } 
    if(ko.dataFor(this).nodeId() && ko.dataFor(this).nodeId() !== 0) { 
     var item = ko.dataFor(this); 
     var strHtml = "<a href='#' onclick='_deleteClick(item)'>Delete:</a> " + "<br/>" + "<b>Create Date:</b>" + "<br/>" + "<b>Exposed Party Name:</b>" + "<br/>" + "<b>Portfolio Type:</b>" + "<br/>" + "<b>Owner:</b>"; 
     $("#dataManagerMenuItem1234").show().offset(pos).html(strHtml); 
    } 
}); 

删除菜单我是:

function _deleteClick(item) { 
    alert("delete clicked"); 
} 

任何人都可以让我知道我要去哪里错了?

回答

1

是的,我不认为这会奏效。试试这个:

var strHtml = "<a href='#'>Delete:</a> " + "<br/>" + "<b>Create Date:</b>" + "<br/>" + "<b>Exposed Party Name:</b>" + "<br/>" + "<b>Portfolio Type:</b>" + "<br/>" + "<b>Owner:</b>"; 
$("#dataManagerMenuItem1234").show().offset(pos).html(strHtml).find('a').click(function() { _deleteClick(item); }); 
0

不要在字符串中添加事件处理程序,这是不好的做法。

var strHtml = "<a href='#'>foo</a>; 
var lnk = jQuery(strHtml); 
lnk.on("click", function(){ _deleteClick(item); }); 
$("#dataManagerMenuItem1234").show().offset(pos).append(lnk); 
1

这是因为你创造它编程反正添加事件处理程序的链接,特别是 的kindof笨拙的方式。为什么不动态添加点击 处理程序?

var item = ko.dataFor(this); 
var deleteLink = $('<a>', { 
    href: '#', 
    click: function() { 
     _deleteClick(item); 
    }, 
    text: 'Delete:' 
}); 
$("#...").show().offset(pos).append(deleteLink); 
0

您还没有张贴在这里所有的代码,但我假设你已经在本地范围内定义的函数_deleteClick,和你的onclick处理程序不能从全局范围内访问它。这是您不应使用onclick属性将事件附加到DOM元素的原因之一!您的onclick属性写成字符串,不会在正确的上下文中执行。使用jQuery来订阅。

它看起来像你使用KnockoutJS。更好的方法是使用Knockout template写出你的菜单。