ho bisogno jquery a fuoco quando Selezione utenti restituisce il valore al form principale dalla pop-up finestra di ricerca

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

Domanda

qualcuno ha tentato cercando di fuoco jquery evento di modifica quando Selezione utenti restituisce il valore al form principale dalla pop-up finestra di ricerca? Ho provato diversi tag nella dichiarazione jquery, ma nulla sembra funzionare. (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" />

ho provato

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

Qualsiasi aiuto sarebbe molto apprezzato ...

È stato utile?

Soluzione

Non ha specificato la versione di SharePoint, ma la seguente spiegazione vale per SharePoint 2007 e non è stata confermata nel 2010.

Il valore popolo di selettore può essere impostato cliccando su 'Controlla nomi' icona o l'icona 'Sfoglia'.

Se si fa clic sull'icona 'Controlla nomi', che è un tag di ancoraggio, le invoca evento onclick 'WebForm_DoCallback' che in modo asincrono effettuare una richiesta HTTP al server SharePoint per convalidare il nome inserito nella Selezione utenti.

In seguito è la firma WebForm_DoCallback:

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

Una delle tesi WebForm_DoCallbacks che che vi sarà più interessa è 'eventTarget', l'area di testo Selezione utenti. Potrai anche essere interessati a 'eventCallback' in quanto è il metodo di callback richiamato dopo la richiesta ritorna asincrona HTTP. In questo caso, è di 'EntityEditorHandleCheckNameResult (risultato, CTX)' definita js fondamentali.

In seguito è la definizione della funzione EntityEditorHandleCheckNameResult

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

Si noti che delega la gestione degli eventi al metodo EntityEditorCallback. Questo è anche il caso se si fa clic sull'icona 'Sfoglia', che apre una finestra di dialogo per voi per trovare e selezionare un utente. L'icona 'Sfoglia' sfrutta ovviamente uno stack di chiamate diverso, ma in quanto entrambi si basano su EntityEditorCallback, mi concentrerò su questo metodo come la soluzione funziona quando si fa clic su 'Controlla nomi' o 'Sfoglia'.

Per eseguire il codice dopo EntityEditorCallback viene richiamato, è possibile sfruttare il seguente codice:

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

A seguito di un gestore di eventi personalizzati persone raccoglitrice che avvisa il risultato e l'ID dell'area di testo Selezione utenti:

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

In seguito è la logica che permetterà il metodo onPeoplePickerFieldSet da richiamare dopo la gente nome selettore è selezionata o selezionata dalla finestra di dialogo Sfoglia. Inoltre, questa affermazione può essere richiamato nel gestore di eventi document.ready se si utilizza jQuery.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

L'argomento 'risultato' del metodo onPeoplePickerFieldSet è un risultato XML che indica la validazione di successo così come il dominio nome utente quailified. Il seguente codice XML è un esempio, a fare clic sul 'Controlla nomi' icona:

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

Il 'CTX' argomento è l'ID dell'area di testo Selezione utenti e può essere utilizzato in una dichiarazione selettore jQuery.

Questo è tutto!

Altri suggerimenti

ho usato la risposta da Atene Holloway sopra, con un paio di ritocchi. Il mio caso uso è stato escluso un particolare utente dalla gente-raccoglitrice. È possibile escludere un utente dal Peoplepicker utilizzando serviceaccountdirectorypaths Peoplepicker sul server di amministrazione centrale, ma per varie ragioni di controllo delle modifiche che non era un'opzione per noi. Aggiungendo Javascript per quella particolare sito Cerchiamo di ottenere il lavoro fatto senza influenzare la raccolta intero sito.

Questo è lo script completo che esclude un singolo utente dal selettore persone:

  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>

Prova questo, invece:

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

E sarebbe utile per capire il problema se è possibile inviare pieno html / js codice.

Che ne dite di questo:

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

La risposta di Atene ha funzionato come un fascino per me. Dal momento che la convalida a volte genera un errore (come più corrispondenze ad un nome) non voglio fare il mio codice per l'esecuzione fino a quando la convalida non ha prodotto alcun errore. Purtroppo questo richiede agli utenti di fare di nuovo clic sul pulsante di convalida dopo che selezionare il nome corretto dal più restituito. Qui è solo un po 'di codice aggiuntivo che ho usato per analizzare il risultato:

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
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top