Arxius de la categoria: jQuery i SharePoint

Superar el problema molest amb la URL relativa en llanxa ràpida del SharePoint

Volia afegir un enllaç a la llanxa ràpida navegació l'altre dia i em va dir SharePoint:

image

Versió només text pur d'això és:

Garantir que l'URL és vàlida i comença amb qualsevol un caràcter vàlid (un símbol de nombre (#) o barra inclinada (/)) o un protocol vàlid admesos (per exemple, ' http://’, ' https://’, "arxiu://’, ' ftp://’, "mailto:’, ' Notícies:’).

"Blech i pox de!"Jo vaig dir.

Un workaround per això és utilitzar JavaScript per trobar un enllaç conegut a la llanxa ràpida i substituir el seu comportament.

Per provar això, afegir un nou enllaç al seu lloc de prova així:

image

He fet servir jQuery. Per solucionar-lo, obtenir alguns JavaScript i jQuery a la pàgina utilitzant el seu favorit tècnica i amb una línia de codi com aquest:

 

$(document).preparat( funció () {

    $("un:conté('Prova substitució URL')").feu clic a(funció () { alerta("clic canviat de comportament!"); retorn fals;});

});

I el teu oncle Bob.

El selector de jQuery es troba cada <un> l'etiqueta que ha "Substitució de la prova d'URL" en el seu nom. Pot voler trobar sintonia que depenent del seu enllaç i tal.

El feu clic(funció() Substitueix el SharePoint hauria fet quan fa clic a l'usuari. Assegureu-vos que vostè "return false" o bé es fer les teves coses i llavors tractar la cosa href massa, que és gairebé naturalment no el teu objectiu.

Això va ser fet i prova en un entorn en línia SharePoint sinó que funcionen bé a 2010 i abans també.

</final>

undefinedSubscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Ràpid i senzill: Resoldre "URL invàlid paràmetre” problema amb UpdateListItems en lists.asmx

Quan es treballa amb UpdateListItems mitjançant lists.asmx, és fàcil generar l'error:

Paràmetre URL invàlid.

L'adreça URL proporcionada conté una ordre o un valor no vàlid. Si us plau aturi l'URL nou.

Pot aconseguir aquest error quan us oblideu incloure ID en el la llista dels camps d'actualitzar.  Això, com molts d'aquests SP serveis web, és una mica contradictori ja que necessita d'incloure l'ID de l'atribut d'ID de la <Mètode> element.  I no esteu actualitzat ID i probablement mai volia en primer lloc.

Aquest sabó sobres obres:

<soapenv:Sobres xmlns:soapenv =' http://schemas.xmlsoap.org/SOAP/envelope/'>
  <soapenv:Cos>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <NOMBRELISTA>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</NOMBRELISTA>                     
        <actualitzacions>                     
         <Lot OnError ="Continuï">
          <Mètode ID ="1" Cmd ="Actualització">
            <Nom del camp ="CooperativeLock">tancat!</Camp>
            <Nom del camp ="ID">1</Camp>
          </Mètode>
        </Lot>                     
        </actualitzacions>                
      </UpdateListItems>             
  </soapenv:Cos>         
</soapenv:Sobres>

Si vostè es despulla fora la referència de camp ID llavors aconseguirà el missatge molest "Paràmetre URL invàlid".

</final>

undefinedSubscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

 

Home pobre de memòria cau en JavaScript

[TL;DR versió: utilitza cookies per emmagatzemar els resultats de les trucades asíncrona; representar els resultats dels darrers asíncrona trucades immediatament i validar-los llavors després de càrrega de pàgina.]

He estat treballant en lloc d'intranet del SharePoint per a un client que inclou, entre altres coses, una estilitzada Navegació secundària les opcions del menú són gestionats mitjançant una llista personalitzada vell regular.  La idea és que el client obté controlar el menú del "seu" lloc sense afectar o estar afectat per la navegació per.

(hi ha alguna cosa increïblement subversiu sobre com afegir un CEWP que apunta a un fitxer HTML que carrega alguns CSS i JS per alterar fonamentalment gairebé tot sobre el comportament d'un lloc... però això és per a un altre lloc)

El codi per a aquesta força simples:

L'adolorit lloc aquí és que cada vegada que algú colpeja una de les pàgines del lloc, navegador web de l'usuari és arribar a tenir elements de la llista.  Un cop dev és completa i proves ha demostrat coses de ser estable i complet, Aquesta convocatòria és innecessari més de 99% de l'època ja que poques vegades la carta canvia.  També disposa d'un estrany efecte UI que és comú en aquest món nou i valent de llocs web hiper-ajaxy-rendeix la pàgina i llavors només fa rendir el menú.  És nerviós i distracció en la meva opinió.  I nerviós. Així, memòria cau. 

He modificat la lògica així:

  • Buscar una galeta al navegador que conté el menú com darrera llegir-lo
    • Si hem trobat, representar-lo immediatament.  No esperi per a acabar de carregar la pàgina.  (Vostè necessita assegurar-se que el seu HTML estratègicament situat aquí, però no és difícil de fer).
  • Espereu que la pàgina d'acabar de carregar i fer un asíncrona truqueu per carregar els elements de menú d'una llista, utilitzant la resta o lists.asmx o el que sigui
  • Comparar què aconseguia contra la galeta
    • Si coincideix amb el, PARADA
    • En cas contrari, utilitzant jQuery, poblar dinàmicament un grapat de si <li>és en una <ul>
  • Utilitzar CSS per fer tot el format
  • Benefici!

Alguns de vostès estan anant a dir, "Escolta! no hi ha cap veritable memòria cau passant aquí ja que vostè està llegint la carta de totes maneres cada vegada.”  I tens raó-no estic donant el servidor cap mena de descans.  Però perquè la crida és asíncrona i passa després la pàgina inicial càrrega HTML totalment rendeix, "se sent" més sensible a l'usuari.  El menú rendeix força tant com dibuixa la pàgina.  Si el menú passa al canvi, l'usuari se sotmet a un nerviós repetir el sorteig del menú, però només que una vegada.

Hi ha algunes maneres de fer aquesta memòria cau més eficaç i ajudar el servidor al mateix temps:

  • Posar en una regla que el "amagatall de galetes" és vàlida per un mínim de 24 hores o algun timeframe altre. Mentre no hi ha galetes expirats, utilitzar instantània de la galeta menú i mai va colpejar el servidor.

Bé... això és tot el que vénen a la ment ara mateix :). 

Si algú té alguna idea intel ligent aquí jo estimaria saber-los.

I finalment – aquesta tècnica pot ser utilitzat per altres coses.  Pàgina del aquest client té una sèrie de coses basades en dades sobre diferents pàgines, molts d'ells canviar relativament poques vegades (com un cop per setmana o un cop al mes).  Si la destinació de les àrees específiques de funcionalitat, es pot donar un UI més sensible per tirant contingut des de la botiga local de galeta i rendició immediatament.  Que se sent més ràpid a l'usuari fins i tot si vostè no els està salvant el servidor qualsevol cicles.  Vostè pot salvar els cicles de servidor per decidir sobre algunes condicions i factors desencadenants que invalida aquest amagatall de galetes local.  Això és tot situacional i artístic matèria i realment el més divertit :). 

