2012-06-26 22 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寫出你的菜單。