var json_string=$.parseJSON(document.getElementById("json_db").innerHTML);
$(function()
{
$("#folder_tree").jstree({
contextmenu: {items: customMenu},
"json_data" : {data:json_string},
"plugins" : [ "themes", "json_data", "ui", "contextmenu" ],
});
});
function customMenu(node)
{
var items = { };
}
$('#folder_tree').delegate('a', 'contextmenu', function (e)
{
idn = $(this).parent().attr("id");
if(idn) pool_control(idn,e); //sendMsg(idn)
});
嗨,我在jsTree中發現了一些非常奇怪的東西。 上面的代碼顯示了樹的創建和委託右鍵單擊事件。 sendMsg(idn)發送一個AJAX請求到另一個頁面。 pool_control(idn,e)使用該事件在單擊的節點旁顯示一個表單。表單填充後,它會調用sendMsg。在jstree代理中創建意外的多實例
當我在委託事件處理程序(而不是pool_control)中直接調用sendMsg時,該腳本完美工作。但是,當我通過pool_control調用它時,會發生這種情況: 每個pool_control都被調用,發送的Ajax請求增加1。請求的內容似乎是相同的,但我不知道爲什麼沒有。的Ajax請求增加。當我直接調用sendMsg時不會發生這種情況。
發生了什麼事?我該如何解決?
pool_control和sendmsg:
function pool_control(id,ev)
{
$("#pool_count").css("left",ev.pageX);
$("#pool_count").css("top",ev.pageY);
$("#pool_count").css("visibility","visible");
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
$("#poolcancel").click(function()
{
$('#pool_count').css('visibility','hidden');
});
}
function sendMsg(a,ev)
{
$('#pool_count').css('visibility','hidden');
var factid = $("#factid").val();
var floor = $("#floor").val();
var ceiling = $("#ceiling").val();
var pool_count = $('#poolsize').val();
var userid = document.getElementById("userid").innerHTML;
$.ajax(
{
type: "POST",
url: "generator.php",
data: {what:a,name:factid,author:userid,floor:floor,ceiling:ceiling,pool_count:pool_count},
async: false,
cache: false,
timeout:50000,
});
}
這是一個長輪詢網頁。 sendMsg在樹中發送用戶自定義的更改並且不關心響應。 另一個函數waitForMsg是長輪詢ajax請求。當它看到由於sendMsg引起的數據庫更改時,它會再次調用jstree()函數來重新生成樹。 當我在樹中進行更改時,sendMsg第一次發送1個請求,第二次發送2個請求,第三次發送3個請求,依此類推。 我敢肯定,沒有什麼是錯在功能,但在這裏它,以防萬一
function waitForMsg()
{
var lastupdate = document.getElementById("lastupdate").innerHTML;
var msg;
$.ajax({
type: "POST",
url: "oracle.php",
data: {lastupdate:lastupdate},
async: true,
cache: false,
timeout:20000,
success: function(data)
{
msg = data.split("@");
document.getElementById("lastupdate").innerHTML=msg[0];
document.getElementById("json_db").innerHTML=msg[1];
initPage(); //a <body onready> function which creates the tree again
setTimeout('waitForMsg()', 200);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
setTimeout('waitForMsg()', 1000);
}
});
}
嘗試增加e.stopImmediatePropagation()在委託塊 – Mahn
槽糕......它真的沒有做任何事情來增加Ajax請求。它只是開始使默認的窗口上下文菜單開始出現。 –
好吧,那麼你可能必須顯示pool_control後面的代碼 – Mahn