Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 部分刷新在XPage中触发addOnLoad事件_Javascript_Dojo_Xpages - Fatal编程技术网

Javascript 部分刷新在XPage中触发addOnLoad事件

Javascript 部分刷新在XPage中触发addOnLoad事件,javascript,dojo,xpages,Javascript,Dojo,Xpages,在我的XPage中,我在脚本块中编写了一个addOnLoad。但问题是,即使在我不希望的部分刷新期间,它也会触发。例如,如果我在数据表上有一个寻呼机控件,那么点击页面就会触发addOnLoad功能。这在dojo.addOnLoad和XSP.addOnLoad中都会发生 dojo.addOnLoad(function() { console.log("addOnLoad"); }); 这将在每次部分刷新时打印“addOnLoad”。我甚至试图用这种方式修改代码,但没有成功 var add

在我的XPage中,我在脚本块中编写了一个
addOnLoad
。但问题是,即使在我不希望的部分刷新期间,它也会触发。例如,如果我在数据表上有一个寻呼机控件,那么点击页面就会触发
addOnLoad
功能。这在
dojo.addOnLoad
XSP.addOnLoad
中都会发生

dojo.addOnLoad(function() {
    console.log("addOnLoad");
});
这将在每次部分刷新时打印“addOnLoad”。我甚至试图用这种方式修改代码,但没有成功

var addOnLoadFired = false;
dojo.addOnLoad(function() {
    if (addOnLoadFired) {
        return;
    }
    addOnLoadFired = true;
    console.log("addOnLoad");
});

如何避免这种情况?

在不指定刷新id的情况下执行部分刷新时,将刷新整个XPage。如果刷新UIViewRoot元素,也会发生同样的情况。在这两种情况下,这都包括输出scriptblock,这就是addOnLoad事件被反复激发的原因

寻呼机自动刷新其父组件。如果您的寻呼机刚刚添加到XPage,它将始终刷新UIViewRoot

为了解决问题,可以将dataTable和寻呼机嵌入到xp:div元素中。另一种方法是在执行部分刷新时检入输出脚本块的rendered属性

编辑: 以编程方式检查部分刷新(SSJS):


在不指定刷新id的情况下执行部分刷新时,将刷新整个XPage。如果刷新UIViewRoot元素,也会发生同样的情况。在这两种情况下,这都包括输出scriptblock,这就是addOnLoad事件被反复激发的原因

寻呼机自动刷新其父组件。如果您的寻呼机刚刚添加到XPage,它将始终刷新UIViewRoot

为了解决问题,可以将dataTable和寻呼机嵌入到xp:div元素中。另一种方法是在执行部分刷新时检入输出脚本块的rendered属性

编辑: 以编程方式检查部分刷新(SSJS):



将脚本块移出部分刷新的区域。我不认为这是原因。我举的例子是,我创建了一个数据表和一个与之关联的寻呼机控件。使用寻呼机控件在页面之间切换时,执行
addOnLoad
。并且脚本块不驻留在数据表中。Hack解决方案:当代码第一次运行时,在运行代码之前,向viewScope写入一些内容并进行检查?@AaronBrake:但是
viewScope
是SSJS,我的代码是客户端JavaScript。可以在隐藏字段中写入一个值并进行检查。将脚本块移出部分刷新的区域。我不认为这是原因。我举的例子是,我创建了一个数据表和一个与之关联的寻呼机控件。使用寻呼机控件在页面之间切换时,执行
addOnLoad
。并且脚本块不驻留在数据表中。Hack解决方案:当代码第一次运行时,在运行代码之前,向viewScope写入一些内容并进行检查?@AaronBrake:但是
viewScope
是SSJS,而我的代码是客户端JavaScript。然后可以将值写入隐藏字段并进行检查。将我的数据表和寻呼机嵌入
中不起作用。我将如何在
rendered
属性中检查页面是否已部分刷新?刷新后,您可以在Firebug或IE/Chrome中的其他开发人员工具“查看网络”部分中看到它。对于部分刷新的组件,响应包含整个页面(完全刷新)或只是html的一部分。这就是我的评论:如果您将脚本移出刷新的html,它将不会运行。正如斯文所指出的,您似乎已经完全刷新了。@Naveen:更新了我的答案。@Naveen:您设置了div的id了吗?@SvenHasselbach:我设置了
的id,结果成功了。非常感谢!:)在
中嵌入我的数据表和寻呼机不起作用。我将如何在
rendered
属性中检查页面是否已部分刷新?刷新后,您可以在Firebug或IE/Chrome中的其他开发人员工具“查看网络”部分中看到它。对于部分刷新的组件,响应包含整个页面(完全刷新)或只是html的一部分。这就是我的评论:如果您将脚本移出刷新的html,它将不会运行。正如斯文所指出的,您似乎已经完全刷新了。@Naveen:更新了我的答案。@Naveen:您设置了div的id了吗?@SvenHasselbach:我设置了
的id,结果成功了。非常感谢!:)
var ajax = new com.ibm.xsp.ajax.AjaxUtil();
if( ajax.isAjaxPartialRefresh(facesContext) == true){
    return "AJAX";
}else{
    return "NOT AJAX!"
}