Jquery 对象在Dialog.open之后丢失所有函数
我有一个Javascript对象(非常简化)如下所示Jquery 对象在Dialog.open之后丢失所有函数,jquery,html,Jquery,Html,我有一个Javascript对象(非常简化)如下所示 if('undefined' !== typeof(listCtrls)){ for (ctrlName in listCtrls) { var ctrl = listCtrls[ctrlName]; ctrl.Initialize = function() { //Save a reference to the 'tbody' element this.tbody = $("#"+this.id+"_tbody");
if('undefined' !== typeof(listCtrls)){ for (ctrlName in listCtrls) {
var ctrl = listCtrls[ctrlName];
ctrl.Initialize = function() {
//Save a reference to the 'tbody' element
this.tbody = $("#"+this.id+"_tbody");
this.dataFetched = false;
}
ctrl.Update = function(command){
//Go and fetch some data
$.post(url, function(ssResponse){ ... }
this.tbody = "fill with AJAX data";
}
ctrls.SomeMoreFunctionsAsWell() {}
}});
正如您在函数Initialize()
中看到的,它引用了一个HTML元素。
在我将引用的HTML元素放入JQuery对话框之前,一切都很正常
对话框一打开,ctrl
就会丢失其所有功能。我不明白为什么!如果在调用Dialog.Destroy()
时出现问题,这是有道理的,但此错误直接发生在对话框打开后
现在,我在Dialog.Open()过程中没有遇到常规的javascript错误。相反,当我在调用ctrl.Update()
的对话框中单击一个元素时,会出现一个错误
未捕获的TypeError:对象#没有方法“更新”
HTML代码:
<div id="dialog_Substitute" style="display:none;" title="test">
<div><span class="ui-icon ui-icon-info" style="style"></span>
<table style="width:100%" id="substitutelist_table">
<thead id="substitutelist_thead"><tr><th style="cursor: pointer; ">Name</th><th style="cursor: pointer; ">Valid from</th><th style="cursor: pointer; ">Valid through</th><th style="cursor: pointer; ">Incl. Authorities</th><th style="cursor: pointer; "></th></tr></thead>
<tbody class="tbodydata" id="substitutelist_tbody">
<tr style="background-color:#F2F2F2;"><td class="left" style="">Lager, Patrik</td><td class="left" style="">2011-04-15</td><td class="left" style="">2011-07-01</td><td class="left" style=""></td><td class="action left" onclick="if(¤7¤==true) {var a=¤6¤; var b='2011-04-15'; deleteItem(a,b);};return kill(event);" style=""><img src="../Styles\sctrls/delete_16.png" alt="Ta bort"></td></tr>
<tr style=""><td class="left" style="">Svensson, Marie</td><td class="left" style="">2011-04-15</td><td class="left" style="">2011-05-12</td><td class="left" style=""></td><td class="action left" onclick="if(¤7¤==true) {var a=¤6¤; var b='2011-04-15'; deleteItem(a,b);};return kill(event);" style=""><img src="../Styles/sctrls/delete_16.png" alt="Ta bort"></td></tr>
<tr style="background-color:#F2F2F2;"><td class="left" style="">Lind, Linda</td><td class="left" style="">2011-02-05</td><td class="left" style="">2011-02-27</td><td class="left" style=""></td><td class="action left" onclick="if(¤7¤==true) {var a=¤6¤; var b='2011-02-05'; deleteItem(a,b);};return kill(event);" style=""><img src="../Styles/sctrls/delete_16.png" alt="Ta bort"></td></tr>
</tbody></table>
</div>
你知道为什么会这样吗
谢谢 修复顶部代码:
if ('undefined' !== typeof (listCtrls))
{
for (ctrlName in listCtrls)
{
listCtrls[ctrlName].Initialize = function ()
{
//Save a reference to the 'tbody' element
this.tbody = $("#" + this.id + "_tbody");
this.dataFetched = false;
}
listCtrls[ctrlName].Update = function (command)
{
//Go and fetch some data
$.post(url, function (ssResponse)
{...
}
this.tbody = "fill with AJAX data";
}
listCtrls[ctrlName].SomeMoreFunctionsAsWell = function ()
{}
}
}
}
您从未定义过范围之外的任何内容。当创建jQuery对话框时,html将从主体中移出!这可能就是问题的根源所在……事实证明(喜欢这个表达式),当打开JQuery.Dialog()
时,它不仅移动对话框的内部HTML代码,还执行任何内联javascript代码
因为ctrl的初始值设定码就在旁边,所以它被执行了第二次,因此丢失了数据。我找不到调用DialogMethod的地方。
但我用一行简单的代码解决了同样的问题,如果您使用链接或按钮调用jquery函数,那么该链接或按钮将继续执行DOM工作,所以您必须避免该工作,比如停止它
Jquery有一个名为e.preventDefault()的方法来实现这个功能,链接的默认操作是转到页面顶部,而e.preventDefault()页面将保持在原来的位置
但您必须将调用函数的方式更改为:
$(".SomeButtonOrLinkOrDomObjectId").click(function (e) {
e.preventDefault(); //this does the trick.
//then, your code...
});
希望能有帮助
再见。抱歉,在缩短功能时丢失了。我会修好的。该对象是一个ListControl,在我的网站的许多地方都使用它。而且效果很好。但这是我第一次将它放在JQuery中。Dialog@Neal. 感谢您难以置信的承诺,使这项工作。你有权要求我在范围外不定义“ctrl”。但在内部,ctrl等于listCtrols[ctrlname],这要感谢这一行:var-ctrl=listCtrls[ctrlname]尽管如此,ctrl
变量在范围之外不可用。@Neal,也许我误解了你。在此之前已经定义了名为“listCtrls”的数组,它包含一个名为“substitutelist”的对象。这就是FOR循环所迭代的。我在你的代码中没有看到任何对话框调用啊,是的,你的权利。(现在包括)listCtrls
来自哪里?listCtrls[“替代列表”]==ctrl@David在代码中,你在哪里声明???你认为因为tbody引用不再有效,CTRL会丢失它的所有函数(包括Update()?我更新了CTRL的所有功能,以重置对TBODY元素的引用。但仍然存在相同的错误:(
$(".SomeButtonOrLinkOrDomObjectId").click(function (e) {
e.preventDefault(); //this does the trick.
//then, your code...
});