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

我有一点javascript:

 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>&nbsp;<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>&nbsp;<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会在最奇怪的时刻崩溃,另请参见。