2011-09-07 4 views
6

人ピッカーがポップアップブラウズウィンドウからメインフォームに値を返すときにjquery changeイベントを起こそうとした人がいますか?私はjqueryステートメントでいくつかのタグを試してみましたが、何も動作していないようです。人々ピッカーがブラウズポップアップウィンドウからメインフォームに値を返すときにjqueryを呼び出す必要があります

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

そして、それが参考になる:(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"); 
}); 

任意の助けをいただければ幸いです

...

+1

非常に便利な疑問、のthnx先生:) –

答えて

14

あなたは、SharePointのバージョンを指定していないが、以下の説明では、SharePoint 2007に適用され、2010年

には確認されなかった人々ピッカーの値が「名前の確認」アイコンか 'をクリックして設定することができます「参照」アイコンをクリックします。

アンカータグである[名前の確認]アイコンをクリックすると、onclickイベントが 'WebForm_DoCallback'を呼び出し、非同期にSharePointサーバーにHTTP要求を行い、ピッカーに入力された名前を検証します。あなたが最も興味があるだろうということ「のEventTarget」、人々ピッカーのテキスト領域であることをWebForm_DoCallbacks引数の

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

ワン:後

はWebForm_DoCallbackの署名です。非同期HTTPリクエストが返った後に呼び出されるコールバックメソッドであるため、 'eventCallback'にも興味があります。この場合、コアjsで定義されている 'EntityEditorHandleCheckNameResult(result、ctx)'です。続き

はEntityEditorHandleCheckNameResult関数の定義もされているデリゲートがイベントをEntityEditorCallbackメソッドに取り扱うこと

function EntityEditorHandleCheckNameResult(result, ctx) 
{ 
    EntityEditorClearWaitCursor(ctx); 
    EntityEditorCallback(result, ctx); 
} 

お知らせです。これは、[参照]アイコンをクリックすると、ユーザーを探して選択するためのダイアログが開きます。 「ブラウズ」アイコンは明らかに別のコールスタックを利用しますが、どちらも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); 
     } 
    } 
}; 

後は、その結果、人々ピッカーのテキストエリアのIDを警告するカスタム人々ピッカーのイベントハンドラです:

EntityEditorCallbackが呼び出された後、あなたのコードを実行するには、次のコードを活用することができ

次に、ブラウズダイアログからピッカー名を選択または選択した後にonPeoplePickerFieldSetメソッドを呼び出すことができるロジックを次に示します。また、この文は、jQueryを使用している場合はdocument.readyイベントハンドラで呼び出すことができます。

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet); 

onPeoplePickerFieldSetメソッドの「結果」引数は、成功した検証だけでなく、ドメインquailifiedユーザー名を示す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」引数は、人々ピッカーのテキスト領域のIDであるとjQueryのセレクタ文で使用することができます。

これだけです!

+1

私はこれを明示的に述べませんでしたが、組み込みソリューションの非同期性のために、jQueryでのピッカーテキストエリアの変更イベントを購読することはできません。代わりに、あなたのカスタムロジックを私の推奨に従って注入する方がより信頼性の高い方法です。 –

+1

非常に参考になりました。私は2度投票できることを祈っています:) –

+0

非常に便利です、私はさらに、コールバックメソッドEntityEditorCallbackを上書きする投稿をhttp://vgrem.wordpress.com/2013/03/27/different-ways-of -extending-people-editor-in-the-client-side-sharepoint-2010/ –

0

を試してみました完全なhtml/jsコードを投稿できる場合は、問題を理解してください。

+0

あなたはライブ機能で「変更」を忘れてしまった... –

+2

'.live()'ですjQuery 1.7では廃止予定ですので、推奨されていません - http://api.jquery.com/live/ - 代わりに '.on()'や多分 '.delegate()'を使用してください。 – vapcguy

1

私は上記のAthens Hollowayからの回答をいくつかの調整を用いて使用しました。私のユースケースでは、特定のユーザーを人選者から除外していました。中央管理サーバー上のpeoplepicker serviceaccountdirectorypathを使用してユーザー選択ツールからユーザーを除外することはできますが、私たちにとってはオプションではないさまざまな変更管理の理由からユーザーを除外できます。特定の1つのサイトに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> 
0

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

これは、OPが動作しなかったのと同じ解決策です。何か不足していますか? –

+0

彼は '.change(function(){...})を使うと動作しませんでしたが、' .on'を使うのは少し違っていると言いました:http://jsperf.com/document-on-click-vs-element -click/2。私は主に '.live()'に関する記事に注意を払いたいと思っていました。これはそれを書く新しい方法でした:http://weblog.west-wind.com/posts/2013/Jun/12/Replacing-jQuerylive -with-jQueryon。そして、ボックスが変わったときに値を取得するために、この答えは、 'var name = $(this).val()'のようなものを追加するとうまくいきました。 – vapcguy

0

アテネの答えは、私にとって魅力のように働いた

これは、人々ピッカーから単一のユーザーを除外し、完全なスクリプトがあります。検証では(複数の名前とのマッチングのように)エラーがスローされることがあるので、検証がエラーを返さない限り、コードを実行したくありません。残念なことに、これは、返された複数の名前の中から正しい名前を選択した後で、ユーザーが検証ボタンを再度クリックする必要があります。ここ は、私は結果を解析するために使用ほんの少しの追加のコードです:

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 
    } 
} 
関連する問題