0

次の問題があります:

これは私の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

誰でもこれを解決する方法を知っていますか?

4

1 に答える 1

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()"/>
于 2012-12-25T13:58:45.140 に答える