6

当人员选择器从弹出浏览窗口将值返回到主窗体时,是否有人尝试触发 jquery 更改事件?我在 jquery 语句中尝试了几个标签,但似乎没有任何效果。(SP 2010)

<wssawc:PeopleEditor AllowEmpty="false" AcceptAnyEmailAddresses="true" ValidateResolvedEntity="true"
ShowButtons="true" ShowDataValidationErrorBorder="true" ShowEntityDisplayTextInTextBox="true"
ShowErrorPlaceHolder="true" ValidatorEnabled="true" MultiSelect="false" ID="primaryOwnerPicker"
runat="server" SelectionSet="User" Width="12em" AllowTypeIn="false" DoPostBackOnResolve="false"
EnableBrowse="true" ForceClaims="true" Title="Primary Owner People Picker" />

我试过了

$("textarea[title='Primary Owner People Picker']").change(function ()
{
    alert("here");
});

任何帮助将不胜感激...

4

5 回答 5

14

您没有指定 SharePoint 的版本,但以下说明适用于 SharePoint 2007,并且在 2010 年未得到确认。

可以通过单击“检查姓名”图标或“浏览”图标来设置人员选择器的值。

如果单击作为锚标记的“检查名称”图标,onclick 事件将调用“WebForm_DoCallback”,它将异步向 SharePoint 服务器发出 HTTP 请求,以验证输入到人员选取器中的名称。

以下是 WebForm_DoCallback 签名:

function WebForm_DoCallback(eventTarget, 
eventArgument, 
eventCallback, 
context, 
errorCallback, 
useAsync){
...
}

您最感兴趣的 WebForm_DoCallbacks 参数之一是“eventTarget”,即人员选择器文本区域。您还将对“eventCallback”感兴趣,因为它是异步 HTTP 请求返回后调用的回调方法。在这种情况下,它是在核心 js 中定义的 'EntityEditorHandleCheckNameResult(result, ctx)'。

以下是 EntityEditorHandleCheckNameResult 函数的定义

function EntityEditorHandleCheckNameResult(result, ctx)
{
   EntityEditorClearWaitCursor(ctx);
   EntityEditorCallback(result, ctx);
} 

请注意,它将事件处理委托给 EntityEditorCallback 方法。如果您单击“浏览”图标,也会出现这种情况,该图标会打开一个对话框供您查找和选择用户。“浏览”图标显然利用了不同的调用堆栈,但由于它们都依赖于 EntityEditorCallback,因此我将重点介绍此方法,因为当您单击“检查名称”或“浏览”时解决方案有效。

要在调用 EntityEditorCallback 后执行您的代码,您可以利用以下代码:

var invokeAfterEntityEditorCallback =  function(func) {
    var old__EntityEditorCallback = EntityEditorCallback;
    if (typeof EntityEditorCallback != 'function') {
        EntityEditorCallback = func;
    } else {
        EntityEditorCallback = function(result, ctx) {
            old__EntityEditorCallback(result, ctx);
        func(result, ctx);
        }
    }
};

以下是一个自定义人员选择器事件处理程序,它会提醒结果和人员选择器文本区域的 ID:

function onPeoplePickerFieldSet(result, ctx){
    alert(result);
    alert(ctx); 
}

以下是允许在从浏览对话框中检查或选择人员选取器名称后调用 onPeoplePickerFieldSet 方法的逻辑。此外,如果您使用 jQuery,则可以在 document.ready 事件处理程序中调用此语句。

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

onPeoplePickerFieldSet 方法的“结果”参数是一个 XML 结果,指示成功验证以及域限定用户名。以下 XML 是单击“检查名称”图标产生的示例:

