ExtendedRenderKitService未在无模式弹出对话框中应用javascript scrollTop

时间:2014-01-14 21:06:44

标签: javascript jquery oracle-adf scrolltop

我有一个从 af:commandLink actionListener 调用的方法:

public static void invokeFunction(String function) {
    ExtendedRenderKitService service =
        Service.getRenderKitService(FacesContext.getCurrentInstance(),
            ExtendedRenderKitService.class);
    String invokeFn =  function;
    service.addScript(FacesContext.getCurrentInstance(), invokeFn);        
}

调用以下j / s函数:

function scrollTopInit(posvals) {
    var list = posvals.split(",");
    window.console && console.log("found # ul " +  $(".af_selectManyListbox_options").length);
    $(".af_selectManyListbox_options").each ( function( i, el ) {
        window.console && console.log("ul has " + $(el).children().length);
        var pos = list[ i ];
        if (pos) {
            window.console && console.log("i = " + i + " pos = " + pos);
            $(el).scrollTop(pos);
        }
    });
}

意图定位由af创建的有序列表:selectManyListbox使得 最上面的选中值将显示在顶部。通过firebug进行的所有记录和调试都表明了 这是有效的,但所有列表都保持原样。

然而,如果我在firebug控制台窗口中尝试以下表达式,它会移动所有已订购的字符 根据需要列出:

$(".af_selectManyListbox_options").each(function(i,el){if(i==0){console.log(i);   $(el).scrollTop(100);}});

我正在使用jQuery 1.9.1而没有问题通过ExtendedRenderKitService进行其他bean驱动的j / s客户端操作,例如完美滚动条没有问题。

scrollTop阻止这项工作的问题是什么?

注意:从弹出窗口的popupfetchlistener调用相同的函数(从commandLink调用)没有任何区别。

2 个答案:

答案 0 :(得分:1)

所以我刚刚确定的解决方案就是确保我所有的行动 如上所述发生 AFTER 除非弹出窗口可见,否则呈现弹出窗口 无论您尝试将其设置为什么,scrollTop将始终返回0。

如何在弹出窗口后确保出现这种情况?简单。在弹出标签中确保你 同时拥有clientlistener和serverlistener。有方法调用的方法 clientlistener触发一个自定义事件,该事件调用serverlistener然后调用
后端调用extendedrenderkit通过jQuery调整scrolTop。

所以在片段中弹出:

  <af:serverListener type="scrollPosEvent" method="#{viewScope.configBean.scrollTopSet}"/>               
  <af:clientListener method="settingsClick" type="popupOpened" />               
</af:popup>

所以settingsClick会触发scrollPosEvent():

settingsClick = function(event) {
  var tab = event.getSource();
  AdfCustomEvent.queue(tab, "scrollPosEvent");
}

哪个customevent触发serverlistener然后触发scrollTopSet()方法

public void scrollTopSet(ClientEvent clientEvent) {
  clientEvent.getComponent();
  SmartViewUtils.invokeFunction("scrollTopInit('" + scrollParms + "');"); 
}

答案 1 :(得分:0)

如果您添加了以下代码

function scrollTopInit(posvals) {
var list = posvals.split(",");
window.console && console.log("found # ul " +  $(".af_selectManyListbox_options").length);
$(".af_selectManyListbox_options").each ( function( i, el ) {
    window.console && console.log("ul has " + $(el).children().length);
    var pos = list[ i ];
    if (pos) {
        window.console && console.log("i = " + i + " pos = " + pos);
        $(el).scrollTop(pos);
    }
});

}

作为 function 参数,这意味着您创建了一个函数,而不是调用它,之后应该通过调用

来调用它
scrollTopInit(...)