</final>

undefinedSubscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Mostres de XSLT i jQuery

He estat fent un munt de XSLT, jQuery i thought que i share uns quants fragments que altres el poden trobar útils en el futur.

Exemple 1: Emeten simple JavaScript / jQuery a XSLT:

<XSL:Partit de plantilla = "alguna cosa" XML:espai = "preservar">

  <!– Fora el camp ocult de filtres amistós de consulta en blanc –>
  <tipus d'escriptura = "text/javascript">
    $(document).preparat(funció(){
      $("#QueryFriendlyFilters").val("buit");
    });
  </script>

</XSL:plantilla>

Aquella mica emet una mica de JavaScript que espera per a la pàgina per acabar de carregar (a causa de la $(document).preparat(…)) i llavors conjunts el valor d'un camp ocult anomenat QueryFriendlyFilters al valor literal "buida".

Exemple 2: Ús <XSL:Si> per comprovar "superior",  "menys de", etc.

<XSL:Partit de plantilla = "alguna cosa" XML:espai = "preservar">

  <Div id = "fdcAllFilters">
 
    <XSL:Si test="@Count>0">
      <span class = "fdcFilterLabel">Filtres actuals:</span>
    </XSL:Si>

    <!– més coses passa aquí. –>

</XSL:plantilla>

El fragment damunt comprovacions per veure si hi ha un atribut anomenat "Comptar" de l'element "alguna cosa" més gran que zero.  L'XML darrere d'això seria una cosa així com:”

<alguna cosa Count = "5" />

Exemple 3: ITER a través de tots els elements, intercalant trucades de jQuery.

