2011-09-07 12 views
6

¿alguien ha intentado disparar jquery change event cuando el selector de personas devuelve el valor al formulario principal desde la ventana de exploración emergente? He intentado varias etiquetas en la declaración jquery pero nada parece funcionar. (SP 2010)necesito jquery para disparar cuando el selector de personas devuelve el valor al formulario principal de la ventana emergente de exploración

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

he intentado

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

cualquier ayuda sería muy apreciada ...

+1

muy útil, señor thnx :) –

Respuesta

14

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

valor La gente del selector se puede configurar haciendo clic en el '' Comprobar nombres icono o el ' Navegar por el ícono.

Si hace clic en el icono 'Comprobar nombres' que es una etiqueta ancla, el evento onclick invoca 'WebForm_DoCallback' que realizará una solicitud HTTP asincrónicamente al servidor de SharePoint para validar el nombre ingresado en el selector de personas.

A continuación se presenta la firma WebForm_DoCallback:

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

Uno de los argumentos que WebForm_DoCallbacks que va a ser más interesa es 'eventTarget', el área de texto selector de personas. También le interesará 'eventCallback', ya que es el método de devolución de llamada invocado después de que se devuelve la solicitud asincrónica HTTP. En este caso, es 'EntityEditorHandleCheckNameResult (result, ctx)' definido en core js.

siguiente es la definición de la función EntityEditorHandleCheckNameResult

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

en cuenta que delega la gestión de eventos con el método EntityEditorCallback. Este también es el caso si hace clic en el ícono "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 como ambos dependen de EntityEditorCallback, me centraré en este método ya que la solución funciona cuando haces clic en 'Comprobar nombres' o 'Buscar'.

Para ejecutar su código después de EntityEditorCallback se invoca, 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); 
     } 
    } 
}; 

A continuación se presenta un controlador de eventos la gente personalizados selector que alerta el resultado y el ID del área de texto Selector de personas:

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

La siguiente es la lógica que permitirá que se invoque el método onPeoplePickerFieldSet después de que el nombre del selector de personas se seleccione o seleccione desde el diálogo de exploración. Además, esta instrucción se puede invocar en el controlador de eventos document.ready si está utilizando jQuery.

invokeAfterEntityEditorCallback(onPeoplePickerFieldSet); 

El 'resultado' argumento del método onPeoplePickerFieldSet es un resultado XML que indica la validación exitosa, así como el nombre de usuario quailified dominio. El siguiente código XML es un ejemplo resultante de hacer clic en el icono '' Comprobar nombres:

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

El argumento '' CTX es el ID del área de texto selector de personas y se puede utilizar en un comunicado selector de jQuery.

Eso es todo!

+1

No indiqué explícitamente esto, pero la suscripción al evento de cambio del área de texto del selector de personas en jQuery no funcionará debido a la naturaleza asíncrona de la solución intrínseca. En cambio, inyectar su lógica personalizada según mi recomendación es una solución más confiable. –

+1

Muy útil, me gustaría poder votar dos veces :) –

+0

Muy útil, incluso escribí una publicación sobre el método de devolución de llamada dominante EntityEditorCallback aquí http://vgrem.wordpress.com/2013/03/27/different-ways-of -extendiendo-gente-editor-en-el-cliente-lado-sharepoint-2010/ –

0

Prueba este lugar:

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

Y sería útil para comprender su problema si puede publicar el código html/js completo.

+0

se le olvidó "cambio" en su función en vivo ... –

+2

'.live()' es desaprobado a partir de jQuery 1.7, y por lo tanto no es recomendable - http://api.jquery.com/live/ - use '.on()' o tal vez '.delegate()', en su lugar. – vapcguy

1

Utilicé la respuesta de Athens Holloway anterior, con un par de ajustes. Mi caso de uso excluía a un usuario particular del selector de personas. Puede excluir a un usuario del selector de personas utilizando la ruta de acceso del servicio de búsqueda de personas en el servidor de administración central, pero por diversas razones de control de cambios esa no era una opción para nosotros. Agregar Javascript a un sitio en particular nos permite hacer el trabajo sin afectar la colección de sitios completa.

Este es el guión completo que excluye a un único usuario desde el 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> 
0

¿Qué tal esto:

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

Esta es la misma solución que el OP dijo que no funcionó. ¿Me estoy perdiendo de algo? –

+0

Dijo que el uso de '.change (function() {...})' no funcionaba, pero que usa '.on' es ligeramente diferente: http://jsperf.com/document-on-click-vs-element -click/2. Principalmente quería llamar la atención sobre la publicación sobre '.live()', que esta era la nueva forma de escribir eso: http://weblog.west-wind.com/posts/2013/Jun/12/Replacing-jQuerylive -with-jQueryon. Y para obtener el valor cuando cambia el cuadro, esta respuesta, al agregar algo como 'var name = $ (this) .val()' funcionó bien para mí, por lo que no estoy realmente seguro de lo que necesitaba el OP. – vapcguy

0

respuesta de Atenas funcionó como un encanto para mí. Dado que la validación a veces arroja un error (como múltiples coincidencias con un nombre) no quiero hacer que mi código se ejecute hasta que la validación no devuelva ningún error. Lamentablemente, esto requiere que los usuarios vuelvan a hacer clic en el botón de validación después de que seleccionan el nombre correcto del múltiplo devuelto. Aquí es un poco de código adicional que utiliza para analizar el resultado: pregunta

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 
    } 
} 
Cuestiones relacionadas