Ich brauche JQuery, um zu schießen, wenn People Picker den Wert aus dem Stöbern Pop -up -Fenster an die Hauptform zurückgibt

StackOverflow https://stackoverflow.com/questions/7328016

Frage

Hat jemand versucht, JQuery Change Event zu entlassen, wenn People Picker den Wert aus dem Pop -up -Surfenfenster an die Hauptform zurückgibt? Ich habe mehrere Tags in der Jquery -Erklärung ausprobiert, aber nichts scheint zu funktionieren. (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" />

Ich habe versucht

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

Jede Hilfe wäre sehr geschätzt ...

War es hilfreich?

Lösung

Sie haben die Version von SharePoint nicht angegeben, aber die folgende Erklärung gilt für SharePoint 2007 und wurde 2010 nicht bestätigt.

Der Wert des People Pickers kann festgelegt werden, indem Sie auf das Symbol "Namen" oder "Durchsuchen" klicken.

Wenn Sie auf das Symbol "Names check" klicken, das ein Anker -Tag ist, ruft das Onclick -Ereignis 'webform_docallback' auf, das asynchron eine HTTP -Anfrage an den SharePoint -Server erstellt, um den in den People Picker eingegebenen Namen zu validieren.

Im Folgenden finden Sie die Signatur webform_docallback:

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

Eines des Arguments von WebForm_Docallbacks, an dem Sie am meisten interessiert sind, ist "EventTarget", den People Picker -Textbereich. Sie interessieren sich auch für 'EventCallback', da es sich um die Rückrufmethode handelt, die nach der Rückgabe der Async HTTP -Anfrage aufgerufen wurde. In diesem Fall handelt es sich um 'EntityEditorHandLECKNECNAMERSULT (REERT, CTX)', das in Core JS definiert ist.

Im Folgenden finden Sie die Definition der EntityeditorHandLECKNAMERSULT -Funktion

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

Beachten Sie, dass es die Ereignisbehandlung an die EntityeditorCallback -Methode delegiert. Dies ist auch der Fall, wenn Sie auf das Symbol "Durchsuchen" klicken, das einen Dialogfeld öffnet, mit dem Sie einen Benutzer finden und auswählen können. Das "Browse" -Symbol nutzt offensichtlich einen anderen Anrufstapel, aber da beide auf EntityeditorCallback beruhen, werde ich mich auf diese Methode konzentrieren, wenn die Lösung funktioniert, wenn Sie auf "Namen" oder "Durchsuchen" klicken.

Um Ihren Code auszuführen, nachdem EntityEditorCallback aufgerufen wurde, können Sie den folgenden Code nutzen:

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);
        }
    }
};

Im Folgenden finden Sie einen benutzerdefinierten People Peoper -Event -Handler, der das Ergebnis und den Ausweis des People Picker -Textbereichs aufmerksam macht:

function onPeoplePickerFieldSet(result, ctx){
    alert(result);
    alert(ctx); 
}

Es folgt eine Logik, mit der die Onpeoplepickerfieldset -Methode aufgerufen werden kann, nachdem der People Picker -Name überprüft oder aus dem Dialogfeld "Durchsuchen ausgewählt wurde. Außerdem kann diese Erklärung im Dokument aufgerufen werden.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

Das "Ergebnis" -Argument der Onpeoplepickerfieldset -Methode ist ein XML -Ergebnis, das eine erfolgreiche Validierung sowie den Domänen -Quailed -Benutzernamen anzeigt. Das folgende XML ist ein Beispiel, das sich aus dem Symbol "Names check" ergibt:

<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>

Das Argument "CTX" ist die ID des People Picker -Textbereichs und kann in einer Jquery Selector -Anweisung verwendet werden.

Das ist es!

Andere Tipps

Ich habe die Antwort von Athens Holloway oben mit ein paar Änderungen verwendet. Mein Anwendungsfall hat einen bestimmten Benutzer aus dem People-Picker ausgeschlossen. Sie können einen Benutzer von People-Picker mit PeoplePicker serviceAccountDirectoryPaths auf dem zentralen Administratorserver ausschließen, aber aus verschiedenen Gründen der Änderungssteuerung, die für uns keine Option waren. Durch das Hinzufügen von JavaScript zu der einen bestimmten Website erledigen wir die Aufgabe, ohne die gesamte Site -Sammlung zu beeinflussen.

Dies ist das vollständige Skript, das einen einzelnen Benutzer aus dem People Picker ausschließt:

  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>

Versuchen Sie es stattdessen:

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

Und es wäre hilfreich, Ihr Problem zu verstehen, wenn Sie einen vollständigen HTML/JS -Code veröffentlichen können.

Wie wäre es damit:

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

Athens Antwort funktionierte für mich wie ein Zauber. Da die Validierung manchmal einen Fehler auswirkt (wie mehrere Übereinstimmungen an einen Namen), möchte ich meinen Code nicht ausführen, wenn die Validierung keine Fehler zurückgibt. Leider müssen Benutzer erneut auf die Schaltfläche Validierung klicken, nachdem sie den richtigen Namen aus der zurückgegebenen Mehrfacher ausgewählt haben. Hier ist nur ein kleiner zusätzlicher Code, mit dem ich das Ergebnis analysiert habe:

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
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top