<!– ITER a través de tots els filtres i mostrar la correcta  enllaços. –>
<XSL:per a cada select = "UserFilter">

  <una classe = "FilterHref" href = "javascript:mySubmitPage('RemoveUserFilter','{@ ID}’)">[X]</un>

  <span class = "fdcFilterLabel"><XSL:valor de select="@FilterValue"/></span>

  <tipus d'escriptura = "text/javascript">

    $(document).preparat(funció(){
        <XSL:text><![CDATA[$("#QueryFriendlyFilters").val( ($("#QueryFriendlyFilters").val() + " ]]></XSL:text>\"<XSL:valor de select="@FilterValue"/>\"<XSL:text><![CDATA["));]]></XSL:text>
    });

  </script>

</XSL:per a cada>

El fragment de dalt és el més complex i hi pot haver més fàcils maneres de fer-ho.

L'XML darrere d'això s'assembla més o menys com aquest:

<UserFilter ID = FilterValue "123" = "xyzzy" />

Aquest fragment és itereu a través de <UserFilter> Nodes. 

En primer lloc que emet un àncora d'etiquetes que quan fet clic invoca una funció de JavaScript que és ja a la pàgina, "mySubmitPage" i de passa el valor d'un atribut la <UserFilter> node anomenat "ID". 

Llavors emet alguns jQuery que espera per a la pàgina carregar.  Aquell jQuery actualitzacions d'un camp d'amagat anomenat "QueryFriendlyFilters" per afegir el valor de l'atribut FilterValue.  Tingueu en compte tot el boig <XSL:text> i <![CDATA[ … ]]> matèria.

Això és tot, esperança que ajudi!

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Lists.asmx, GetListItems i carpetes

Jo estava fent una investigació per algú avui al voltant de la list.asmx web servei proporcionat com part del SharePoint 2010 (i anteriors).  Ella va ser capaç d'obtenir els elements de la llista a la carpeta d'arrel (incloent-hi els noms de sub-carpetes), però no podria aconseguir elements en subcarpetes.  Vaig fer algunes mirant al voltant de la internets i és una pregunta sorprenentment comú.  No obstant això, No podria aconseguir una bona resposta a la pregunta simple, "si jo sé la carpeta, com puc obtenir els elements a la carpeta?”  Per ser honest, No intento dur tot el que ja he volgut aquest un terme figura en el meu propi una estona somriure.

Per configurar-ho, He creat un lloc anomenat "Blogging escenaris" i una llista personalitzada anomenat "Costum llista amb subcarpetes".  Llavors vaig crear carpetes anomenades:

  • L'any 2005
  • L'any 2006
  • L'any 2007

He afegit uns elements a la carpeta de "Any 2006".  Això és el que sembla:

image

El meu amic no és l'escriptura de codi de c# però més aviat utilitzant Java, Així, els sobres de sabó, va ser el que realment necessitava.  Per aconseguir que, Vaig escriure una mica de jQuery i llavors utilitzava el violinista a la conversa d'HTTP present.

Heus aquí la jQuery rellevant (He copiat el codi avall per sota si vol copiar/enganxar):

image

És de primera clau per incloure a banda un <queryOptions> i <QueryOptions> node.  La segona clau és que el <Carpeta> node és un URL al qual el client té accés.

Pot haver-hi altres maneres d'aconseguir això, però això funcionava bé per a mi quan utilitzant jQuery.

Aquí hi ha les sobres de sabó per a l'anterior:

<soapenv:Sobres xmlns:soapenv =’http://Schemas.xmlsoap.org/SOAP/envelope/’>                
  <soapenv:Cos>
    <GetListItems xmlns =’
http://Schemas.Microsoft.com/SharePoint/SOAP/’>
      <NOMBRELISTA>Llista personalitzada amb subcarpetes</NOMBRELISTA>
      <viewFields>  
        <ViewFields>
          <FieldRef nom =' títol’ />
          <Nom de FieldRef ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Carpeta>
http://demoserver1/blocs Llista d'escenaris/llistes/personalitzada amb Sub les carpetes a l'any 2006</Carpeta>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Cos>
</soapenv:Sobres>

Un munt d'exemples i discussió al voltant d'això em va portar a crec que tot el que necessito és la <QueryOptions> i especifiqueu un nom de carpeta.  Per a mi, Jo necessitar als dos embolicar dins <queryOptions> així com d'especificar una URL plenament qualificat per a la <Carpeta> Node.

