- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 中发现了一些非常奇怪的东西。上面的代码显示了树的创建和委托(delegate)右键单击事件。sendMsg(idn) 向另一个页面发送 AJAX 请求。pool_control(idn,e) 使用该事件在单击的节点旁边显示一个表单。表单填写完毕后,它会调用 sendMsg。
当我直接在委托(delegate)事件处理程序(而不是 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 导致 db 发生变化时,它会再次调用 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);
}
});
}
最佳答案
由于事件在 jQuery 中的工作方式,每次使用 .click() 等函数附加事件时,该事件都会“堆叠”到列表中,而不是被替换。
通俗地说,代码如下:
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
不告诉 jQuery 在单击发生时运行此函数,而是将其添加到触发单击时应运行的事件列表中。 p>
也就是说,如果多次附加事件,例如通过以下方式:
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
结果将是(您猜对了)sendMsg() 每次点击都会被调用 3 次,因为附加的每个事件都是独立处理的。
由于每次调用 pool_control 时都会附加新的点击事件,因此每次调用 pool_control() 时,sendMsg() 调用的次数以及 ajax 请求都会增加 1。
修复?要么取消绑定(bind)点击事件,然后再在 pool_control() 中再次绑定(bind)它们:
function pool_control(id,ev)
{
$("#pool_count").css("left",ev.pageX);
$("#pool_count").css("top",ev.pageY);
$("#pool_count").css("visibility","visible");
$("#poolbutton").unbind('click').click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
$("#poolcancel").unbind('click').click(function()
{
$('#pool_count').css('visibility','hidden');
});
}
或者,我个人更愿意推荐这种方式,因为它的开销较小,只需在初始化代码中附加一次事件。您可以随时附加事件,在您的示例中,在 pool_control() 外部的上下文菜单上调用委托(delegate)之前附加它们是完全可以的:
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 = { };
}
$("#poolbutton").click(function()
{
$('#pool_count').css('visibility','hidden');
sendMsg(id);
});
$("#poolcancel").click(function()
{
$('#pool_count').css('visibility','hidden');
});
$('#folder_tree').delegate('a', 'contextmenu', function (e)
{
idn = $(this).parent().attr("id");
if(idn) pool_control(idn,e); //sendMsg(idn)
});
function pool_control(id,ev)
{
$("#pool_count").css("left",ev.pageX);
$("#pool_count").css("top",ev.pageY);
$("#pool_count").css("visibility","visible");
}
此方法确保事件仅附加一次,并且只要您不破坏 #pool_count 就可以了,只要发生点击,事件就会被触发,而不必在 pool_control() 中关心它。
关于javascript - jstree 委托(delegate)中意外创建多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204497/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!