首页 > 解决方案 > 如何使用 autoSuggestBehavior 使用鼠标进行复制和粘贴

问题描述

我正在实现一个正在使用的功能,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>

试试No.1

我试图创建<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}",它也没有得到那个事件。

我发现原因可能是当我右键单击并选择粘贴选项时,鼠标已经超出了输入组件,这使得这些代码不起作用。

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

标签: oracle-adf

解决方案


我从我的一个朋友那里得到了答案,它运作良好,我想分享。

基本上,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)
            }
        });
    }

};
}

推荐阅读