Aquesta és la configuració d'AJAX jQuery:

$(document).preparat(funció() {
       var soapEnv =
           "<soapenv:Sobres xmlns:soapenv =’http://Schemas.xmlsoap.org/SOAP/envelope/’> \
               <soapenv:Cos> \
                    <GetListItems xmlns =’http://Schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <NOMBRELISTA>Llista personalitzada amb subcarpetes</NOMBRELISTA> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef nom =' títol’ /> \
                              <Nom de FieldRef ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Carpeta>http://demoserver1/Blogging Llista d'escenaris/llistes/personalitzada amb Sub les carpetes a l'any 2006</Carpeta> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Cos> \
           </soapenv:Sobres>";

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Lists.asmx, GetList i "valor no pot ser nul”

Avui he descobert que la GetList() mètode en lists.asmx servei web ha de ser anomenat amb molta cura, o és propens a llançar un misteriós "Valor no pot ser nul·la" excepció (i que està suposant que pot aconseguir per davant del missatge d'error genèric fins i tot pitjor, "Una excepció del tipus ' Microsoft.SharePoint.SoapServer.SoapServerException’ s'ha llançat.")  Específicament, He trobat que vostè no pot facilitar cap tipus de prefix en el mètode GetList.  El següent fragment de jQuery il·lustra el punt:

image

Si fas això, el servei web respon amb "Valor no pot ser nul" segons aquest Fiddler-proporcionat expedient HTTP:

<?versió XML = "1.0" codificació = "utf-8"?>
  <sabó:Sobres
     xmlns:sabó ="
http://Schemas.xmlsoap.org/SOAP/envelope/"    
     xmlns:XSi = "
http://www.w3.org/2001/XMLSchema
     xmlns:XSD ="
http://www.w3.org/ 2001/XMLSchema">

  <sabó:Cos>
    <sabó:Culpa>
      <faultcode>sabó:Servidor</faultcode>
      <faultstring>
        Excepció del tipus ' Microsoft.SharePoint.SoapServer.SoapServerException’ va ser llançat.
      </faultstring>
      <detall>
        <errorstring xmlns ="
http://Schemas.Microsoft.com/SharePoint/SOAP/">
Valor no poden ser nul·les.
        </errorstring>
      </detall>
    </sabó:Culpa>
  </sabó:Cos>
</sabó:Sobres>

Clar, vostè probablement no afegir aquest prefix "s0" en el seu propi, però algunes eines són propensos a fer-ho (com eclipsi).

Això és el més confús / frustrant perquè altres mètodes tolerar prefixos.  Per exemple, el GetListCollection mètode no li importa si això és estat prefixat, fins i tot amb prefixos tonteries com "xyzzy":

image

Aquest "valor no pot ser nul·la" sembla bastant comú amb lists.asmx així que espero que això ajudarà algú fora en el futur.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Sense parar nidificació <Div> Etiquetes i jQuery

Això sembla com un tema tan oddball, No estic segur que realment val la pena blogging sobre, però que mai no ha deixat m abans de, Així que aquí anem somriure

Estic treballant en un projecte on m'estic tirant algunes dades d'una cerca, embalatge a un missatge XML i llavors aquella XML en última instància, es transforma en HTML mitjançant XSLT.  Hi ha un munt de jQuery implicats, una mica de que implementa alguna funcionalitat tabulació.  Quan fa clic a una fitxa (realment, un <Div>), jQuery invoca .hide() i .show() en diversos divs (càrrega de la pàgina inicial descarrega tot el contingut, així que hi ha cap devolucions en aquest cas).

Un grapat d'hores fa, la pestanya commutació lògica començar a comportar-se de manera erràtica i no Mostra un dels meus tabuladors.  Jo finalment segueixi fins el fet que Explorador d'internet (com a mínim) pensar que la <Div> Etiquetes niuades lluny, molt més profund que pretén.El toolbar de desenvolupador mostraria:

-<div id = "Tab1Content">
  -<Div>
    -<Div>
      -<div id = "Tab2Content">
        -<Div>
           …………………………
                   </Div>  <— Finalment demostrant que fou clausurada completament aquí!

Així, si feia un $("#Tab1Content").Amaga(), També em vaig amagar els Tab2 i jo podria mai no mostrar Tab2 si no mostrar també Tab1.  Copiava i enganxava el codi a visual studio i va mostrar tots convenint el div manera bonica, igual que suposava estar fent, mirant com aquest:

-<div id = "Tab1Content">
  +<Div>
  +<Div>
-<div id = "Tab2Content">
  +<Div>
  +<Div>

Vaig batre el meu cap contra la paret per una estona i notat que en el present codi HTML codi es genera una gran quantitat de buit <Div> Etiquetes, com:

<cos>

  <div id = "Tab1Content">

    <div id = "row1" />
    <div id = "row2" />

  </Div>

  <div id = "Tab2Content">

    <div id = "row1" />
    <div id = "row2" />

  </Div>

</cos>

(Això és waaaaaaaaaaaay simplista.  Les etiquetes div buides són totalment vàlids. Alguns dels meus <Div> Etiquetes estaven plenes de contingut, però no eren molts més.  Vaig arribar a la conclusió que el meu <XSL:per a cada> directives estaven emetent la forma curta etiquetes div quan el xsl:no per-tots "trobar cap dada.  Jo forçat un comentari HTML a la sortida, com es Mostra:

image

 

Després que fes allò, tots el div alineats molt bé i meu tabulador de commutació va començar a treballar.

Com sempre, Espero que això ajudi a algú en un pessic.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

No obstant això, més jQuery–Redimensionar un exemple d'imatge

Heretava un element web de proveïdor vells del client i que té un problema de mida d'imatge.  Les imatges haurien de 60×50 però per alguna estranya raó, el venedor original els obligà a 42×42, Així es veuen aplastat:

 

Bona imatge

Mala imatge

Aquí està l'etiquetatge (simplificat una mica):

<taula class = 'estès-outlook'>
  <Thead>
    <tr>
      <th  amplada = 100′>3 Dimarts</th>
    </tr>
  </Thead>

  <tbody>
    <classe TR = 'previsió'>
      <amplada TD = 100′>
        <ul>
          <classe li = "high">Alta: 72&DEG;F</li>
          <classe li = 'baixa'>Baixa: 44&DEG;F</li>
          <classe li = 'condició'>Assolellat
            <img src =’
http://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/en/trans/cond007.png’ amplada ='42’ alçada ='42’ alt =” />
          </li>
        </ul>
      </TD>
    </tr>

  </tbody>

</taula>

S'haurà adonat que tot i que la camí cap a la mateixa imatge Mostra la dimensió adequada (60×50) el venedor original va obligar a 42×42.  Per què?  Boig.

De tota manera, Jo volia una solució ràpida i fàcil a aquest assumpte i em vaig tornar a jQuery.  El truc era localitzar totes les adequades <img> Etiquetes.  No volia fems amb cap altra etiqueta img (de les quals n'hi ha molts).  Aquesta mica de jQuery feia el truc:

<tipus d'escriptura = text/javascript"" src ="http://Ajax.googleapis.com/Ajax/libs/jQuery/1.5/jQuery.min.js"></script>

<tipus d'escriptura = "text/javascript">
     $(document).preparat(funció () {

         $(' li.condition > img ").cada(funció (índex, element)
           
{
             $(element).CSS("amplada", "60"); 
             $(element).CSS("Alçada", "50");
            });
     }); // càrrega de documents
</script>

Aquest tros de codi es troba la col·lecció <li> Etiquetes la classe és "condició" i <img> nens.  Llavors ho itera a través de tot això.  Treballat com un encant.

Probablement podria simplificar-lo, però mai va ser un tipus de tipus unix que resolt π per 18 precisió de dígits utilitzant sed i awk i jo no sóc aquest tipus si jQuery qualsevol tipus somriure.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Implementar un sistema de notificació desplegable Global

Jo vaig escriure un article per a www.SharePoint.briefing.com titulat"Implementar un sistema de notificació desplegable Global.”  Aquesta funció va ser implementat per un col legi comunitari comunicar-se tancaments de l'escola a causa de la neu i així successivament. 

Utilitza una llista personalitzada, fora de la caixa del SharePoint web serveis i alguns jQuery per fer el treball.

Heus aquí un teaser:

image

Llegeixi la cosa sencera aquí: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin

Prendre el Control del seu correcte i anul·lar botons

Jo vaig escriure Aquest article una estona altra vegada, però sembla no vinculats a ella des del meu blog en el moment, Així que aquí va:

image

Aquest article descriu com forçar newform.aspx redirigir a una sola pàgina quan l'usuari fa clic correcte i una pàgina diferent quan es fa clic Anul·lar.

</final>

Subscriure's al meu blog.

Follow me on Twitter http://www.twitter.com/pagalvin