未捕获的TypeError:无法使用延迟处理程序读取null的属性“action”

时间:2012-12-25 12:44:19

标签: javascript jsf richfaces

我有以下问题:

这是我的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的属性操作。

任何人都知道如何解决这个问题?

1 个答案:

答案 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()"/>