j'ai besoin jquery au feu lorsque le sélecteur de personnes renvoie la valeur à la forme principale de la navigation de la fenêtre pop-up

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

Question

a quelqu'un tenté d'essayer de feu jquery événement change lorsque le sélecteur de personnes renvoie la valeur à la forme principale de la fenêtre pop-up navigation? J'ai essayé plusieurs balises dans la déclaration jquery, mais rien ne semble fonctionner. (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" />

J'ai essayé

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

toute aide serait grandement appréciée ...

Était-ce utile?

La solution

Vous ne spécifiait pas la version de SharePoint, mais l'explication suivante s'applique à SharePoint 2007 et n'a pas été confirmée en 2010.

La valeur du sélecteur de personnes peut être réglé en cliquant sur l'icône « Vérifier les noms » ou l'icône « Parcourir ».

Si vous cliquez sur l'icône « Vérifier les noms » qui est une balise d'ancrage, l'événement onclick invoque de la WebForm_DoCallback 'qui de manière asynchrone faire une requête HTTP au serveur SharePoint pour valider le nom entré dans le sélecteur de personnes.

est la suite de la signature de WebForm_DoCallback:

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

L'un des argument WebForm_DoCallbacks que vous serez plus intéressé est « eventTarget », le peuple zone de texte du sélecteur. Vous serez également intéressé par « eventCallback » comme il est la méthode de rappel invoquée après le retour de requête HTTP asynchrone. Dans ce cas, il est de EntityEditorHandleCheckNameResult (résultat, ctx) »définie dans js de base.

Voici la définition de la fonction EntityEditorHandleCheckNameResult

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

Notez qu'il délègue l'événement à la méthode de manipulation EntityEditorCallback. Ceci est également le cas si vous cliquez sur l'icône « Parcourir » qui ouvre une boîte de dialogue pour vous de trouver et de sélectionner un utilisateur. Le « Browse » icône tire parti de toute évidence une pile d'appel différent, mais comme ils reposent tous deux sur EntityEditorCallback, je vais me concentrer sur cette méthode fonctionne comme la solution lorsque vous cliquez sur « Vérifier les noms » ou « Browse ».

Pour exécuter votre code après EntityEditorCallback est invoqué, vous pouvez exploiter le code suivant:

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

Voici un gestionnaire d'événements sélecteur de personnes personnalisées qui alerte le résultat et l'ID du peuple zone de texte du sélecteur:

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

Après une logique qui permettra à la méthode onPeoplePickerFieldSet à être invoquée après le nom que sélecteur est cochée ou sélectionné dans la boîte de dialogue de navigation. En outre, cette déclaration peut être invoqué dans le gestionnaire d'événements document.ready si vous utilisez jQuery.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

L'argument « résultat » de la méthode onPeoplePickerFieldSet est un résultat XML indiquant la validation réussie ainsi que le nom d'utilisateur domaine quailified. Le code XML suivant est un exemple résultant de cliquer sur le "Vérifier les noms de l'icône:

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

L'argument « CTX » est l'ID du peuple zone de texte de sélecteur et peut être utilisé dans une instruction de sélection jQuery.

Ca y est!

Autres conseils

J'utilisé la réponse d'Athènes Holloway ci-dessus, avec quelques réglages de couple. Mon cas d'utilisation a été l'exclusion d'un utilisateur particulier du peuple cueilleur. Vous pouvez exclure un utilisateur de peoplepicker à l'aide de serviceaccountdirectorypaths Peoplepicker sur le serveur d'administration centrale, mais pour diverses raisons de contrôle de changement qui était pas une option pour nous. Ajout au Javascript un site particulier laissez-nous faire le travail sans affecter toute la collection du site.

Ceci est le script complet qui exclut un seul utilisateur du sélecteur de personnes:

  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>

Essayez ceci:

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

Et il serait utile de comprendre votre problème si vous pouvez publier vos html / js code.

Que diriez-vous ceci:

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

La réponse de Athen a travaillé comme un charme pour moi. Depuis la validation jette parfois une erreur (comme plusieurs correspondances à un nom) Je ne veux pas faire mon code à exécuter jusqu'à ce que la validation retourne aucune erreur. Malheureusement, cela oblige les utilisateurs à cliquer sur le bouton de validation à nouveau après avoir sélectionné le nom correct du multiple retourné. Voici juste un petit code supplémentaire je pour analyser le résultat:

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
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top