3

我有一个我想通过 jQuery 修改的信息路径表单。唯一的问题是它在页面 DOM 加载之后加载,所以 jQuery 的标准$(document).ready(handler);在这里不起作用。我的问题是有什么方法可以拉出$(infopath).ready(handler);某种形式,或者有一种方法可以等待 infopath 表单完成加载,而无需使用标准的setTimeout().

编辑 1:所以您有更多信息,jQuery 位于内容编辑器 Web 部件 (CEWP) 中,Infopath 表单位于 Infopath 表单查看器 Web 部件中。

我知道使用带有 infopath 的 jQuery 或 javascript 不是一种标准做法,不幸的是,由于 infopath 重复选项控件的非理想功能,在这种情况下它是必要的,在这个问题中进一步讨论。

编辑 2:据我所知,我很可能错了,sharepoint 有一个名为 core.js 的 js 文件,这似乎具有通过 AJAX 将信息路径表单加载到页面中的功能。有什么方法可以设置 jQuery 函数在远程 javascript 文件完成执行后执行?

4

7 回答 7

3

有更好的方法,具体取决于您的上下文。我的要求是拦截click我的 InfoPath 表单保存按钮上的处理程序,并执行一些在 InfoPath 中难以执行的附加验证。正如问题所述,无法$()直接使用普通的 jQuery 函数,因为此时尚未加载表单。

有一个解决方法。SharePoint 提供了一个 JavaScript 数组_spBodyOnLoadFunctionNames,并且可以将初始化函数添加到该数组中。通过将函数推送到数组上,它将在 InfoPath 表单加载后被调用:

$(function(){
    if (window.location.pathname.match(/Item\/(new|edit)ifs\.aspx/i)){
        _spBodyOnLoadFunctionNames.push('CustomInfoPathInit');
    }
});

function CustomInfoPathInit(){
    $(document).on('focusin', 'input[value="Save"]', function(event){
        $(this).attr('onclick', null); // remove standard handler
        $(this).off('click').on('click', function(){
            alert('click');
        });
        return (Button.OnClick(this, event)); // original click handler
    });
}

我使用的原因$(document).on('focusin', function(event){...是因为表单中的任何回发(例如,当表单显示Sending data to server...时)将导致表单刷新,并且任何绑定的处理程序都将被删除。使用 jQuery$(document).on('focusin',...)方法可以解决此问题,并且使用focusin事件允许删除按钮的原始单击处理程序并重新附加新的单击处理程序。

于 2013-08-13T01:18:28.237 回答
3

试试这样:在 FormServer.aspx 中,就在 </body> 上方,输入:

<script type="text/javascript">
    _InfoPath.OnLoad2 = function() {
        _InfoPath.OnLoad();
        //Here I will put my custom javascript code, which will be invoked after loading InfoPath form
    }
    window.onload = _InfoPath.OnLoad2;
</script>

我的回答也在这里: 如何检查 InfoPath 表单是否已加载(在 javascript 中)

于 2012-01-24T12:32:13.367 回答
2

我最终使用了一个计时器来检查 InfoPath 表单上的标签是否已显示在 DOM 中:

var InfoPathCheck;

$(document).ready(function(){
    InfoPathCheck = setInterval(function() {  //Wait for InfoPath to finish loading
        HasInfoPathLoaded();
    }, 200);
});

function HasInfoPathLoaded() {
    var testDiv = $('h4 span:contains("Photo")').html();
    if (testDiv) {
        clearInterval(InfoPathCheck);
        // Do stuff with the InfoPath form here....
    }
}
于 2013-10-29T22:02:35.553 回答
0

如果在 infopath(无论它是什么)代码中找到一个钩子失败,您可以自己暴力生成一个事件。编写一个函数,使用 jQuery 以某种方式检查完成条件,并触发事件或重新安排自身在 200 毫秒内再次运行。

然后以通常的方式编写您的事件处理程序。如果您找到更好的方法,您只需要更换第一部分。

于 2011-08-10T15:13:40.890 回答
0

我有一个想法,但没有时间尝试。在 jscript 和 jscript 中检测 XDocument.OnLoad 如何在隐藏输入中放置一个值。然后 javascript 检测到该事件。我认为它可以在 IE 中运行,但在其他浏览器中可能不行。

于 2011-08-10T21:08:20.097 回答
0

我不知道这是否是您的问题,但如果在 $(document).ready 函数之后仍然加载内容,请尝试 $(window).load 函数。在你所有的库、图片、样式和其他东西都完成加载后,这个会触发。

于 2011-08-05T15:44:50.227 回答
0

你看过XDocument.Onload事件吗?

根据 API 文档,这发生在“加载 Microsoft Office InfoPath 2007 表单之后,但在初始化任何视图之前”

此外,请查看这篇关于将处理程序添加到 SharePoint进程的帖子。onLoadonLoad

于 2011-08-09T15:13:24.117 回答