2

我正在使用 SharePoint 2007。我在 layouts 文件夹中有一个自定义 aspx 页面,其中包含一个人员选取器 ( PeopleEditor) 控件。

用户可以n在控件中输入用户数。我想使用javascript从人员选择器控件中检索用户的电子邮件,有人可以帮忙吗?

4

1 回答 1

5

一般的

人员字段非常复杂,但我会尽我所能解释在更新我的库 ( SPUtility.js ) 时与他们一起工作的结果。你可以看看SPUserField库中的类来看看。我主要使用 Firebug + Firefox 对该领域进行逆向工程。不幸的是,根据使用的浏览器,该字段的生成方式不同。

  • 在 Firefox 中,会显示一个常规的旧textarea版本。
  • 在 IE 中,似乎使用了内容可编辑的 div。

首先,组成字段的控件列表:

  • upLevelDiv - downlevelTextBox 的内容可编辑 div
  • downlevelTextBox - 文本区域
  • hiddenSpanData - 存储一些数据的文本框
  • checkNames - 用户单击 ImageButton 以通过 AJAX 验证输入的名称

实际上还有几个控件,但我没有发现它们有用(HiddenEntityKey、HiddenEntityDisplayText)。

获取控件

我不确定 HTML 在 ASPX 页面中是如何工作的,但在常规 SharePoint 表单中,有一个<span class="ms-usereditor">. 所有其他控件似乎都包含在此跨度中。这使得获得其他控件相对容易:

var controls = this.Controls.select('span.ms-usereditor');
if (null !== controls && 1 === controls.length) {
    this.spanUserField = controls[0];
    this.upLevelDiv = $(this.spanUserField.id + '_upLevelDiv');
    this.textareaDownLevelTextBox = $(this.spanUserField.id + '_downlevelTextBox');
    this.linkCheckNames = $(this.spanUserField.id + '_checkNames');
    this.txtHiddenSpanData = $(this.spanUserField.id + '_hiddenSpanData');
}

设置字段

为了理解,我还包括设置字段的详细信息。

if (Prototype.Browser.IE) {
    this.upLevelDiv.innerHTML = value;
    this.txtHiddenSpanData.setValue(value);
    this.linkCheckNames.click();
}
else { // FireFox (maybe others?)
    this.textareaDownLevelTextBox.setValue(value);
    this.linkCheckNames.onclick();
}

获取字段值

单击 Check Names 按钮并执行 AJAX 后,您的控件应该会填充新信息。upLevelDiv 似乎包含其中的大部分,但 hiddenSpanData 也包含一些。

执行后,upLevelDiv(或 hiddenSpanData)可能包含如下内容:

<SPAN class=ms-entity-resolved id=spanDOMAIN\account12345 title=DOMAIN\account12345 contentEditable=false tabIndex=-1>
<DIV id=divEntityData style="DISPLAY: none" description="DOMAIN\account12345" isresolved="True" displaytext="LastName, FirstName" key="DOMAIN\account12345">
<DIV data='<ArrayOfDictionaryEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><DictionaryEntry><Key xsi:type="xsd:string">SPUserID</Key><Value xsi:type="xsd:string">2</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Email</Key><Value xsi:type="xsd:string">email@address.com</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">DisplayName</Key><Value xsi:type="xsd:string">LastName, FirstName</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Department</Key><Value xsi:type="xsd:string">My Department Name</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">SIPAddress</Key><Value xsi:type="xsd:string">sip@address.com</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">PrincipalType</Key><Value xsi:type="xsd:string">User</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Title</Key><Value xsi:type="xsd:string">My Job Title</Value></DictionaryEntry></ArrayOfDictionaryEntry>'></DIV></DIV><SPAN oncontextmenu=onContextMenuSpnRw(); onmousedown=onMouseDownRw(); id=content contentEditable=true tabIndex=-1>LastName, FirstName</SPAN></SPAN>

然后,您需要做的就是解析出ArrayOfDictionaryEntryXML 对象来阅读他们的电子邮件。

于 2010-11-11T20:16:11.300 回答