【问题标题】:Richfaces a4j:loadScript clears jQuery plugins on ajax callsRichfaces a4j:loadScript 清除 ajax 调用上的 jQuery 插件
【发布时间】:2011-11-04 16:38:23
【问题描述】:

我正在加载嵌入到 RichFaces 中的 jQuery:

<a4j:loadScript src="resource://jquery.js"/>

接下来,我正在加载 FancyBox jQuery 插件:

<script type="text/javascript" src="/App/fancybox/jquery.fancybox-1.3.4.pack.js"/>

第一次加载页面时插件可以正常工作,但是在执行 ajax 调用之后

<a4j:jsFunction name="myMethod" data="#{myController.jsonDataToReturn}" action="#{myController.doSomething()}" oncomplete="populateData(data);">     
  <a4j:actionparam name="selectedTag" assignTo="#{myController.selectedTag}"/>
</a4j:jsFunction>

插件停止工作。测试表明,a4j:loadScript 标记在每次 ajax 调用时都会重新加载,从而重新加载丢失附加插件的 jQuery 变量。

当前的解决方法是通过在页面某处放置&lt;rich:jQuery query="fn" /&gt; 标记来加载jQuery。它除了强制 jQuery 加载之外什么都不做,但是因为它不使用 a4j,所以 jQuery 不会在 ajax 调用时重新加载。

不过,有没有一个干净的解决方案?我正在使用包含 jQuery 1.3.2 的 RichFaces 3.3.3。

更新

FancyBox 已加载:

jQuery(document).ready( function(){
    jQuery('.fancyboxLink').live('click',aclick);
});

function aclick(){
    jQuery.fancybox({
        href: '#{facesContext.externalContext.requestContextPath}/webpage.xhtml',
            type:'iframe',
            width:710,
            height:510,
            padding:0,
            margin:0,
            hideOnOverlayClick:false,
            overlayColor:'#000'
    });
    return false;
}

在第一次 ajax 调用之后,jQuery 不再包含 fancybox。

【问题讨论】:

  • 显示你对元素的fancybox调用

标签: javascript jquery ajax richfaces ajax4jsf


【解决方案1】:

首先需要在每个 ajax 请求上加载脚本,为此使用 a4j:loadScript

<a4j:loadScript src="/App/fancybox/jquery.fancybox-1.3.4.pack.js"/>

第二:在组件被重新渲染时执行该 fancybox 脚本(ajax 调用重新渲染包含带有 fancybox 的元素的 dom 树的一部分)。我会通过编写一个自定义的 facelets 组件来做到这一点,就像这样。

fancyInput.xhtml:

<ui:component xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:a4j="http://richfaces.org/a4j"
                xmlns:rich="http://richfaces.org/rich"
                xmlns:c="http://java.sun.com/jstl/core">

    <a4j:loadScript src="resource:///App/fancybox/jquery.fancybox-1.3.4.pack.js"/>

    <!-- id is passed by component's client as facelet param. -->
    <h:commandButton id="#{id}" otherParameters="....."/>
    <script type="text/javascript">
        jQuery(function() {
            // Attaching fancybox to rendered component.
            jQuery($('#{rich:clientId(id)}')).live('click',aclick);
        });
    </script>
</ui:component>

您的页面:

<ui:include src="fancyInput.xhtml">
    <ui:param name="id" value="anId"/>
    <ui:param name="otherParams" value="..."/>
</ui:include>

【讨论】:

  • 我们这样做了,但是第一次打开页面时,fancybox 只会附加到 jQuery。顺便说一句,您的a4j:loadScript 标签只使用了一次resource:///,这是故意的吗?另外,fancybox .js 是否应该在 jar 中(用作资源)?
  • 我不明白你的评论。我已经用更多细节澄清了我的例子。这个想法是你需要一个单独的组件,它可以独立地重新渲染/初始化。组件的 facelet 指定所有需要的资源(使用 a4j:loadScript),并完全初始化自己。
猜你喜欢
  • 2011-12-30
  • 2012-08-05
  • 2012-04-13
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2015-09-15
相关资源
最近更新 更多