ピッカーがブラウズポップアップウィンドウからピッカーがメインフォームに値を返したときに発射するためにjQueryが必要です
-
27-10-2019 - |
質問
ピッカーがポップアップブラウズウィンドウからピッカーがメインフォームに値を返したときに、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");
});
どんな助けも大歓迎です...
解決
SharePointのバージョンを指定しませんでしたが、次の説明はSharePoint 2007に適用され、2010年には確認されていません。
ピッパーピッカーの価値は、「小切手名」アイコンまたは「参照」アイコンをクリックして設定できます。
アンカータグである「名前のチェック名」アイコンをクリックすると、OnClickイベントは「Webform_Docallback」を呼び出します。
以下は、webform_docallbackの署名です。
function WebForm_DoCallback(eventTarget,
eventArgument,
eventCallback,
context,
errorCallback,
useAsync){
...
}
あなたが最も興味を持っているというWebform_docallbacksの議論の1つは、人々のピッカーテキストエリアである「EventTarget」です。また、ASYNC HTTPリクエストの返された後に呼び出されたコールバックメソッドであるため、「EventCallback」にも興味があります。この場合、コアJSで定義されている「EntityEditorhandlechecknameresult(result、ctx)」です。
以下は、EntityEditorhandlechecknameresult関数の定義です
function EntityEditorHandleCheckNameResult(result, ctx)
{
EntityEditorClearWaitCursor(ctx);
EntityEditorCallback(result, ctx);
}
イベントの処理をEntityEditorCallbackメソッドに委任することに注意してください。これは、「参照」アイコンをクリックして、ユーザーを見つけて選択するためのダイアログを開く場合にも当てはまります。 「Browse」アイコンは明らかに異なるコールスタックをレバレッジしますが、どちらも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テキストエリアのIDに警告するカスタムピープルピッカーイベントハンドラーです。
function onPeoplePickerFieldSet(result, ctx){
alert(result);
alert(ctx);
}
以下は、PeoplepickerfieldsetメソッドをPeople Pickerの名前をBrowseダイアログからチェックまたは選択した後に呼び出すことを可能にするロジックです。また、このステートメントは、jqueryを使用している場合は、Document.readyイベントハンドラーに呼び出すことができます。
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」引数は、People Pickerテキスト領域のIDであり、jQueryセレクターステートメントで使用できます。
それでおしまい!
他のヒント
上記のAthens Hollowayからの答えをいくつか微調整しました。私のユースケースは、特定のユーザーをPeople-Pickerから除外していました。中央管理者サーバーのPeople Picker ServiceaCcountDirectoryPathsを使用して、ユーザーをピープルピッカーから除外できますが、さまざまな変更制御上の理由で、それは私たちにとって選択肢ではありませんでした。 1つの特定のサイトにJavaScriptを追加すると、サイトコレクション全体に影響を与えずにジョブを完了させてください。
これは、People Pickerから1人のユーザーを除外する完全なスクリプトです。
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
}
}