如何使用鼠标复制和粘贴 autoSuggestBehavior

How to use autoSuggestBehavior with copy and paste using mouse

我正在实现一个使用 autoSuggestBehavior 的功能,当用户使用键盘输入或使用 Ctrl C、Ctrl V

输入时,它工作正常

但是当用户使用鼠标复制和粘贴时它不起作用。

当前密码为

    <af:inputText id="it1" placeholder="#{viewcontrollerBundle['employees.QuickSearch.tooltip']}" autoSubmit="true"
              valueChangeListener="#{pageFlowScope.employeeQuickSearchBean.onChangeSearchCriteria}"
              binding="#{requestScope.quickSearchInputText}" styleClass="QuickSearchTextBox" maximumLength="100">
        <af:autoSuggestBehavior suggestItems="#{pageFlowScope.employeeQuickSearchBean.getSuggestItems}"/>            
        <af:clientListener method="onQuickSearchFocus" type="focus"/>
        <af:clientListener method="onQuickSearchBlur" type="blur"/>
        <af:clientListener method="onQuickSearchValueChange" type="valueChange"/>
   </af:inputText>

试一试

我试图创建 <af:clientListener> 来触发 <af:serverListener>

    <af:inputText id="it1" placeholder="#{viewcontrollerBundle['employees.QuickSearch.tooltip']}" autoSubmit="true"
              valueChangeListener="#{pageFlowScope.employeeQuickSearchBean.onChangeSearchCriteria}"
              binding="#{requestScope.quickSearchInputText}" styleClass="QuickSearchTextBox" maximumLength="100">
        <af:autoSuggestBehavior suggestItems="#{pageFlowScope.employeeQuickSearchBean.getSuggestItems}"/>
        <af:clientListener method="invokeQuickSearchAutoSuggestion" type="mouseDown"/>
        <af:serverListener type="invokeQuickSearchAutoSuggestionFromBean" method="#{pageFlowScope.employeeQuickSearchBean.getSuggestItems}"/>
        <af:clientListener method="onQuickSearchFocus" type="focus"/>
        <af:clientListener method="onQuickSearchBlur" type="blur"/>
        <af:clientListener method="onQuickSearchValueChange" type="valueChange"/>
   </af:inputText>  

在javascript中,我这样定义方法

function invokeQuickSearchAutoSuggestion(event){
   console.log('call here');
   var inputTextComponent = event.getSource();   
   AdfCustomEvent.queue(inputTextComponent, "invokeQuickSearchAutoSuggestionFromBean",{fvalue:component.getSubmittedValue()}, false);
   event.cancel();
}

在那里,我只是添加了一个打印日志来检查我们是否可以得到右键单击,复制和粘贴事件但是它不起作用。

试试2号

我向 valueChangeListener="#{pageFlowScope.employeeQuickSearchBean.onChangeSearchCriteria}" 添加了一个日志,但它也没有收到该事件。

我发现原因可能是当我右键单击并选择粘贴选项时,鼠标已经在输入组件之外,导致这些代码无法运行。

有人能给我一个解决方案吗?

我从一个朋友那里得到了答案,效果很好,我想分享一下。

基本上,ADF 不支持这个,我们需要覆盖 _fireMouseIn

if (this.constructor._typeName == "AdfAutoSuggestBehavior") {
this._fireMouseIn = function (componentEvent) {

    var component = componentEvent.getSource();
    if (component && component instanceof AdfUIEditableValue) {
        var target = componentEvent.getNativeEventTarget();
        var value = target.getAttribute(AdfAutoSuggestBehavior._ITEM_VALUE_ATTR);
        if (value && value.length > 0) {
            var allItems = AdfDomUtils.getChildElements(target.parentNode);
            for (var j = 0;j < allItems.length;j++) {
                var item = allItems[j];
                this._updateSelectedStyle(item, false)
            }
            this._updateSelectedStyle(target, true)
        }

        //Customize from here
        if (component.registedAutoSuggest) {
            return;
        }
        component.registedAutoSuggest = true;

        var contentNode = AdfDhtmlEditableValuePeer.GetContentNode(component);
        var that = this;
        contentNode.addEventListener('paste', function (event) {
            var page = AdfPage.PAGE;
            if (that._timerId) {
                page.rescheduleTimer(that._timerId, 500)
            }
            else {
                that._timerId = page.scheduleTimer(that, that._autoSuggest, component, 500)
            }
        });
    }

};
}