мне нужно JQuery для запуска, когда сборщик людей возвращает значение в главной форме из всплывающего окна просмотра - PullRequest
6 голосов
/ 07 сентября 2011

кто-нибудь пытался запустить событие изменения 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");
});

любая помощь будет принята с благодарностью ...

Ответы [ 5 ]

14 голосов
/ 18 декабря 2011

Вы не указали версию SharePoint, но приведенное ниже объяснение применимо к SharePoint 2007 и не было подтверждено в 2010 году.

Значение сборщика людей можно установить, щелкнув значок «Проверить имена» или значок «Обзор».

Если щелкнуть значок «Проверить имена», который является якорным тегом, событие onclick вызывает «WebForm_DoCallback», который асинхронно отправляет HTTP-запрос на сервер SharePoint для проверки имени, введенного в средство выбора людей.

Ниже приведена подпись WebForm_DoCallback:

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

Одним из аргументов WebForm_DoCallbacks, который вас больше всего заинтересует, является 'eventTarget', текстовая область выбора людей. Вы также будете заинтересованы в 'eventCallback', поскольку это метод обратного вызова, вызываемый после возврата асинхронного HTTP-запроса. В этом случае это 'EntityEditorHandleCheckNameResult (result, ctx)', определенный в ядре js.

Ниже приведено определение функции 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);
        }
    }
};

Ниже приведен пользовательский обработчик события выбора людей, который оповещает о результате и идентификаторе текстовой области средства выбора людей:

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

Ниже приводится логика, позволяющая вызывать метод onPeoplePickerFieldSet после проверки или выбора имени средства выбора людей в диалоговом окне просмотра. Кроме того, этот оператор может быть вызван в обработчике события document.ready, если вы используете jQuery.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

Аргумент 'result' метода 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' является идентификатором текстовой области средства выбора людей и может использоваться в операторе селектора jQuery.

Вот и все!

1 голос
/ 08 августа 2012

Я использовал ответ из Афины Холлоуэй выше, с парой настроек. Мой вариант использования исключал конкретного пользователя из списка людей. Вы можете исключить пользователя из средства выбора людей, используя 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>
0 голосов
/ 29 июня 2016

Ответ Афины сработал для меня как оберег.Поскольку валидация иногда выдает ошибку (например, несколько совпадений с именем), я не хочу запускать свой код, пока валидация не вернет никаких ошибок.К сожалению, для этого требуется, чтобы пользователи снова нажимали кнопку проверки после выбора правильного имени из числа возвращенных.Вот лишь небольшой дополнительный код, который я использовал для анализа результата:

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
    }
}
0 голосов
/ 05 декабря 2014

Как насчет этого:

$("textarea[title='Primary Owner People Picker']").on('change', function ()
{
    alert('here');
});
0 голосов
/ 07 сентября 2011

Попробуйте вместо этого:

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

И было бы полезно понять вашу проблему, если вы можете опубликовать полный html / js-код.

...