当前位置: 首页>>技术问答>>正文


在JavaScript中,如何获得当前列表项?

webfans 技术问答 , , 去评论

问题描述

有各种各样的ECMAScript类库示例,但我找到的所有示例都显示如何检索所有列表项(通过SP.ClientContent),但是如何获取当前列表项?我试图通过列表显示弹出窗口中的自定义功能区按钮调用一些JavaScript,并将当前项的ID传递给新URL。

最佳解决方法

这些技术很愚蠢。

在每个SharePoint页面上都有一个javascript上下文变量:

 _spPageContextInfo 
{
    webServerRelativeUrl : "/ProjectWeb",
    webLanguage : 1033,
    currentLanguage : 1033,
    webUIVersion : 4,
    pageListId : "{c1d7b89f-f07b-4e2e-b89c-76c315831d59}",
    pageItemId : 5,
    userId : 68,
    alertsEnabled : true,
    siteServerRelativeUrl : "/",
    allowSilverlightPrompt : "True"
} 

所以如果你在/ProjectWeb/Pages/default.aspx上

_spPageContextInfo.pageListId;   // list guid for Pages
_spPageContextInfo.pageItemId;   // ID for listitem

版本页面的示例:

var options = {
    tite: "Versions",
    url: _spPageContextInfo.webServerRelativeUrl + "/_layouts/Versions.aspx?list="+ _spPageContextInfo.pageListId +"&ID="+ _spPageContextInfo.pageItemId,
    width: 800,
    height: 500,
};
SP.UI.ModalDialog.showModalDialog(options);

次佳解决方法

看起来没人真的想出了正确的答案。这里有很多答案,但我最终找到了我想要的东西。

如果我有一系列可供使用的项目,Brage的答案是正确的。为此,您必须在视图上启用项目选择,并让用户选择多个项目。 SP.ListOperation.Selection将返回一个列表项集合,然后您可以在页面上显示或用作下拉列表或其他内容。

Wouter使用查询字符串的答案有效,但它要求您查看页面的查询字符串,并且没有本机Javascript函数来执行此操作,因此您正在解析window.location.href值。虽然我还没有尝试使用模态对话框,但它很难看但很有效。

在对话框中获取当前所选项目的真正答案是使用URL令牌。我在MSDN上找到的唯一一个”official”页面列出了这些页面:

http://msdn.microsoft.com/en-us/library/ms473643(v=office.12).aspx

(这是一个WSS 3.0版本页面)

我在列表的2010文档中找不到任何页面,此页面的2010版本删除了该部分。

其他人在博客上发表过关于它的文章,但有些模糊不清。

在任何情况下,您都可以在Elements.xml文件中使用令牌作为CommandAction或UrlAction的一部分。所以例如在我的情况下我写道:

<CommandUIHandler CommandAction="javascript:viewDialog({ItemId});"/>

哪个会在我包含在解决方案中的JavaScript文件中调用此方法:

function viewDialog(id) {
  var options = {
    url: "/sitename/Lists/ListName/ViewName.aspx?ID=" + id,
    width: 800,
    height: 600,
  };

  SP.UI.ModalDialog.showModalDialog(options);
}

这将创建一个模态对话框,并显示我希望在我传入的项目ID上过滤的特定视图。

感谢大家的意见和建议!

第三种解决方法

当我准确地解决你的问题时,我使用以下代码。

我不喜欢在我的xml中使用js代码,但是没有找到任何好的方法来包含它而不在所有页面上都有它。

此代码触发模式对话框,该对话框以选定的docuemnt和当前列表作为参数打开。它还仅在选择某些项目时启用按钮。

  <?xml version="1.0" encoding="utf-8"?>
        <Elements xmlns="http://schemas.microsoft.com/sharepoint/">
          <CustomAction Id="AddDocument.Script" 
           Location ="ScriptLink" 
            ScriptBlock="function OpenAddDialog() {
            var ctx = SP.ClientContext.get_current();
            var items = SP.ListOperation.Selection.getSelectedItems(ctx);
            var myItems = '';
            var k;

            for (k in items)
            {
              myItems += '|' + items[k].id;
            }

            var options = SP.UI.$create_DialogOptions();
            options.url = '~site/_layouts/myPage.aspx?items='+myItems+ '&amp;source=' + SP.ListOperation.Selection.getSelectedList();
            options.width = 1050;
            options.height = 600;
            //options.dialogReturnValueCallback = Function.createDelegate(null, CloseCallback);
            SP.UI.ModalDialog.showModalDialog(options);
            }

            function enableDisableButton() { 
                return CountDictionary(SP.ListOperation.Selection.getSelectedItems()) > 0; 
             }"/>
          <CustomAction Id="AddDocument" RegistrationType="List"
          RegistrationId="101" Location="CommandUI.Ribbon">
            <CommandUIExtension>
              <CommandUIDefinitions>
                <CommandUIDefinition Location="Ribbon.Documents.New.Controls._children">

                  <Button Id="Ribbon.Documents.New.Controls.AddDocument"
                  Alt="Add selected documents " Sequence="10"
                  Command="AddDocument" LabelText="Add document"
                  TemplateAlias="o2" />
                </CommandUIDefinition>
              </CommandUIDefinitions>
              <CommandUIHandlers>
                <CommandUIHandler Command="AddDocument"
                EnabledScript="javascript:enableDisableButton();"
                CommandAction="javascript:OpenAddDialog();" />
              </CommandUIHandlers>
            </CommandUIExtension>
          </CustomAction>
        </Elements>

第四种方法

这对你来说可能为时已晚,但我遇到了同样的问题,并按如下方式进行:

var ctx = SP.ClientContext.get_current();
var items = SP.ListOperation.Selection.getSelectedItems(ctx);
var i;
var thisID;
var count=CountDictionary(items);// was the key point that was missing from other examples i saw

for (i=0,i<count;i++)
{
  thisID=items[i].id;
  // code that needs thisID
}

第五种方法

对于每个列表表单,所选项目的ID都在查询字符串中,您可以使用脚本检索它。 ID参数用于项目。列表ID的List参数。这应该很方便你。

沃特

第六种方法

正如@Bil所提到的,可以使用Url令牌检索ItemId。但是,我想就此发言不同

Wouter’s answer to use the query string works but it requires you to poke into the query string for the page and there’s no native Javascript function to do that so you’re parsing the window.location.href value.

我在SP 2010和SP 2013中测试了以下两个本机JavaScript函数,它们都能够读取查询字符串值。

GetUrlKeyValue('ID')

JSRequest.EnsureSetup();
JSRequest.QueryString['ID']

此外,SP 2013有一个名为WPQ2FormCtx的对象,它还保存Display /Editform中当前项的ID:

WPQ2FormCtx.ItemAttributes.Id

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2444.html,转载请务必附带本地址声明。