Necesito jQuery para disparar cuando el selector de personas devuelve el valor al formulario principal desde la ventana emergente de navegación

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

Pregunta

¿Alguien ha intentado intentar despedir el evento de cambio de jQuery cuando People Picker devuelve el valor al formulario principal desde la ventana de navegación emergente? He probado varias etiquetas en la declaración de jQuery, pero nada parece funcionar. (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" />

Yo he tratado

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

Cualquier ayuda sería muy apreciada ...

¿Fue útil?

Solución

No especificó la versión de SharePoint, pero la siguiente explicación se aplica a SharePoint 2007 y no se confirmó en 2010.

El valor del selector de personas se puede establecer haciendo clic en el icono 'Check Names' o el icono 'Examinar'.

Si hace clic en el icono de 'Check Names', que es una etiqueta de anclaje, el evento OnClick invoca 'webform_docallback' que hará una solicitud HTTP al servidor de SharePoint para validar el nombre ingresado en el selector de personas.

El siguiente es la firma webform_docallback:

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

Uno de los argumentos webform_docallbacks que estará más interesado es 'EventTarget', el área de texto de People Picker. También estará interesado en 'EventCallback', ya que es el método de devolución de llamada invocado después de que regrese la solicitud HTTP Async. En este caso, es 'EntityEditorHandLechecknameresult (resultado, CTX)' definido en el núcleo JS.

La siguiente es la definición de la función EntityEditorHandLechecknameresulty

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

Observe que delega el manejo del evento al método EntityEditorCallback. Este es también el caso si hace clic en el icono 'Examinar' que abre un cuadro de diálogo para que encuentre y seleccione un usuario. El icono 'Examinar' obviamente aprovecha una pila de llamadas diferente, pero a medida que ambos dependen de EntityEditorCallback, me centraré en este método a medida que la solución funciona cuando haga clic en 'Verificar nombres' o 'Examinar'.

Para ejecutar su código después de que se invoca EntityEditorCallback, puede aprovechar el siguiente código:

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

El siguiente es un controlador de eventos de selección de personas personalizadas que alerta al resultado y al área de texto de People Picker:

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

La siguiente es la lógica que permitirá invocar el método OnpeoplePickerFieldSet después de que el nombre del selector de personas se verifique o seleccione desde el cuadro de diálogo Examinar. Además, esta declaración se puede invocar en el controlador de eventos Document. Ready si está utilizando jQuery.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet);

El argumento de 'resultado' del método OnpeoplePickerFieldSet es un resultado XML que indica una validación exitosa, así como el nombre de usuario de codornización de dominio. El siguiente XML es un ejemplo que resulta de hacer clic en el icono 'Check Names':

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

El argumento 'CTX' es la identificación del área de texto de People Picker y se puede usar en una declaración de selector de jQuery.

¡Eso es todo!

Otros consejos

Usé la respuesta de Atenas Holloway arriba, con un par de ajustes. Mi caso de uso estaba excluyendo a un usuario en particular del recipiente de personas. Puede excluir a un usuario de People-Picker utilizando PeoplePicker ServiceAcCountDirectoryPaths en el servidor de administración central, pero por varias razones de control de cambios, eso no era una opción para nosotros. Agregar JavaScript al sitio en particular permite hacer el trabajo sin afectar toda la colección del sitio.

Este es el script completo que excluye a un solo usuario del selector de personas:

  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>

Prueba esto en su lugar:

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

Y sería útil comprender su problema si puede publicar el código HTML/JS completo.

Qué tal esto:

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

La respuesta de Athen funcionó como un encanto para mí. Dado que la validación a veces arroja un error (como múltiples coincidencias a un nombre), no quiero hacer mi código para ejecutar hasta que la validación no devuelva errores. Desafortunadamente, esto requiere que los usuarios hagan clic en el botón de validación nuevamente después de que seleccionen el nombre correcto de los múltiples devueltos. Aquí hay solo un pequeño código adicional que usé para analizar el resultado:

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
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top