Мне нужен jQuery, чтобы стрелять, когда People Picker возвращает ценность в основную форму из окна Prowse Pop Up
-
27-10-2019 - |
Вопрос
Кто -нибудь пытался попытаться уволить событие смены 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
}
}