Arhive de categorii: jQuery şi SharePoint

Depăşi enervant problemă cu URL-uri Relative în Lansarea rapidă SharePoint

Am vrut să adăugaţi un link la lansare rapidă de navigare altă zi şi mi-a spus SharePoint:

image

Versiune text curat de care este:

Asigura că URL-ul este valabil şi începe fie cu un caracter valid (un semn de număr (#) sau bară oblică (/)) sau un protocol valabile acceptate (de exemplu, "http://’, "https://’, "fişier://’, "ftp://’, "mailto:’, ' Ştiri:’).

"Blech şi variola!"Am spus.

Un workaround la acest lucru este de a folosi JavaScript pentru a găsi un link cunoscută în Lansarea rapidă şi de a trece peste comportamentul acestuia.

Pentru a testa acest lucru, Adauga un nou link la site-ul de testare thusly:

image

Am folosit jQuery. La spre solve it, obţine unele JavaScript şi jQuery pe pagina folosind tehnica ta preferată şi cu o linie de cod ca asta:

 

$(document).gata( funcţia () {

    $("o:conţine("Test URL-ul de înlocuire")").faceţi clic pe(funcţia () { alertă("faceţi clic pe schimbat comportamentul!"); reveni fals;});

});

Şi Bob pe unchiul tău.

JQuery selectorul găseşte fiecare <o> Tag-ul care a "Test URL-ul de înlocuire" în numele său. Poate doriţi să găsiţi-ton, care în funcţie de legătura şi astfel.

.click(funcţia() suprascrie orice SharePoint ar fi făcut atunci când utilizatorul face clic pe. Asiguraţi-vă că vă "întoarce false" sau altceva va face lucrurile tale şi apoi încercaţi să href lucru prea, care nu este aproape cu siguranţă scopul tau.

Acest lucru a fost făcut şi testare într-un mediu online SharePoint dar ar trebui să lucreze bine în 2010 şi mai devreme prea.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Simplă şi rapidă: Rezolva "parametru Invalid URL” problema cu UpdateListItems în lists.asmx

Atunci când se lucrează cu UpdateListItems prin intermediul lists.asmx, este uşor pentru a genera eroare:

Parametru invalid URL.

URL-ul furnizat conține o comandă invalidă sau valoare. Vă rugăm să verificaţi URL-ul din nou.

Puteţi obţine această eroare atunci când aţi uitat să includă ID din lista de câmpuri pentru a actualiza.  Acest lucru, ca o mulţime de aceste SP servicii web, este un pic contraintuitiv, deoarece trebuie să includă ID-ul în atributul ID <Metoda> element.  Si nu esti actualizat ID şi, probabil, vrea să niciodată în primul rând.

Acest plic de săpun funcţionează:

<soapenv:Plic xmlns:soapenv ="http://schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Organism>                      
    <UpdateListItems xmlns ="http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <actualizări>                     
         <Lot LaEroare ="Continua">
          <Metoda ID ="1" Cmd ="Update">
            <Numele de câmp ="CooperativeLock">blocat!</Câmp>
            <Numele de câmp ="ID">1</Câmp>
          </Metoda>
        </Lot>                     
        </actualizări>                
      </UpdateListItems>             
  </soapenv:Organism>         
</soapenv:Plic>

Dacă benzi afară ID câmp referinţă apoi veţi primi mesajul "Parametru Invalid URL" enervant.

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

 

Bietul om pe cache în JavaScript

[TL;DR versiune: utilizează module cookie pentru a stoca rezultatele apeluri async; face rezultatele de ultimele apeluri async imediat şi apoi le valida după pagină de încărcare.]

Am fost de lucru pe site-ul SharePoint intranet pentru un client care dispune de, Printre alte lucruri, o navigare secundara stilizate ale căror opţiuni de meniu sunt gestionate prin intermediul o listă particularizată vechi regulate.  Ideea este că clientul ajunge la site-ul "lor" meniu de control fără a afecta sau afectat de navigaţie globală pus de acesta.

(este ceva incredibil subversiv despre adăugarea unui CEWP care indică spre un fişier HTML care încarcă unele CSS şi JS pentru a modifica fundamental aproape totul despre comportamentul unui site... dar asta e pentru un alt post)

Codul pentru acest destul de simplu:

Inflamat la faţa locului aici este că de fiecare dată când cineva loveşte una din paginile site-ului, browser de web care utilizatorul este ajungând pentru a obţine elemente din listă.  Odată ce dev este completă şi testare a dovedit lucruri pentru a fi stabil şi complete, acest apel este necesar mai mult 99% de timp din meniul rareori modificări.  De asemenea, are un efect ciudat UI, care este comună în această lume nouă curajos de hiper-ajaxy site-uri web-pagina face şi abia apoi meniul render.  Este de nervozitate şi distrag atenţia, în opinia mea.  Şi nervozitate. Deci, cache-ul. 

Am modificat logica thusly:

  • Uita-te pentru un cookie în browser-ul care conţine meniul, am citit-o ultima
    • Dacă a întemeia, face imediat.  Nu aşteptaţi pentru ca pagina să termin de încărcare.  (Aveţi nevoie să vă asiguraţi că codul HTML este plasat strategic aici, dar nu este greu pentru a face).
  • Aşteptaţi pentru ca pagina să termin de încărcare şi să facă o asincron apel pentru a încărca până elementele de meniu dintr-o listă utilizând restul sau lists.asmx sau orice altceva
  • Compara ceea ce am primit împotriva cookie
    • Dacă se potriveşte, opreşte-te
    • În caz contrar, folosind jQuery, dinamic popula o grămadă, dacă <li>pe într-o <ul>
  • Utiliza CSS pentru a face toate formatările
  • Profit!

Unii dintre voi sunt de gând să spun, "Hei! nu există nici o reală în cache întâmplă aici deoarece sunteţi de lectură meniul oricum fiecare dată.”  Si ai dreptate-nu sunt oferindu-server nici un fel de pauza.  Dar pentru că apelul este asincron şi se întâmplă după ce pagina iniţială HTML payload face complet, se "simte" mai receptiv la utilizator.  Meniul redă destul de mult ca pagina atrage.  Dacă meniul se intampla la schimbare, utilizatorul este supus la o nervozitate re-trage din meniul, dar numai ca o singură dată.

Există câteva modalităţi de a face acest cache-ul mai eficientă şi de a ajuta server în acelaşi timp:

  • Pune într-o regulă că cache-ul"cookie" este valabil pentru un minim de 24 ore sau unele alt interval de timp. Atâta timp cât nu există nici un cookie-ul expirat, utilizează modulul cookie meniu instantaneu şi niciodată nu a lovit server.

Ei bine... asta e tot ce vin in minte acum :). 

Dacă cineva are vreo idee inteligent aici mi-ar plăcea să le cunoască.

Şi în fine – aceasta tehnica poate fi folosit pentru alte chestii.  Acest client are o serie de lucruri bazate pe date despre diverse pagini, mulţi dintre ei schimbare relativ rar (ca o dată pe săptămână sau o dată pe lună).  Dacă vizaţi domenii specifice de funcţionalitate, puteţi da o mai receptiv UI trăgând conţinut la magazinul local cookie şi redare imediat.  Se simte mai repede utilizatorului, chiar dacă nu salvaţi server orice cicluri.  Tu poate salvaţi în cicluri de server de decide cu privire la unele condiţii şi declanşează pentru a anula acest cache-ul local cookie.  Care este toate situaţionale şi artsy chestii şi într-adevăr cel mai distractiv :). 

</scop>

undefinedAboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

XSLT și jQuery probe

Am făcut o mulţime de XSLT şi jQuery şi gândit aş parts câteva fragmente care alţii pot considera util în viitor.

Exemplu 1: Emite simplu JavaScript / jQuery în XSLT:

<XSL:meci de şablon "ceva =" XML:spaţiu = "conserva">

  <!– Martor interogare prietenos filtrele câmp ascuns –>
  <script-ul de tip = "text/javascript">
    $(document).gata(funcţia(){
      $("#QueryFriendlyFilters").vasilica("gol");
    });
  </script-ul>

</XSL:şablon>

Că pic emite unele JavaScript care aşteaptă pentru ca pagina să termin de încărcare (din cauza $(document).gata(…)) şi seturi de valoarea unui câmp ascuns numit atunci QueryFriendlyFilters la valoarea literal "gol".

Exemplu 2: Utilizarea <XSL:Dacă> pentru a verifica "mai mare",  "mai puţin", etc.

<XSL:meci de şablon "ceva =" XML:spaţiu = "conserva">

  <div id = "fdcAllFilters">
 
    <XSL:Dacă test="@Count>0">
      <span class = "fdcFilterLabel">Filtre de curent:</durata de>
    </XSL:Dacă>

    <!– mai multe lucruri se întâmplă aici. –>

</XSL:şablon>

Fragmentul de mai sus controale pentru a vedea dacă un atribut numit "Conta" a elementului "ceva" este mai mare decât zero.  XML-ul din spatele acest lucru ar fi ceva de genul:”

<ceva Count = "5" />

Exemplu 3: Repeta prin toate elementele, Interspersing jQuery apeluri.

<!– Repeta prin toate filtrele şi afişa corect  link-uri. –>
<XSL:pentru fiecare select = "UserFilter">

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

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

  <script-ul de tip = "text/javascript">

    $(document).gata(funcţia(){
        <XSL:textul><![CDATA[$("#QueryFriendlyFilters").vasilica( ($("#QueryFriendlyFilters").vasilica() + " ]]></XSL:textul>\"<XSL:valoare de select="@FilterValue"/>\"<XSL:textul><![CDATA["));]]></XSL:textul>
    });

  </script-ul>

</XSL:pentru fiecare>

Fragmentul de mai sus este cea mai complexă şi poate fi mai uşor de moduri de a face acest lucru.

XML-ul din spatele acestei arata aproximativ asa:

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

Acest fragment este iterarea prin <UserFilter> noduri. 

El emite mai întâi o ancoră tag-ul care atunci când aţi făcut clic pe invocă o funcţie JavaScript, care este deja pe pagina, "mySubmitPage" şi trece în valoarea de un atribut <UserFilter> nodul numit "ID". 

Ea emite apoi unele jQuery care aşteaptă pentru ca pagina să se încarce.  JQuery care actualizează un câmp ascuns numit "QueryFriendlyFilters" prin adăugarea valorii atributului FilterValue.  Notă toate nebun <XSL:textul> şi <![CDATA[ … ]]> chestii.

Asta este, Sperăm că vă ajută!

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Lists.asmx, GetListItems and Folders

Am făcut unele de cercetare pentru cineva astăzi în jurul web list.asmx serviciului furnizat ca parte din SharePoint 2010 (şi mai devreme).  Ea a fost în măsură pentru a obţine elementele de listă la folderul rădăcină (inclusiv numele subfolderelor), dar nu a putut obţine elemente în sub-pliant.  Am făcut unele privire around pe Internet şi este o chestiune de surprinzător de comune.  Încă, Nu am putut ajunge un răspuns bun la întrebarea simplă, "dacă ştiu folderul, cum a face I a lua elementele în folderul?”  Pentru a fi sincer, Nu încerc toate că greu deoarece mi-am dorit pentru a figura acest una pe propria mea pentru un timp Zâmbet.

Pentru a parametriza acest lucru, Am creat un site numit "Blogging-ul scenarii" şi o listă particularizată numit "Lista cu Sub foldere personalizate".  Apoi am creat foldere numit:

  • An 2005
  • An 2006
  • An 2007

Am adăugat câteva elemente în folderul "Anul 2006".  Aceasta este ceea ce pare ca:

image

Prietenul meu nu este scris în C# cod, dar mai degrabă folosire Java, Deci plicul SĂPUN a fost ceea ce ea într-adevăr nevoie.  Pentru a obţine că, Am scris un pic jQuery şi apoi folosite Scripcarul pentru a obţine conversaţie reale HTTP.

Aici este jQuery relevante (Am copiat codul în jos mai jos dacă doriţi să copiaţi/lipiţi):

image

Au prima cheie este de a include atât un <queryOptions> şi <QueryOptions> nod.  A doua cheie este că <Folder> nodul este un URL la care clientul are acces.

Pot exista alte modalităţi de a obţine acest lucru, dar aceasta a lucrat bine pentru mine când folosind jQuery.

Aici este plicul SĂPUN pentru cele de mai sus:

<soapenv:Plic xmlns:soapenv =’http://schemas.xmlsoap.org/SOAP/envelope/’>                
  <soapenv:Organism>
    <GetListItems xmlns =’
http://schemas.Microsoft.com/SharePoint/SOAP/’>
      <listName>Lista particularizată cu subdosarele</listName>
      <viewFields>  
        <ViewFields>
          <Numele FieldRef =' titlu’ />
          <Numele FieldRef ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Folder>
http://demoserver1/blogging-ul Scenarii/liste/particularizat lista cu Sub foldere/anul 2006</Folder>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Organism>
</soapenv:Plic>

O mulţime de exemple şi discuţii în jurul acest lucru a condus-mi să cred că tot ce am nevoie a fost <QueryOptions> şi specificaţi un nume de folder.  Pentru mine, I nevoie atât wrap-o în interiorul <queryOptions> precum şi specificaţi un URL-ul complet pentru <Folder> nod.

Iată de configurare de AJAX jQuery:

$(document).gata(funcţia() {
       var soapEnv =
           "<soapenv:Plic xmlns:soapenv =’http://schemas.xmlsoap.org/SOAP/envelope/’> \
               <soapenv:Organism> \
                    <GetListItems xmlns =’http://schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <listName>Lista particularizată cu subdosarele</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <Numele FieldRef =' titlu’ /> \
                              <Numele FieldRef ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Folder>http://demoserver1/Blogging Scenarii/liste/particularizat lista cu Sub foldere/anul 2006</Folder> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Organism> \
           </soapenv:Plic>";

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Lists.asmx, GetList şi "valoare nu poate fi nul”

Am descoperit astăzi că GetList() metoda în lists.asmx serviciu Web trebuie să fie numit foarte atent sau este predispus să arunce un misterios "Valoare nu poate fi null" excepţie (şi care este presupunând că puteţi obţine trecut chiar mai rău mesajul generic de eroare, "Excepţie de tip" Microsoft.SharePoint.SoapServer.SoapServerException’ a fost aruncat.")  În mod specific, Am constatat că nu pot oferi nici un fel de prefix pe metoda GetList.  Următorul fragment jQuery ilustrează punctul:

image

Dacă faci asta, serviciul web răspunde cu "Valoare nu poate fi null" ca pe acest lautar-furnizate HTTP transcriere:

<?XML version = "1.0" codificare = "utf-8"?>
  <săpun:Plic
     xmlns:săpun ="
http://schemas.xmlsoap.org/SOAP/envelope/"    
     xmlns:XSi = "
http://www.w3.org/ 2001/XMLSchema-exemplu
     xmlns:XSD ="
http://www.w3.org/ 2001/XMLSchema">

  <săpun:Organism>
    <săpun:Vina>
      <faultCode>săpun:Server</faultCode>
      <faultString>
        Excepţie de tip "Microsoft.SharePoint.SoapServer.SoapServerException’ a fost aruncat.
      </faultString>
      <detaliu>
        <errorstring xmlns ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Valoarea nu poate fi nul.
        </errorstring>
      </detaliu>
    </săpun:Vina>
  </săpun:Organism>
</săpun:Plic>

desigur, tu, probabil, nu ar adăuga că prefixul "s0" pe cont propriu, dar unele instrumente sunt predispuse să facă acest lucru (ca Eclipse).

Acest lucru este tot mai confuz / frustrant deoarece alte metode tolera prefixe.  De exemplu, The GetListCollection metoda nu minte dacă acesta este fost prefixate, chiar şi cu prostii prefixele ca "xyzzy":

image

Aceasta "valoare nu poate fi null" pare destul de comune cu lists.asmx deci sperăm că acest lucru va ajuta pe cineva afară în viitor.

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Imbricarea la nesfârşit <div> Tag-uri şi jQuery

Acest lucru pare a fi un astfel de subiect de aiurit, Nu sunt sigur că merită cu adevărat blogging-ul despre, dar că niciodată nu a oprit mine înainte, Deci, aici vom merge Zâmbet

Am de lucru un proiect în cazul în care eu sunt trăgând unele date dintr-o căutare, ambalare-l într-un mesaj XML şi apoi că XML este transformat în cele din urmă în HTML prin intermediul XSLT.  Există o mulţime de jQuery implicate, un pic de care implementeaza anumite funcţionalităţi tabbing.  Când faceţi clic pe o filă (chiar, o <div>), jQuery invocă .hide() şi .show() pe diverse divs (pagină iniţială de încărcare descărcări toate conţinut, astfel încât nu există nici o postback în acest caz).

O grămadă de ore în urmă, fila logica de comutare a început să se comporte haotic şi aceasta nu s-ar arăta unul de meu file.  Am în cele din urmă urmărite l până la faptul că internet explorer (cel puțin) crezut că <div> Tag-uri imbricate departe, mult mai profunde decât destinate.Bara de instrumente producător ar arăta:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— în cele din urmă arătând că a fost închis tot drumul în jos aici!

Deci, dacă am făcut-o $("#Tab1Content").ascunde(), Am, de asemenea, s-ar ascunde Fila2 şi ar putea arăta niciodată Fila2 dacă nu arăt, de asemenea, Fila1.  Am copiat şi inserat codul în visual studio şi ea a arătat toate div garnitură până frumos, la fel ca ei ar fi trebuit să faci, în căutarea de genul asta:

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

Am batut capul meu de perete pentru un timp şi am observat că în real HTML codul a fost generatoare de o mulţime de gol <div> Tag-uri, ca:

<corpul>

  <div id = "Tab1Content">

    <div id = "row1" />
    <div id = "rînd2" />

  </div>

  <div id = "Tab2Content">

    <div id = "row1" />
    <div id = "rînd2" />

  </div>

</corpul>

(De mai sus este waaaaaaaaaaaay simplificat.  Gol div Tag-uri sunt complet valide. Unele dintre meu <div> Tag-uri au fost plin de conţinut, dar mult mai multe nu au fost.  Am venit la realizarea că meu <XSL:pentru fiecare> Directivele au fost emit scurt-forma div Tag-uri atunci când xsl:nu pentru fiecare "găseşte orice date.  Am forţat un comentariu HTML în ieşire, ca:

image

 

După ce am făcut-o, div aliniat frumos şi fila mea de comutare a început să lucreze.

Ca întotdeauna, Sper că acest lucru ajută pe cineva într-o priză.

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Încă mai multe jQuery–Redimensionaţi un exemplu de imagine

Am moştenit o parte web de la un client vechi furnizor si are o problema cu marimea imaginii.  Imaginile ar trebui să fie 60×50 dar pentru un motiv ciudat, producătorul original le forţat în 42×42, astfel încât acestea uita strivită:

 

Bună imagine

Bad Image

Aici este markup (oarecum simplificată):

<tabelul clasa = "extins-outlook">
  <tHead>
    <TR>
      <th  latime ='100′>3 Marţi</th>
    </TR>
  </tHead>

  <tBody>
    <TR clasa = "previziuni">
      <TD lăţime ='100′>
        <ul>
          <li clasa = 'mare'>Mare: 72&deg;F</li>
          <li clasa = 'mici'>Low: 44&deg;F</li>
          <li clasa = 'stare'>Însorit
            <img src =’
http://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/en/trans/cond007.png’ latime ='42’ inaltime ='42’ alt =” />
          </li>
        </ul>
      </TD>
    </TR>

  </tBody>

</tabel>

Veţi notă că chiar dacă calea către imaginea în sine Afişează dimensiunea corectă (60×50) producătorul original forţat-o în 42×42.  de ce?  nebun.

Oricum, Am vrut o soluţie rapidă şi uşoară la această problemă şi am apelat la jQuery.  Trucul a fost de a localiza toate corespunzătoare <IMG> Tag-uri.  Nu am vrut să muck despre cu orice alte img tag-uri (din care există multe).  Acest pic de jQuery a făcut truc:

<script-ul de tip = text/javascript"" src ="http://AJAX.googleapis.com/Ajax/libs/jQuery/1.5/jQuery.min.js"></script-ul>

<script-ul de tip = "text/javascript">
     $(document).gata(funcţia () {

         $("li.condition > img ").fiecare(funcţia (Indicele, element)
           
{
             $(element).CSS("lăţime", "60"); 
             $(element).CSS("înălţime", "50");
            });
     }); // pe documentul de încărcare
</script-ul>

Că pic de cod constată Colectia <li> Tag-uri ale căror clasă este "stare" şi <IMG> copii.  Acesta reiterează apoi prin toate că.  Worked asemãnãtor un acuzaþie.

Eu, probabil, ar putea simplifica l, dar niciodată nu a fost un fel de tip unix care π a rezolvat pentru a 18 cifre precizie folosind sed şi awk şi eu nu sunt ca un fel, în cazul în care jQuery tip fie Zâmbet.

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Punerea în aplicare a unui sistem Global de notificare Pop-up

Am scris un articol pentru www.SharePoint.briefing.com intitulată"Punerea în aplicare a unui sistem Global de notificare Pop-up.”  Această funcţie a fost pusă în aplicare pentru o comunitate colegiu să comunice şcoală inchideri datorită zăpadă şi aşa mai departe. 

Se utilizează o listă particularizată, afară de la cutie SharePoint web servicii şi jQuery unele a face munca.

Aici este un teaser:

image

Citiţi totul aici: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin

Preia controlul asupra ta OK şi anula butoane

Am scris Acest articol un timp înapoi, dar se pare ca nu leagă să-l la blog-ul meu în timp, asa ca aici merge:

image

Acest articol descrie cum la spre force newform.aspx pentru a redirecţiona o pagină atunci când utilizatorul face clic pe OK şi o altă pagină atunci când ea face clic pe Revocare.

</scop>

Aboneaza-te la blog-ul meu.

Urmaţi-mă pe Twitter, la http://www.twitter.com/pagalvin