如何使用鼠标复制和粘贴 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)
}
});
}
};
}
我正在实现一个使用 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)
}
});
}
};
}