<Entities Append="False" Error="" Separator=";" MaxHeight="3">
   <Entity Key="HOLLOWAY\csteel" DisplayText="Craig Steel" IsResolved="True" Description="HOLLOWAY\csteel">
      <ExtraData>
         <ArrayOfDictionaryEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <DictionaryEntry>
               <Key xsi:type="xsd:string">DisplayName</Key>
               <Value xsi:type="xsd:string">Craig Steel</Value>
            </DictionaryEntry>
            <DictionaryEntry>
               <Key xsi:type="xsd:string">Email</Key>
               <Value xsi:type="xsd:string">csteel@holloway.net</Value>
            </DictionaryEntry>
            <DictionaryEntry>
               <Key xsi:type="xsd:string">SPUserID</Key>
                <Value xsi:type="xsd:string">16</Value>
            </DictionaryEntry>
            <DictionaryEntry>
               <Key xsi:type="xsd:string">PrincipalType</Key>
               <Value xsi:type="xsd:string">User</Value>
            </DictionaryEntry>
         </ArrayOfDictionaryEntry>
      </ExtraData>
      <MultipleMatches />
   </Entity>
</Entities>

'ctx' 参数是人物选择器文本区域的 ID,可以在 jQuery 选择器语句中使用。

就是这样!

于 2011-12-18T16:29:33.027 回答
1

我使用了上面雅典霍洛威的答案,并进行了一些调整。我的用例是从人员选择器中排除特定用户。您可以使用中央管理服务器上的 peoplepicker serviceaccountdirectorypaths 将用户从人员选择器中排除,但由于各种更改控制原因,这不是我们的选择。将 Javascript 添加到一个特定站点可以让我们在不影响整个站点集的情况下完成工作。

这是从人员选择器中排除单个用户的完整脚本:

  var peoplePickerCtx;

  var invokeAfterEntityEditorCallback =  function(func) {
    var old__EntityEditorCallback = EntityEditorCallback;
    if (typeof EntityEditorCallback != 'function') {
        EntityEditorCallback = func;
    } else {
        EntityEditorCallback = function(result, ctx) {
            old__EntityEditorCallback(result, ctx);
        func(result, ctx);
        }
    }
};

function onPeoplePickerFieldSet(result, ctx){
    // gets the long ID string of the people-picker control when the user touches the control
    if (result != undefined) {
      var checkThis = result.toString();
      peoplePickerCtx = ctx.toString();
    }
}

function userMessage (checkThis)
{
    if (checkThis.indexOf("USERNAME TO EXCLUDE GOES HERE") !=-1) 
    {
      alert ('That account is not valid YOUR ERROR MESSAGE GOES HERE')
      return false;
    }
    return true;
}

  function PreSaveAction() {
    // this is a standard function - give it this name and it runs pre-save
    var returnMe = false;

  // used simple getElementById instead of jQuery because it picks up what is actually in the blank. 
  // jQuery picked up the old value until after the user clicked CheckNames button
    var checkThis= document.getElementById(peoplePickerCtx+"_upLevelDiv").innerText.toLowerCase()
    if (checkThis!=undefined) 
    {
        returnMe = userMessage (checkThis)
    }

   return returnMe ;
  }; 


invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);


</script>
于 2012-08-08T15:30:20.167 回答
0

试试这个:

$("textarea[title='Primary Owner People Picker']").live(function ()
{
    alert("here");
});

如果您可以发布完整的 html/js 代码,这将有助于理解您的问题。

于 2011-09-07T01:47:32.160 回答
0

这个怎么样:

$("textarea[title='Primary Owner People Picker']").on('change', function ()
{
    alert('here');
});
于 2014-12-05T04:02:53.043 回答
0

雅典的回答对我来说就像一个魅力。由于验证有时会引发错误(例如一个名称的多个匹配项),我不想让我的代码运行,直到验证没有返回错误。不幸的是,这要求用户在从返回的多个名称中选择正确的名称后再次单击验证按钮。这只是我用来解析结果的一些附加代码:

function onPeoplePickerFieldSet(result, ctx){
    xmlDoc = $.parseXML(result);
    $xml = $(xmlDoc)
    if($xml.find("Entities").attr("Error") == "")
    {
        getUserData($xml.find("Entity").attr("Key")); //this is the username
    }
}
于 2016-06-28T21:21:58.243 回答