javascript - 使用 Sharepoint 查询字符串值作为应用程序部分属性

标签 javascript sharepoint sharepoint-2013

我正在构建一个 Sharepoint 2013 应用程序部件,该部件应该显示有关特定人员的信息。人员 GUID 将通过 Sharepoint 页面 URL 中的查询字符串提供,并且该查询字符串(键/值)需要以某种方式传递到所有 iFrame/应用程序部分。

起初我希望我可以使用应用程序部分的 Element.xml 文件中的自定义属性将查询字符串发送到 iFrame(我期望 Sharepoint 足够聪明,它有一个 datatype=querystirng ,它从 SP URL 中获取查询字符串并将其插入应用程序部分)。但 Elements.xml 中的属性似乎是静态的,只能在编辑 SP 页面时在“编辑 Web 部件”菜单中定义。

我尝试使用 Javascript 将查询字符串注入(inject) Sharepoint 页面中包含的所有 iframe(遵循本指南,并进行一些修改: http://prasantabarik.wordpress.com/2013/09/26/pass-querystring-value-from-sharepoint-page-to-app-partclient-web-part/ )。 IE。我循环遍历了所有 iframe,并更改了 iframe.src(也尝试了 iframe.setAttribute(src, newSrc))以包含 javascript 从 windows.location.search 抓取的查询字符串。这似乎在 80% 的情况下有效,应用程序部分的页面成功加载,查询字符串传递到所有应用程序部分。但是,另外 20% 的情况下,iframe.src 设置正确,但浏览器未重新加载(显示不带查询字符串的初始应用程序部分页面)。这似乎是我的 Chrome v.31 浏览器中的问题。在 IE 中每次都能成功运行。

以下是我的 Sharepoint 托管 Javascript 的代码片段(包含在 Sharepoint 主模板的底部):

var sharepointQueryKeyValuePairs = {};
window.location.search.substr(1).split("&").forEach(function (pair) {
    if (pair === "") return;
    var parts = pair.split("=");
    sharepointQueryKeyValuePairs[parts[0]] = parts[1];
});

var arrFrames = document.getElementsByTagName("iframe");
for (var i = 0; i < arrFrames.length; i++) {
    var iFrame = arrFrames[i];
    var clientID = encodeURIComponent("displayMode=spRedirect");
    if (iFrame.src.indexOf(clientID) != -1) {
        var querystring = encodeURIComponent("displayMode=sp");
        var newIframeSrc = iFrame.src.replace(clientID, querystring);

        var sharepointQueryKeyValuePairsCopy = {};
        $.extend(sharepointQueryKeyValuePairsCopy, sharepointQueryKeyValuePairs);

        newIframeSrc.split(encodeURIComponent('?'))[1].split(encodeURIComponent("&")).forEach(function (pair) {
            if (pair === "") return;
            var parts = pair.split(encodeURIComponent("="));

            if (sharepointQueryKeyValuePairs.hasOwnProperty(parts[0])) {
            newIframeSrc = newIframeSrc.replace(encodeURIComponent(parts[0] + "=" + parts[1]), encodeURIComponent(parts[0] + "=" + sharepointQueryKeyValuePairs[parts[0]]));
            delete sharepointQueryKeyValuePairsCopy[parts[0]];
        }
    });

     //todo: loop through sharepointQueryKeyValuePairsCopy and inject the rest of the querystring values

    iFrame.setAttribute('src', newIframeSrc);
    //also tried iFrame.src = newIframeSrc;
}
}

有人对这如何运作有任何想法吗?最好有一个更简洁的解决方案的建议。我不喜欢 JavaScript 解决方案,应该有另一种更优雅的方式将 SP 查询字符串传递到应用程序部件!

之前在这里提出的问题(https://sharepoint.stackexchange.com/questions/72189/use-query-string-value-as-app-part-property-2013)没有任何答案,所以我试试运气。

最佳答案

您使用的是 Chrome 30.x 还是 31.x?因为在 Chrome University of Wisconsin, dated November 23rd 2013 这两个版本中刷新 iframe 似乎存在问题.

关于javascript - 使用 Sharepoint 查询字符串值作为应用程序部分属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20656485/

相关文章:

javascript - SharePoint 2013 在整个页面加载后添加 JavaScript

javascript - 如何检测是否选择了一个div?

linq - 将 linq 与 Sharepoint 一起使用并处理对象

email - 为站点提要中的新帖子生成电子邮件提醒

jquery - 为什么在调用 JSOMexecuteQueryAsync 时我的 jQuery Promises 被忽略?

sharepoint - 检查文件名的一个小问题(Powershell)

javascript - 将 onclick 打开超链接事件添加到在 R 中创建的 html 小部件

javascript - Ember.js 有很多关系在渲染前未解析

javascript - 使用 JQuery 和 Flask 的动态下拉不起作用

sharepoint - 如何在 Sharepoint 列表字段中使用计算的起息日期来查找日期+30 天?