Мне нужен jQuery, чтобы стрелять, когда People Picker возвращает ценность в основную форму из окна Prowse Pop Up

StackOverflow https://stackoverflow.com/questions/7328016

Вопрос

Кто -нибудь пытался попытаться уволить событие смены jQuery, когда люди Picker возвращает ценность в основную форму из всплывающего окна просмотра? Я попробовал несколько тегов в заявлении 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");
});

Любая помощь будет очень оценена ...

Это было полезно?

Решение

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

Значение People Ficker можно установить, нажав значок «Проверки имена» или значок «Просмотр».

Если вы нажмете значок «Проверьте имена», который является якорным тегом, событие OnClick вызывает «webform_docallback», который асинхронно сделает HTTP -запрос на сервер SharePoint для проверки имени, введенного в People Picker.

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

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

Один из аргументов WebForm_docallbacks, который вам больше всего интересует, - это «EventTarget», текстовая область People Picker. Вы также будете заинтересованы в «EventCallback», так как это метод обратного вызова, вызванный после возвращения Async HTTP -запроса. В этом случае это «EntityEditorHandLecheCknamerSult (Result, CTX)», определенная в Core JS.

Ниже приведено определение функции EntityEditorHAndLecheCknamerSult

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);
        }
    }
};

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

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

Ниже приведена логика, которая позволит вызвать метод OnpeoplePickerFieldset после того, как имя People Ficker проверяется или выбрано из диалога Browse. Кроме того, это утверждение может быть вызвано в Document.Ready Event Handler, если вы используете jQuery.

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» - это идентификатор текстовой области Seader Sicker и может использоваться в операторе селектора jQuery.

Вот и все!

Другие советы

Я использовал ответ из Афинского Холлоуэя выше, с парой настройки. Моим вариантом использования было исключение конкретного пользователя из People Picker. Вы можете исключить пользователя из People-Picker, используя PeoplePicker ServiceAccountDirectoryPaths на центральном сервере администратора, но по различным причинам управления изменениями, которые не могли для нас. Добавление JavaScript к одному конкретному сайту, позвольте нам выполнить работу, не влияя на всю коллекцию сайтов.

Это полный скрипт, который исключает одного пользователя из People Picker:

  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>

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

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

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

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

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

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

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
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top