我有以下问题:
这是我的xhtml部分。
<h:panelGroup id="#{id}suggestionPanel" rendered="#{rendered}">
<a4j:jsFunction name="autocompleteHandler"
action="#{autocompleteBean.prepareAction(suggestionAction)}">
<a4j:actionparam name="param1" assignTo="#{searchString}"/>
</a4j:jsFunction>
...
<h:inputText value="#{searchString}"
rendered="#{validationId == null}"
id="#{id}search"
onkeyup="delayedHandler(300, this)"/>
这里给出了处理此问题的javascript方法:
var _timer = 0;
function delayedHandler(ms, thisElement)
{
if (_timer) window.clearTimeout(_timer);
_timer = window.setTimeout(function()
{
autocompleteHanlder(thisElement.value)
}, ms);
}
那么我有什么问题?
执行此代码时出现此错误:
Uncaught TypeError: Cannot read property 'action' of null framework.pack.js.xhtml:2791
A4J.Query framework.pack.js.xhtml:2791
A4J.AJAX.PrepareQuery framework.pack.js.xhtml:2562
A4J.AJAX.Submit framework.pack.js.xhtml:2592
autocompleteHandler
关于这个很酷的事情是,如果我的javascript没有像这样的延迟方式调用处理程序
function delayedHandler(ms, thisElement)
{
autocompleteHanlder(thisElement.value);
}
javascript函数的延迟部分没有问题,因为我已经用一些警告对它进行了测试。
以某种方式延迟,它无法读取<a4j:jsFunction
的属性操作。
任何人都知道如何解决这个问题?
答案 0 :(得分:2)
我实际上解决了这个问题。您不需要任何JavaScript调用来延迟执行。 a4j:jsfunction有一个名为'requestDelay'的属性,可以处理所有需要的超时。 所以基本上代码看起来像
<a4j:jsFunction name="autocompleteHandler"
action="#{suggestionTestBean.prepareAction(suggestionAction)}"
requestDelay="1200">
</a4j:jsFunction>
延迟1.2秒,然后你会像这样调用延迟执行:
<h:inputText value="#{searchString}"
rendered="#{validationId == null}"
id="#{id}search"
onkeyup="autocompleteHandler()"/>