【问题标题】:JavaScript click function not triggering JSF action method immediately on IEJavaScript 点击功能不会立即在 IE 上触发 JSF 操作方法
【发布时间】:2019-01-21 05:28:04
【问题描述】:

我已经认识到,当通过 JavaScript 完成点击时,它不会立即在 IE 上触发 action 方法,而是浏览器等待代码完成点击的函数,然后触发 action 方法.

在 Chrome 上,点击完成后会立即触发操作方法。

这是一个示例 xhtml 代码:

<h:form>
    <ace:pushButton id="button1" action="#{someBean.someFunction1}" label="Button1" />
</h:form>
<h:form>
    <ace:pushButton id="button2" action="#{someBean.someFunction2}" label="Button2" />
</h:form>
<h:form>
    <ace:pushButton id="button3" action="#{someBean.someFunction3}" label="Button3" />
</h:form>
<h:form>
    <ace:pushButton id="button4" action="#{someBean.someFunction4}" label="Button4" />
</h:form>

这是一个示例 javaScript 代码:

function setTestButtonsOnclickFunctions() {
    var button1 = document.querySelector('[id*="button1_button"]');
    var button2 = document.querySelector('[id*="button2_button"]');
    var button3 = document.querySelector('[id*="button3_button"]');
    var button4 = document.querySelector('[id*="button4_button"]');

    button1.onclick = function() {
        button2.click();
        var someRandomVariable = 10;
    };

    button2.onclick = function() {
        var someRandomVariable = 10;
    };
    button3.onclick = function() {
        button4.click();
        alert("Button 4 clicked in JavaScript");
        var someRandomVariable = 10;
    };

    button4.onclick = function() {
        var someRandomVariable = 10;
    };
}

(function($) {
    $(document).ready(setTestButtonsOnclickFunctions);
})(jQuery);

注意:

如您所见,button3 onclick 函数中有一个警报。
它在那里是因为我认识到触发警报时会触发操作方法。
但是没有它,action方法会在onclick函数完成后触发。

还有someRandomVariable 表示当代码通过click() 方法时,操作方法不会在IE 上触发,而是在Chrome 上触发。这使得调试变得容易。

为什么有两个按钮是因为它是测试click() 方法的简单方法。

问题:

  1. 为什么action方法没有立即在IE上触发?
  2. 为什么click() 方法在 IE 上不像在 Chrome 上那样触发 action 方法?
  3. 有没有办法在运行click() 方法时立即在IE 上触发action 方法,而不使用警报?

对于最后一个问题,您可能想知道为什么有人甚至想要那个。

嗯,我有一个场景,我想在窗口关闭时运行一个操作方法。
我在 JavaScript 中使用了beforeunload 方法,但由于我上面提到的原因,在 IE 上从未触发过 action 方法。

另一个问题:

有没有办法在 IE 上的 beforeunload 事件中触发操作方法?

【问题讨论】:

  • 该代码不会导致点击的无限循环吗? btn1 呼叫 2 和 btn2 呼叫 1,他们会一直互相呼叫......
  • @epascarello 是的,但奇怪的是它没有。但我会因为你的观点而改变问题。
  • 你添加了beforeunload,它改变了原始问题的动态,因为浏览器会使用 beforeunload 杀死东西,因为它们试图让页面快速卸载。所以不,没有办法保证在卸载页面时会进行调用。
  • @epascarello 它不会改变问题的动态,因为无论是否有beforeunload,它的工作方式都是一样的。
  • @epascarello 我标记了你的评论,因为它可能会误导其他人理解这个问题。

标签: javascript internet-explorer jsf-2 xhtml icefaces


【解决方案1】:

// 试试这个

(function($) {   

setTestButtonsOnclickFunctions()

})(jQuery);

【讨论】:

  • 这个答案只是抛出一个错误。可能是 ';'不见了?而且我认为这不是 IE 行为不同的原因。
  • 所以您准备好删除文档了吗?为什么.... 没有任何意义。
猜你喜欢
  • 2023-03-27
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2022-01-19
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多