【问题标题】:Click multiple links at once一次点击多个链接
【发布时间】:2013-11-28 17:01:49
【问题描述】:

我有这段 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>

【问题讨论】:

  • 您是否考虑过只创建一个单一的 JSF 操作方法来调用所有这些目标方法,然后通过单击执行该单一操作方法?
  • @BalusC 你是说我应该有一个commandLink,它为每个对象调用这个:listener="#{a.getCheckAppMonitor}"?我创建了一个方法,但无法让render=@all 工作。见this
  • 如果您从开发人员的角度而不是最终用户的角度来描述“崩溃”会很有帮助。
  • 知道IE是否有日志吗?我收到一个消息框,说 IE 已停止工作,是否要重新启动程序。我点击是,它会恢复选项卡。
  • 好的,您使用的是哪个 JSF impl/version?您是否在只有&lt;html&gt;&lt;h:head/&gt;&lt;h:body&gt;&lt;h:form&gt;&lt;h:commandButton&gt;&lt;f:ajax&gt; 的简约页面上尝试过@all?众所周知,IE8 在大多数奇怪的时刻都会崩溃,另见例如java.net/jira/browse/JAVASERVERFACES-2873

标签: javascript jsf


【解决方案1】:

不要试图欺骗点击事件。

改为调用点击事件背后的函数。

将 DOM 视为视图,而不是模型。

【讨论】:

  • 我正在使用 JSF,链接触发的事件对我来说很神秘。
  • 那么你的问题就在那里。解开那个乱七八糟的。一段代码在变得完全无法维护之前只能承受这么多的滥用。
  • 好的,不知道从哪里开始。请参阅上面的修改。
  • 虽然我同意你的观点,但你实际上并没有具体回答这个问题。只要您不知道生成的 HTML/JS 输出是什么样子,最好发表评论。
【解决方案2】:

有什么办法让它同时点击所有的?

据我所知,这是不可能的。因为单击元素会在浏览器管理的事件队列中添加一个事件。 当您执行语句obj1.click(); 时,它会注册附有obj1 的点击事件。当此事件到达事件队列的最前面时,浏览器会调用附加的相应事件处理程序。
当一些事件处理程序代码正在执行时,所有其他触发的事件都被添加到队列中,它们等待轮到它们移动到队列的前面。因此您可以一个接一个地单击元素,但附加的事件处理程序将执行一次一个。
原因:因为 JavaScript 使用单线程执行

如果一个事件处理程序正在执行一项大型计算,则所有触发的事件都必须等待该计算完成。
试试这个小提琴:here

【讨论】:

  • 嗯,这些链接会触发每个默认异步的 ajax 请求。只是 JSF 使用async="false" 将它们放入队列中,以确保视图状态的完整性。
  • @BalusC 无论发生什么事件,它都会进入事件队列一次。如果正在执行某些阻塞函数,即使发出异步请求的事件处理程序也必须等待。唯一的区别是异步请求离开事件队列并在响应到达时注册回调。上面的答案说明了同步请求阻塞的情况。如果您认为答案是肯定的,请分享一个链接,上面说可以处理超过 1 个事件同时通过javascript。
  • 来自问题:“它等待每个链接完成运行” 换句话说,下一个 ajax 请求正在等待,直到检索到前一个 ajax 的响应并完成加工。这不是异步请求的默认行为。通常,一旦成功触发了前一个 ajax 请求,就会立即触发下一个 ajax 请求(无需等待其响应,如async="false")。
  • @BalusC 我们给出的上述答案是在同步请求的上下文中。如果您认为它是错误的,您能告诉我们使用同步请求获得所需行为的解决方案吗?
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 2011-03-19
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多