重力将jQuery.Load形式化为模式

时间:2013-07-18 作者:orionrush

我有一个gravity表单联系人表单,它驻留在一个页面上,但我想要的是一个站点范围的链接,它将打开该表单,并以动态模式显示它。

一种方法是将表单插入模板端的标记中,这样表单就已经存在于每个页面上了。但这意味着加载了大量的标记和gf脚本,而这些脚本在很大程度上都不需要存在。

因此,我收集了一些js,从页面中获取表单标记并将其插入DOM,加载脚本,然后在twitter引导模式中显示结果。

事物的表示端按预期工作,但js条件逻辑等都没有得到应用。我知道js正在加载,因为Im将每个脚本的状态输入控制台。日志-我得到“200”,没有错误。但脚本似乎看不到表单,或者没有正确实例化。

为了测试js端,我还尝试通过以下方式将资源手动加载到头部:

<?php gravity_form_enqueue_scripts(1, true); ?>
但这也行不通。

下面是我使用的js,有人知道如何让它在表单中激发生命吗?是否有我应该使用的回调<非常感谢-ben

jQuery(document).ready(function(){
// load contact form with ajax
jQuery(".contact_btn").click(function(){
    jQuery.ajaxSetup ({ cache:false });
    var ajax_load = "<img height=\'50px\' width=\'50px\' src=\'/assets/img/medloading.gif\' class=\'tr_spinner\' alt=\'loading...\' style=\'align:center, top:50%\' />";
    var loadUrl = "/contact-3/";
    // load the scripts dynamically
    jQuery.when(
        jQuery.getScript("/plugins/gravityforms/js/gravityforms.js?ver=1.7.6", function(data, textStatus, jqxhr) {console.log(jqxhr.status);}), // console logs to get confirmation that its loaded
        jQuery.getScript("/plugins/gravityforms/js/conditional_logic.js?ver=1.7.6", function(data, textStatus, jqxhr) {console.log(jqxhr.status);}),
        jQuery.getScript("/plugins/gravityforms/js/datepicker.js?ver=1.7.6", function(data, textStatus, jqxhr) {console.log(jqxhr.status);}),
        jQuery.getScript("/plugins/gravityforms/js/jquery.textareaCounter.plugin.js?ver=1.7.6", function(data, textStatus, jqxhr) {console.log(jqxhr.status);}),
        jQuery.getScript("/plugins/gravityforms/js/jquery.maskedinput-1.3.min.js?ver=1.7.6", function(data, textStatus, jqxhr) {console.log(jqxhr.status);})
    ).then(function(){
    // insert the content into the DOM
    jQuery("#contact-form .modal-body").html(ajax_load).load(loadUrl + " .entry-content");
    // load it in the modal
    jQuery("#contact-form").modal({ keyboard: false, show: true, backdrop: true });
    });
    // hijack the <a> link
    return false;
});
});

1 个回复
SO网友:orionrush

我最终收到了开发团队的回复,他们建议iframe是最好的方法:

看起来这是个时间问题。您的表单将在文档加载后加载到DOM,因此这将是一个问题。老实说,考虑到重力形式中JS的复杂性,我不确定您是否能够实现这一点。我会认真考虑改用iframe。

在这个响应返回的过程中,我发现我正在导入的div使用[.load()][1] 缺少原始内容中的所有脚本元素。这是因为,though its not explicitly documented, .load() 去掉所有内联脚本,因此当标记存在时,没有任何激活好处发生。

一种解决方案(有效)是通过查看页面源代码将内联脚本中的内容打包,并将其打包到js文件中,然后通过[jQuery.getScripts()][3] 呼叫除了剥离<script></script> 元素,您可能还希望修改任何路径,使其过于相对,无法缓解迁移问题。

这里的(主要)缺点是,通过自行打包此脚本,它不再从后端获取参数,并且在对表单进行更改时可能会中断。它还加入了一些浏览器检测实例。

由于这些限制,并且没有动态生成这些脚本的方法,iframe才是真正的发展方向。这就是说,毫无疑问,创建一个输出脚本的自定义类是可能的——它在很大程度上需要从form\\u display的内容进行重构。php作为最需要的东西被锁定在私有函数下。到目前为止,我还没有找到任何证据证明有人试图这样做。

结束