【问题标题】:a4j:support event onkeyup not working with right click copy and pastea4j:支持事件 onkeyup 无法使用右键单击复制和粘贴
【发布时间】:2011-06-20 18:36:18
【问题描述】:

我已尝试查找可在a4j:support 事件属性中使用的所有可能事件的列表。我找不到任何列出它们的参考资料,也许有人可以提供链接? 我知道onclickonchange 等显而易见的问题。

我问这个的原因是我目前有一个输入文本字段。它通过a4j:support 标签附加了onkeyup 事件。它应该在事件触发时启用一个文本框。 当用户右键单击鼠标并将内容粘贴到字段中时,该事件不会触发。 我可以使用其他事件来确保管理此案例吗?

<h:inputText id="someName" value="#{myBean.example.exampleName}" maxlength="25" style="width:280px">
    <a4j:support event="onchange" reRender="exampleTab" 
        action="#{myBean.activateTabPanel}" ajaxSingle="true" 
        ignoreDupResponses="true" />
</h:inputText>

<rich:tabPanel id="exampleTab" switchType="server"
    style="width:100%;height:448px;" styleClass="top_tab"
    inactiveTabClass="inactive_tab" activeTabClass="active_tab"
    selectedTab="#{myBean.exampleTabState.selectedTab}">
    <!-- Various stuff in here --->
</rich>

## ************ 更新 ***********##
我实际上最终选择了一个 jQuery 解决方案。干净多了。为任何感兴趣的人附上代码。
jQuery(document).ready(function() {
    
    // Call contructor
    var common = new Site.Common();
    
});


// Constructor
Site.Common = function() {
    
    // Only attach event listener if the element exists on page
    if ( jQuery('input[id$="suggest"]') ) {
        jQuery('input[id$="suggest"]').bind('paste', Site.Common.handleMousePaste.bind(this));
    }

};


// Trigger the keyup event when user uses mouse to paste content info a field('element')
Site.Common.handleMousePaste = function(event) {
        
    // Need to split the id (JSF adds the form name in front of the input field!)
    var idParts = event.target.id.split(':');
    
    // Reformat the id we will pass to jQuery (It does not understand formName:fieldName, need to escape the ':')
    if (idParts.length >= 2) {
        var formattedID = "#" + idParts[0] + "\\:" + idParts[1];
    }
    else {
        var formattedID = "#" + event.target.id;
    }
    
    // Need to put a tiny delay in so the element has time to get the pasted in content.
    setTimeout(function() { jQuery(formattedID).keyup(); }, 10);

};

谢谢

【问题讨论】:

    标签: javascript jsf dom-events richfaces


    【解决方案1】:

    你可以在js中检测到粘贴事件,然后激活你的函数。

    附上一个处理类似问题的链接

    link

    在其中更改检测到粘贴后发生的情况

    if (event.ctrlKey && event.keyCode == 86) //Paste event
       call your function
    

    【讨论】:

    • 这是实现这个Aba的唯一方法吗? (理想情况下我想避免编写自定义 js 代码)。
    • @Mcloving 你也可以检测mouseEvents quirksmode.org/js/events_mouse.html>。它依赖于有关页面行为的业务约束。也许你应该使用“onblur”而不是“onchange”?
    • 是的,我的面板需要在用户在输入文本框中输入内容时启用。我认为 onchange 是正确的选择。我是否正确地说 onchange 应该在输入框中输入或删除任何新文本时触发?如果是这种情况,为什么要等到我从输入框离开?
    • @Mcloving .On IE onchange 仅在您离开现场后触发。它可能适用于Firefox。如果您想检查更改,那么 onkeyup 可能是一个不错的解决方案。
    • 它目前正在使用 onKeyUp :) 问题是通过鼠标右键单击粘贴文本时不会触发。在查看了所有可能的事件之后,我认为没有一个可以处理这种情况?我认为 e.keycode 是唯一的选择?
    【解决方案2】:

    当单击鼠标(粘贴、单击等)时,键盘事件不会起作用。 据我了解,您正在搜索 OnChange 事件,但 OnChange 对您不利,因为 您需要该事件将在输入文本获得的任何输入中触发。

    解决方案是使用新的 HTML5 OnInput 事件。 OnInput 事件在任何输入中触发,例如过去使用 鼠标、打字、使用键盘粘贴等。

    它还支持所有新的浏览器,我在 IE9、IE10、IE11、Chrome、Firefox、Safari 和 Opera 上进行了测试。

    【讨论】:

      【解决方案3】:

      event 属性的可能值列表不固定,如documentation 中所述:

      父组件

      JavaScript 事件属性(onclick、onchange 等)的名称,我们将为其构建 AJAX 提交代码

      所以基本上,这意味着您可以在event 属性中设置父组件上可用的任何onXXX 事件。


      关于您的问题,您最终可以使用&lt;a4j:support event="onchange"&gt; 复制您的&lt;a4j:support event="onkeyup"&gt;

      请注意,如果您的请求只是启用文本框,也许您可​​以使用 JavaScript 来实现,而不是使用 Ajax 调用(即使用 &lt;a4j:support&gt;)。

      【讨论】:

      • 谢谢 romaintaz。我的请求实际上是更改一个 beacking bean 值,然后启用 Richfaces tabPanel。使用“onchange”事件似乎没有像我预期的那样工作。它仅在我离开输入框时触发,而不是在我对输入框进行添加/删除时触发。有任何想法吗?我将用一些代码编辑原始问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多