Javascript 一次单击多个链接
我有一点javascript:Javascript 一次单击多个链接,javascript,jsf,Javascript,Jsf,我有一点javascript: function refreshGroup(){ var obj1 = document.getElementById("refresh0:link0"); var obj2 = document.getElementById("refresh1:link1"); obj1.click(); obj2.click(); }; 最终将向列表中添加多个对象。每个对象都是页面上的链接。我想创建一个方法,刷新特定链接组的所有链接。链接绑定到一个支持b
function refreshGroup(){
var obj1 = document.getElementById("refresh0:link0");
var obj2 = document.getElementById("refresh1:link1");
obj1.click();
obj2.click();
};
最终将向列表中添加多个对象。每个对象都是页面上的链接。我想创建一个方法,刷新特定链接组的所有链接。链接绑定到一个支持bean方法,该方法更新与链接关联的数据。这就是我想要它做的,只是它在单击下一个链接之前等待每个链接完成运行。有没有办法让它一次点击所有的按钮
编辑:
下面是我试图模拟点击JSF的代码:
<h:form id="refresh#{loop.index}" >
<h:commandLink class="link" id="link#{loop.index}" value="#{a.status}" >
<f:ajax listener="#{a.getCheckAppMonitor}"
render=":errs#{loop.index} :refresh#{loop.index} :errs_#{i+1}"
onevent="refreshMoreLessLinks" />
</h:commandLink> <img id="img_#{loop.index}"
class="hidden"
src="resources/images/ajax-loader.gif"/>
</h:form>
JSF将其生成如下内容:
<FORM id=refresh0 encType=application/x-www-form-urlencoded method=post
name=refresh0 action=/appmonitor/faces/appmonitorgreeting.xhtml><INPUT
value=refresh0 type=hidden name=refresh0> <A id=refresh0:link0
onclick="mojarra.ab(this,event,'action',0,'errs0 refresh0 errs_1',{'onevent':refreshMoreLessLinks});return false"
href="http://localhost:8080/appmonitor/faces/appmonitorgreeting.xhtml#">OK</A> <IMG
id=img_0 class=hidden
src="appmonitorgreeting_xhtml_files/ajax-loader.gif"><INPUT
id=javax.faces.ViewState value=7494473519347208075:5184408304577602221
type=hidden name=javax.faces.ViewState autocomplete="off"> </FORM>
不要试图欺骗点击事件 改为调用click事件后面的函数 将DOM视为一个视图,而不是一个模型。有没有办法让它一次单击所有这些视图 据我所知,这是不可能的。因为单击元素会在浏览器管理的事件队列中添加事件。 执行语句obj1时,单击;,它注册与obj1连接的单击事件。当此事件到达事件队列的前端时,浏览器将调用相应的附加事件处理程序。 当某些事件处理程序代码正在执行时,所有其他触发的事件都会添加到队列中,并等待轮到它们移动到队列前面。因此,您可以逐个单击元素,但与它们连接的事件处理程序将一次执行一个。 原因:因为JavaScript使用单线程执行 如果一个事件处理程序正在执行大型计算,则所有触发的事件都必须等待该计算完成。
试试这个小把戏:我使用的是JSF,链接触发的事件对我来说很神秘。那么你的问题就在这里。解开那团乱。在一段代码变得完全不可维护之前,它只能承受这么多的滥用。好吧,不知道从哪里开始。请看上面的编辑。虽然我同意你的观点,但你实际上并没有具体回答这个问题。只要你不知道生成的HTML/JS输出是什么样子,最好发表评论。嗯,这些链接都会触发默认异步的ajax请求。只是JSF使用async=false将它们放入队列,以确保视图状态的完整性。@BalusC无论发生什么事件,它进入事件队列一次。如果正在执行某些阻塞函数,即使发出异步请求的事件处理程序也必须等待。唯一的区别是异步请求离开事件队列并在响应到达时注册回调。上面的回答说明了同步请求阻塞的情况。如果您认为答案是肯定的,请与我共享一个链接,该链接表示javascript可以同时处理1个以上的事件。问题是:它等待每个链接完成运行,换句话说,下一个ajax请求正在等待,直到检索到上一个ajax的响应并完成处理。这不是异步请求的默认行为。通常,在成功触发上一个ajax请求后,会立即触发下一个ajax请求,而无需等待响应,如async=false。@BalusC我们给出的上述答案是在同步请求的上下文中。如果您认为它是错误的,您能告诉我们使用同步请求获得所需行为的解决方案吗?您是否考虑过只创建一个JSF操作方法来调用所有这些目标方法,然后通过单击来精确执行该操作方法?@BalusC您是说我应该有一个commandLink来为每个对象调用它:侦听器={a.getCheckAppMonitor}?我创建了一个这样做的方法,但无法使render=@all工作。如果你从开发者的角度而不是最终用户的角度来描述崩溃,这会很有帮助。你知道IE是否有日志吗?我收到一个消息框,上面说IE已停止工作,是否要重新启动程序。我单击yes,它将恢复选项卡。好的,您使用的是哪个JSF impl/版本?你有没有试过在一个简单的页面上使用@all?大家都知道IE8会在最奇怪的时刻崩溃,另请参见。