Categorie Archieven: jQuery en SharePoint

Overwinnen van vervelende probleem met relatieve URL's in SharePoint Quick Launch

Ik wilde een link toevoegen naar de vlug barkas navigatie de andere dag en SharePoint vertelde me:

image

Pure tekstversie van die is:

Ervoor zorgen dat de URL geldig is en met ofwel een geldig teken begint (een hekje (#) of schuine streep naar voren (/)) of een geldige ondersteund protocol (bijvoorbeeld, ' http://’, ' https://’, ' bestand://’, ' ftp://’, ' mailto:’, ' Nieuws:’).

"Blech en pox!"Ik zei.

Een alternerende actie aan dit is het gebruik van JavaScript te vinden van een bekende link in de werkbalk Snel starten en haar gedrag te overschrijven.

Om dit te testen, een nieuwe koppeling toevoegen aan uw testsite thusly:

image

Ik gebruikte jQuery. Te lossen, Krijg sommige JavaScript en jQuery naar de pagina met behulp van uw favoriete techniek en met een lijn van code zoals dit:

 

$(document).klaar( functie () {

    $("een:bevat('Test URL vervanging')").Klik op(functie () { waarschuwing("gewijzigde klik gedrag!"); terugkeer vals;});

});

En Bob's uw oom.

De jQuery selector vindt elke <een> label die "Test URL vervanging" in haar naam heeft. U kunt zoeken-melodie die afhankelijk van uw link en dergelijke.

De .Klik(functie() overschrijft wat SharePoint zou hebben gedaan wanneer de gebruiker heeft geklikt. Zorg ervoor dat u 'return false' of anders zal het doen van je spullen en dan proberen aan de href ding ook, Wat is vrijwel zeker niet uw doel.

Dit werd gedaan en test in een SharePoint online-omgeving maar moet werken goed in 2010 en eerder te.

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Snelle en eenvoudige: "Ongeldige URL-Parameter oplossen” probleem met UpdateListItems in lists.asmx

Bij het werken met UpdateListItems via lists.asmx, het is gemakkelijk voor het genereren van de fout:

Ongeldige URL-Parameter.

De URL bevat een ongeldige opdracht of waarde. Controleer of de URL weer.

U kunt deze fout krijgen wanneer u vergeet te vermelden-ID in de de lijst met velden om te werken.  Dit, net als een heleboel deze SP webservices, is een beetje contra-intuïtief omdat u moet omvatten de ID in het ID-kenmerk van de <Methode> element.  En je bent niet bijgewerkt ID en waarschijnlijk nooit willen in de eerste plaats.

Deze SOAP-envelop werkt:

<soapenv:Envelop xmlns:soapenv =' http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Lichaam>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/soap/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <updates>                     
         <Batch OnError ="Blijven">
          <Methode ID ="1" Cmd ="Update">
            <Veldnaam ="CooperativeLock">vergrendeld!</Veld>
            <Veldnaam ="ID">1</Veld>
          </Methode>
        </Batch>                     
        </updates>                
      </UpdateListItems>             
  </soapenv:Lichaam>         
</soapenv:Envelop>

Als u uit de veldverwijzing ID strippen dan krijg je het vervelend bericht "Ongeldig URL-parameter".

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

 

Arme Man de Caching in JavaScript

[TL;DR versie: gebruik van cookies voor het opslaan van de resultaten van asynchrone oproepen; de resultaten van afgelopen async oproepen onmiddellijk renderen en vervolgens valideren ze na het laden van de pagina.]

Ik heb gewerkt op SharePoint intranet-site voor een client die functies, onder andere, een gestileerde secundaire navigatie waarvan menu-opties worden beheerd via een regelmatige oude aangepaste lijst.  Het idee is dat de client krijgt om "hun" site systeemmenu zonder te tasten of wordt beïnvloed door de wereldwijde navigatie stak door het.

(Er is iets ongelooflijk subversieve over het toevoegen van een CEWP die verwijst naar een HTML-bestand dat ladingen sommige CSS en JS fundamenteel veranderen bijna alles over van een site probleem... maar dat is voor een andere post)

De code voor dit vrij eenvoudig:

De zere plek hier is dat elke keer als iemand hits een pagina van de site, webbrowser van die gebruiker is het bereiken uit om items uit de lijst.  Zodra dev voltooid is en dingen te testen heeft bewezen stabiel en voltooien, deze oproep is onnodig meer dan 99% van de tijd sinds het menu zelden verandert.  Heeft ook een raar UI invloed die gebruikelijk is in deze heerlijke nieuwe wereld van hyper-ajaxy websites-de pagina maakt en alleen dan heeft het menu maken.  Het is zenuwachtig en afleidend in mijn mening.  En zenuwachtig. Dus, opslaan in de cache. 

Ik heb gewijzigd de logica thusly:

  • Zoek naar een cookie in de browser die het menu bevat als ik laatst lezen
    • Als gevonden, maken het onmiddellijk.  Wacht niet op de pagina te laden voltooien.  (U moet ervoor zorgen dat uw HTML-code wordt strategisch geplaatst hier, maar het is niet moeilijk om te doen).
  • Wachten op de pagina te laden voltooien en maak een async oproepen voor vracht opwaarts menu-items uit een lijst met behulp van REST of lists.asmx of wat dan ook
  • Vergelijken wat ik heb tegen de cookie
    • Als het overeenkomt met, STOP
    • Anders, met behulp van jQuery, dynamisch vullen een bos als <Li>de in een <UL>
  • Gebruik CSS te doen alle opmaak
  • Winst!

Sommigen van u zullen zeggen, "hey! Er is geen echte in het voorgeheugen onderbrengende gaat hier omdat je het lezen van het menu hoe dan ook elke keer.”  En je hebt gelijk-ik ben niet het geven van de server elke soort pauze.  Maar omdat de oproep async is en gebeurt na de pagina's eerste HTML-nettolading volledig maakt, het voelt"" ontvankelijker voor de gebruiker.  Het menu maakt vrij veel als de pagina vestigt.  Als het menu aan de verandering gebeurt, de gebruiker is onderworpen aan een zenuwachtig opnieuw te tekenen van het menu, maar slechts die één keer.

Er zijn een aantal manieren aan deze cache doeltreffender maken en helpen de server op hetzelfde moment:

  • Zet in een regel dat de cache"cookie" geldig voor een minimum van is 24 uren of sommige andere tijdsbestek. Zolang er geen verlopen cookie is, gebruik van de cookie menu momentopname en nooit hit de server.

Nou... dat is alles wat die te binnen schieten nu :). 

Als iemand slimme ideeën hier heeft zou ik graag willen weten ze.

En tot slot – deze techniek kan worden gebruikt voor andere dingen.  Deze client pagina heeft een aantal data-gedreven dingen op verschillende pagina 's, velen van hen veranderen relatief zelden (zoals een keer per week of eenmaal per maand).  Als u zich richten op specifieke gebieden van functionaliteit, u kunt een meer responsieve UI geven door trekken inhoud uit de lokale cookie store en meteen renderen.  Het voelt sneller aan de gebruiker, zelfs als u niet de server elke cycli opslaat.  U kan Sla de server cycli door te besluiten op een aantal voorwaarden en triggers om deze lokale cookie cache ongeldig te maken.  Dat is allemaal situationele en kunstzinnige spullen en echt de leukste :). 

</einde>

undefinedAbonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

XSLT- en jQuery monsters

Ik heb gedaan een heleboel van XSLT- en jQuery en dacht dat ik zou delen een paar fragmenten die anderen in de toekomst nuttig kunnen vinden.

Voorbeeld 1: Eenvoudige JavaScript uitstoten / jQuery in XSLT:

<XSL:sjabloon match = "iets" XML:ruimte = "behouden">

  <!– Uit de query vriendelijke filters verborgen veld leeg –>
  <script type = "text/javascript">
    $(document).klaar(functie(){
      $("#QueryFriendlyFilters").Val("lege");
    });
  </script>

</XSL:sjabloon>

Dat beetje stoot sommige JavaScript die op de pagina wacht te laden voltooien (vanwege de $(document).klaar(…)) en vervolgens sets de waarde van een verborgen veld genaamd QueryFriendlyFilters aan de letterlijke waarde "leeg".

Voorbeeld 2: Gebruik <XSL:Als> om te controleren 'groter dan',  "minder dan", etc.

<XSL:sjabloon match = "iets" XML:ruimte = "behouden">

  <div id = "fdcAllFilters">
 
    <XSL:Als test="@Count>0">
      <klasse omspannen = "fdcFilterLabel">Huidige filters:</span>
    </XSL:Als>

    <!– meer dingen gebeurt hier. –>

</XSL:sjabloon>

Het bovenstaande fragment wordt gecontroleerd als een kenmerk met de naam "Count" van het "iets" element groter dan nul is.  De XML achter dit zou iets willen:”

<iets Count = "5" />

Voorbeeld 3: Alle elementen doorlopen, interspersing jQuery oproepen.

<!– Alle filters doorlopen en weer de juiste  koppelingen. –>
<XSL:for-each select = "UserFilter">

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

  <klasse omspannen = "fdcFilterLabel"><XSL:waarde-van select="@FilterValue"/></span>

  <script type = "text/javascript">

    $(document).klaar(functie(){
        <XSL:tekst><![CDATA[$("#QueryFriendlyFilters").Val( ($("#QueryFriendlyFilters").Val() + " ]]></XSL:tekst>\"<XSL:waarde-van select="@FilterValue"/>\"<XSL:tekst><![CDATA["));]]></XSL:tekst>
    });

  </script>

</XSL:for-each>

Het bovenstaande fragment is de meest complexe en kunnen er eenvoudiger manieren om het te doen.

De XML achter dit ziet er ongeveer als volgt:

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

Dit fragment is sequentieel doorzoeken <UserFilter> knooppunten. 

Het eerste stoot een anker tag die, wanneer geklikt roept een JavaScript-functie die is al op de pagina, "mySubmitPage" en geeft de waarde van een kenmerk op de <UserFilter> knooppunt met de naam "ID". 

Het straalt dan sommige jQuery die op de pagina wacht te laden.  Een verborgen veld met de naam "QueryFriendlyFilters" door de waarde van het kenmerk FilterValue bijgewerkt dat jQuery.  Opmerking alle de gekke <XSL:tekst> en <![CDATA[ … ]]> spullen.

Dat is het, hoop dat het helpt!

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Lists.asmx, GetListItems en mappen

Ik deed wat onderzoek voor iemand vandaag rond de list.asmx webservice geleverd als onderdeel van SharePoint 2010 (en eerder).  Ze kon krijgen de lijstitems op de root-map (met inbegrip van de namen van de submappen), maar kon niet items in submappen.  Ik deed wat rondkijken op de internets en het is een verrassend gemeenschappelijke vraag.  Nog, Ik kon niet krijgen een goed antwoord op de eenvoudige vraag, "als ik weet dat de map, Hoe krijg ik de items in de map?”  Om eerlijk te zijn, Ik heb niet proberen zo hard aangezien ik figuur dit één uit op mijn eigen voor een tijdje wilde Glimlach.

Dit instellen, Ik heb een site met de naam "Bloggen scenario's" en een aangepaste lijst genaamd "Aangepaste lijst met Sub Folders".  Ik vervolgens mappen met deze naam gemaakt:

  • Jaar 2005
  • Jaar 2006
  • Jaar 2007

Ik een paar items toegevoegd aan de map "Year 2006".  Dit is wat het als kijkt:

image

Mijn vriend is niet C# code te schrijven maar eerder met behulp van Java, dus de SOAP-envelop wat ze echt nodig was.  Om dat te krijgen, Ik schreef een beetje van jQuery en vervolgens fiddler gebruikt om de werkelijke HTTP gesprek.

Hier is het relevante jQuery (Ik heb de code gekopieerd naar beneden hieronder als u wilt kopiëren en plakken):

image

Zij eerste sleutel is om zowel een <queryOptions> en <QueryOptions> knooppunt.  De tweede sleutel is dat de <Map> knooppunt is een URL waarnaar de client toegang heeft.

Kunnen er andere manieren om dit te krijgen, maar dit werkte goed voor mij toen met behulp van jQuery.

Hier is de SOAP-envelop voor de bovenstaande:

<soapenv:Envelop xmlns:soapenv =’http://schemas.xmlsoap.org/soap/envelope/’>                
  <soapenv:Lichaam>
    <GetListItems xmlns =’
http://schemas.Microsoft.com/SharePoint/SOAP/’>
      <listName>Aangepaste lijst met submappen</listName>
      <viewFields>  
        <ViewFields>
          <FieldRef naam =' titel’ />
          <FieldRef naam ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Map>
http://demoserver1/bloggen Scenario's / lijsten/aangepaste lijst met Sub mappen/jaar 2006</Map>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Lichaam>
</soapenv:Envelop>

Een heleboel voorbeelden en discussie rond dit leidde me om te geloven dat alles wat ik nodig was <QueryOptions> en geef een mapnaam.  Voor mij, Ik nodig beide wikkel het binnen <queryOptions> zo goed als een volledig gekwalificeerde URL opgeven voor de <Map> knooppunt.

Hier is de setup jQuery AJAX:

$(document).klaar(functie() {
       var soapEnv =
           "<soapenv:Envelop xmlns:soapenv =’http://schemas.xmlsoap.org/soap/envelope/’> \
               <soapenv:Lichaam> \
                    <GetListItems xmlns =’http://schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <listName>Aangepaste lijst met submappen</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef naam =' titel’ /> \
                              <FieldRef naam ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Map>http://demoserver1/Blogging Scenario's / lijsten/aangepaste lijst met Sub mappen/jaar 2006</Map> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Lichaam> \
           </soapenv:Envelop>";

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Lists.asmx, GetList en "waarde kan niet null”

Ik ontdekte vandaag dat de GetList() methode in lists.asmx web-service moet zeer zorgvuldig worden genoemd of het is gevoelig voor het gooien van een mysterieuze "Waarde null kan niet" uitzondering (en dat de veronderstelling dat kunt u voorbij het nog erger algemene foutbericht, "Uitzondering van het type ' Microsoft.SharePoint.SoapServer.SoapServerException’ werd gegooid.")  Specifiek, Ik vond dat u niet elke vorm van voorvoegsel te op de GetList-methode verstrekken.  De volgende jQuery fragment illustreert het punt:

image

Als u dat doen, de webservice reageert met "Waarde kan niet null" als per dit Fiddler-geboden HTTP transcript:

<?XML version = "1.0" encoding = "utf-8"?>
  <zeep:Envelop
     xmlns:zeep ="
http://schemas.xmlsoap.org/soap/envelope/"    
     xmlns:XSi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <zeep:Lichaam>
    <zeep:Schuld>
      <FaultCode>zeep:Server</FaultCode>
      <FaultString>
        Uitzondering van het type ' Microsoft.SharePoint.SoapServer.SoapServerException’ werd gegooid.
      </FaultString>
      <detail>
        <ErrorString xmlns ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Waarde kan niet null.
        </ErrorString>
      </detail>
    </zeep:Schuld>
  </zeep:Lichaam>
</zeep:Envelop>

Natuurlijk, u niet zou waarschijnlijk toevoegen dat "s0" voorvoegsel op uw eigen, maar sommige tools zijn geneigd om het te doen (zoals Eclipse).

Dit is des te meer verwarrend / frustrerend omdat andere methoden voorvoegsels tolereren.  Bijvoorbeeld, de GetListCollection methode erg niet als het wordt zijn voorafgegaan, zelfs met onzin voorvoegsels zoals "xyzzy":

image

Dit "waarde null kan niet" lijkt vrij algemeen met lists.asmx dus hopelijk dit iemand uit in de toekomst helpen zal.

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Eindeloos nesten <div> Tags en jQuery

Dit lijkt een excentrieke onderwerp, Ik ben niet zeker dat het is echt de moeite waard bloggen over, maar dat heeft nooit gestopt me vóór, Dus hier gaan we Glimlach

Ik ben uit te werken op een project waar ik te sommige gegevens uit een zoekopdracht trekken ben, verpakking het omhoog in een XML-bericht en vervolgens dat XML wordt uiteindelijk omgezet in HTML via XSLT.  Er is een heleboel jQuery betrokken, een beetje waarvan sommige tabben functionaliteit implementeert.  Wanneer u klikt op een tabblad (echt, een <div>), jQuery roept .hide() en .show() op diverse divs (de eerste pagina geladen gedownload alle inhoud, zodat er in dit geval geen terugsturen zijn).

Een heleboel uren geleden, het tabblad schakelen logica begon te gedragen onregelmatig en het zou niet een van mijn tabs tonen.  Ik uiteindelijk gevolgd het neer op het feit dat internet explorer (ten minste) dacht dat de <div> Tags genest ver, veel dieper dan bestemd.De werkbalk ontwikkelaar zou weergeven:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— Ten slotte tonen het helemaal naar beneden hier werd gesloten!

Dus, Als ik deed een $("# Tab1Content").verbergen(), Ik zou ook Tab2 verbergen en ik kon nooit tonen Tab2 als ik niet ook Tab1.  Ik gekopieerd en geplakt de code omhoog in visual studio en het bleek alles voor de div's voering tot keurig, net als zij waren verondersteld om te doen, op zoek als dit:

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

Ik sloeg mijn hoofd tegen de muur voor een tijdje en gemerkt dat in de werkelijke HTML code is het genereren veel van lege <div> Tags, zoals:

<lichaam>

  <div id = "Tab1Content">

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

  </div>

  <div id = "Tab2Content">

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

  </div>

</lichaam>

(Het bovenstaande is waaaaaaaaaaaay gesimplificeerd.  De lege div-tags zijn volkomen geldig. Sommige van mijn <div> Tags waren vol van inhoud, maar veel meer waren niet.  Ik kwam tot het besef dat mijn <XSL:for-each> richtlijnen werden de korte vorm uitstoten div tags wanneer de xsl:for-each niet ' gegevens vinden.  Ik gedwongen een HTML-commentaar in de output, zoals:

image

 

Nadat ik deed dat, alle de div's mooi opgesteld en begon te werken mijn tabblad schakelen.

Zoals altijd, Ik hoop dat dit helpt iemand in een snuifje.

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Nog meer jQuery–Een voorbeeld van de Image Resize

Ik een webonderdeel geërfd van de oude leverancier van een klant en het heeft een imagoprobleem grootte.  De beelden moeten worden 60×50 maar voor sommige vreemde reden, de originele leverancier hen gedwongen 42×42, dus kijken ze geplet:

 

Goed imago

Slecht beeld

Hier is de markering (enigszins vereenvoudigd):

<tabel klasse = 'uitgebreid-outlook'>
  <THEAD>
    <tr>
      <th  breedte ='100′>3 Dinsdag</th>
    </tr>
  </THEAD>

  <TBODY>
    <klasse tr = 'forecast'>
      <TD breedte ='100′>
        <UL>
          <Li klasse = 'hoog'>Hoge: 72&DEG;F</Li>
          <Li klasse = "laag">Lage: 44&DEG;F</Li>
          <Li klasse = 'voorwaarde'>Zonnig
            <img src =’
http://deskwx.WeatherBug.com/images/Forecast/icons/localized/60×50/en/trans/cond007.png’ breedte ='42’ hoogte ='42’ ALT =” />
          </Li>
        </UL>
      </TD>
    </tr>

  </TBODY>

</tabel>

U zult merken dat hoewel de pad naar de afbeelding zelf toont de juiste dimensie (60×50) de originele leverancier gedwongen het in 42×42.  Waarom?  Gek.

Hoe dan ook, Ik wilde een snelle en gemakkelijke oplossing voor dit probleem en ik draaide me om jQuery.  De truc was om te zoeken alle van de passende <img> Tags.  Ik wilde niet met alle andere img-tags over muck (dat zijn er veel).  Deze bits van jQuery did naar de truc:

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

<script type = "text/javascript">
     $(document).klaar(functie () {

         $(' li.condition > img').elke(functie (index, item)
           
{
             $(item).CSS("breedte", "60"); 
             $(item).CSS("hoogte", "50");
            });
     }); // op document laden
</script>

Dat beetje van code vindt de collectie <Li> Tags waarvan klasse is "voorwaarde" en <img> kinderen.  Vervolgens doorlopen dat allemaal.  Werkte als een charme.

Ik zou waarschijnlijk het stroomlijnen, maar ik was nooit een de soort unix-kerel die opgelost π Aan 18 cijfers precisie met behulp van sed en awk en ik ben niet dat soort als jQuery guy hetzij Glimlach.

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Uitvoering van een wereldwijd systeem voor pop-kennisgeving

Ik schreef een artikel voor www.SharePoint.briefing.com getiteld"Uitvoering van een wereldwijd systeem voor pop-kennisgeving.”  Deze functie werd geïmplementeerd voor een community college school sluitingen dankzij sneeuw enzovoort communiceren. 

Het maakt gebruik van een aangepaste lijst, out of the box SharePoint web diensten en sommige jQuery te doen het werk.

Hier is een teaser:

image

Lees het hele ding hier: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin

Neem controle van uw OK en annuleren knoppen

Ik schreef in dit artikel een tijdje terug, maar het lijkt erop dat ik niet aan het koppelen van mijn blog op het moment, Dus hier gaat:

image

Dit artikel beschrijft hoe te dwingen newform.aspx omleiden naar één pagina wanneer de gebruiker op OK en een andere pagina als ze op Annuleren klikt.

</einde>

Abonneren op mijn blog.

Volg mij op Twitter op http://www.twitter.com/pagalvin