мне нужно, чтобы jquery срабатывал, когда средство выбора людей возвращает значение в основную форму из всплывающего окна просмотра

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

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


person Anthony    schedule 07.09.2011    source источник
comment
Очень полезный вопрос, спасибо, сэр :)   -  person Mahmoud Farahat    schedule 12.11.2012


Ответы (5)


Вы не указали версию 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);

Аргумент «результат» метода 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">[email protected]</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.

Вот и все!

person Athens Holloway    schedule 18.12.2011
comment
Я не заявлял об этом явно, но подписка на событие изменения текстовой области средства выбора людей в jQuery не будет работать из-за асинхронного характера встроенного решения. Вместо этого внедрение пользовательской логики в соответствии с моей рекомендацией является более надежным решением. - person Athens Holloway; 18.12.2011
comment
Очень полезно, я даже написал сообщение о переопределении метода обратного вызова EntityEditorCallback здесь -client-side-sharepoint-2010/" rel="nofollow noreferrer">vgrem.wordpress.com/2013/03/27/ - person Vadim Gremyachev; 28.03.2013
comment
Хм? Престижность за знание, но ваша запись очень сбивает с толку. Должен ли он использовать $('a[title="Check Names"]').click() или использовать какой-то API в invokeAfterEntityEditorCallback()? Первый более прямолинеен, если все, что ему нужно, это разрешить имя. Предоставление всего фона без надлежащего контекста просто излишне мутит воду, особенно потому, что я не вижу варианта использования этого API/XML. Значение в средстве выбора людей можно проверить как измененное с помощью $('div[title="People Picker"]').html() == x, где x было тем, что было раньше, чтобы он мог знать, разрешено ли имя или нет. - person vapcguy; 05.12.2014
comment
Я по-прежнему считаю, что предыстории достаточно, если вы хотите понять компоненты в игре. Я предположил, что моя целевая аудитория не хочет копировать и вставлять код из Интернета и надеется, что он сработает. Мне также было ясно, когда я заявил, что вы не можете обработать событие jquery click, потому что есть асинхронный HTTP-вызов на сервер, который вы не сможете перехватить. Чтобы избежать состояния гонки, я предоставил более надежное решение. Все, что вам нужно сделать, это скрыть/переопределить реализацию по умолчанию invokeAfterEntityEditorCallback и вызвать ее с помощью пользовательского обратного вызова в document.ready. - person Athens Holloway; 05.12.2014
comment
Обработка события click и тестирование HTML-кода div не учитывают асинхронное поведение или состояние гонки. Когда вы собираетесь проверить значение div? Задержка сети, нагрузка на сервер и т. д. влияют на то, как долго вам придется ждать, прежде чем вы сможете проверить значение в div. Это довольно существенно, не так ли? - person Athens Holloway; 05.12.2014

Я использовал ответ от Афин Холлоуэй выше, с парой изменений. Мой вариант использования заключался в исключении определенного пользователя из средства выбора людей. Вы можете исключить пользователя из средства выбора людей, используя пути каталога учетных записей службы выбора людей на центральном сервере администрирования, но по разным причинам, связанным с контролем изменений, для нас это не вариант. Добавление 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>
person Sharepoint Rani    schedule 08.08.2012

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

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

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

person Tae-Sung Shin    schedule 07.09.2011
comment
.live() устарел, начиная с jQuery 1.7, и поэтому не рекомендуется -- api.jquery.com/live -- вместо этого используйте .on() или, возможно, .delegate() . - person vapcguy; 05.12.2014

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

$("textarea[title='Primary Owner People Picker']").on('change', function ()
{
    alert('here');
});
person vapcguy    schedule 05.12.2014
comment
Это то же самое решение, которое, по словам ОП, не сработало. Я что-то пропустил? - person Athens Holloway; 06.12.2014
comment
Он сказал, что использование .change(function() { ... }) не работает, но использование .on немного отличается: jsperf.com/document-on-click-vs-element-click/2. В основном я хотел привлечь внимание к сообщению о .live(), что это был новый способ написать это: weblog.west-wind.com/posts/2013/Jun/12/ . И для захвата значения при изменении поля этот ответ при добавлении чего-то вроде var name = $(this).val() отлично работал для меня, поэтому я не совсем уверен, что нужно OP. - person vapcguy; 01.01.2015

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

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
    }
}
person CodeMonkey    schedule 28.06.2016