Мне нужно JQuery для запуска, когда сборщик людей возвращает значение в главной форме из всплывающего окна просмотра
Кто -нибудь пытался запустить событие изменения 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 ответов
Вы не указали версию SharePoint, но приведенное ниже объяснение применимо к SharePoint 2007 и не было подтверждено в 2010 году.
Значение сборщика людей можно установить, щелкнув значок "Проверить имена" или значок "Обзор".
Если щелкнуть значок "Проверить имена", который является тегом привязки, событие onclick вызывает "WebForm_DoCallback", который асинхронно отправляет HTTP-запрос на сервер SharePoint для проверки имени, введенного в средство выбора людей.
Ниже приведена подпись WebForm_DoCallback:
function WebForm_DoCallback(eventTarget,
eventArgument,
eventCallback,
context,
errorCallback,
useAsync){
...
}
Одним из аргументов WebForm_DoCallback s, который вас больше всего заинтересует, является '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.
Это оно!
Я использовал ответ из Афины Холлоуэй выше, с парой настроек. Мой вариант использования исключал конкретного пользователя из подборщика людей. Вы можете исключить пользователя из средства выбора людей, используя 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>
Как насчет этого:
$("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
}
}
Попробуйте это вместо этого:
$("textarea[title='Primary Owner People Picker']").live(function ()
{
alert("here");
});
И было бы полезно понять вашу проблему, если вы можете опубликовать полный код HTML / JS.