0

我想创建一个上下文驱动的菜单。当用户单击树中的任何节点时,就会出现此菜单。每个节点都有一个类“treedropdownmenu”。单击节点时,应打开上下文驱动菜单。我正在使用“删除”菜单选项传递一个方法“_deleteClick”。但它给我一个错误:找不到“_deleteClick”菜单。

我的小部件中有以下代码:

$(".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");
}

谁能让我知道我哪里出错了?

4

4 回答 4

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); });
于 2012-06-26T02:51:10.383 回答
1

这是向链接添加事件处理程序的一种笨拙方式,尤其是因为无论如何您都是以编程方式创建它。为什么不像这样动态添加点击处理程序?

var item = ko.dataFor(this);
var deleteLink = $('<a>', {
    href: '#',
    click: function() {
        _deleteClick(item);
    },
    text: 'Delete:'
});
$("#...").show().offset(pos).append(deleteLink);
于 2012-06-26T02:54:00.103 回答
0

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

var strHtml = "<a href='#'>foo</a>;
var lnk = jQuery(strHtml);
lnk.on("click", function(){ _deleteClick(item); });
$("#dataManagerMenuItem1234").show().offset(pos).append(lnk);
于 2012-06-26T02:51:56.493 回答
0

您尚未在此处发布所有代码,但我假设您已_deleteClick在本地范围内定义了该函数,并且您的 onclick 处理程序无法从全局范围内访问它。这就是为什么不应该使用onclick属性将事件附加到 DOM 元素的原因之一!您的 onclick 属性(以字符串形式写出)不会在正确的上下文中执行。改为使用 jQuery 进行订阅。

看起来您正在使用 KnockoutJS。一个更好的方法是使用Knockout 模板来写出你的菜单。

于 2012-06-26T02:59:24.127 回答