Категория Архиви: jQuery и SharePoint

Преодоляване на досаден проблем с относителни URL адреси в SharePoint бързо стартиране

Аз исках да добавите връзка към бърз хвърлям навигация онзи ден и SharePoint ми каза:

image

Чист текст версия на която е:

Гарантира, че URL Адресът е валиден и започва с или е валиден знак (знак за номер (#) или наклонена черта (/)) или валиден поддържа протокол (за пример, ' http://’, "https://’, "файл://’, "ftp://’, "mailto:’, "новини:’).

"Blech и шарка!Аз казах:.

A workaround към това е да използвате JavaScript, за да намерите линк, известен в бързо стартиране и промените му поведението.

За да проверите това, Добавяне на нова връзка към вашия тест сайт thusly:

image

Аз бях jQuery. Да го решим, Махни някои JavaScript и jQuery върху страницата с любимите си техника и с линия на код като този:

 

$(документ).готов( функция () {

    $("а:съдържа("Тест URL подмяна")").щракнете върху(функция () { предупреждение("промяна щракване поведение!"); връщане фалшиви;});

});

И чичо Боб.

Избора на jQuery намира всеки <а> етикет, който е "Тест URL подмяна" в името си. Вие може да искате да намерите-мелодия, която в зависимост от вашата връзка и такива.

Кликнете(функция() отменя каквото SharePoint би направил, когато потребителят кликне. Се уверете, че сте "върне false" или пък ще направи нещата си и след това се опитайте да href нещо твърде, което почти сигурно не е вашата цел.

Това е направено и изследването в онлайн среда на SharePoint, но трябва да работи добре в 2010 и по-рано твърде.

</край>

undefinedАбонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Бърз и прост: Решаване на "Невалиден URL параметър” проблем с UpdateListItems в lists.asmx

Когато се работи с UpdateListItems чрез lists.asmx, лесно е да се генерира грешка:

Невалиден URL адрес параметър.

Предоставеният URL адрес съдържа невалидна команда или стойност. Проверете URL адреса отново.

Можете да получите тази грешка, когато сте пропуснали да включи ИД в списъка с полета за актуализиране.  Това, Подобно на много от тези SP уеб услуги, е малко counterintuitive, тъй като трябва да включва ИД в атрибут на ИД <Метод> елемент.  И не сте актуализира ИД и вероятно никога няма да искате да на първо място.

Този сапун плик работи:

<soapenv:Плик xmlns:soapenv =' http://schemas.xmlsoap.org/SOAP/Envelope/ ">
  <soapenv:Тяло>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/ ">                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <актуализации>                     
         <Пакетно OnError ="Продължи">
          <Метод ИД ="1" CMD ="Update">
            <Полето Име ="CooperativeLock">заключена!</Поле>
            <Полето Име ="ИД">1</Поле>
          </Метод>
        </Пакетно>                     
        </актуализации>                
      </UpdateListItems>             
  </soapenv:Тяло>         
</soapenv:Плик>

Ако ленти, препратка за поле ИД тогава вие ще получите досадно съобщение за "Невалиден URL параметър".

</край>

undefinedАбонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

 

Бедният човек на кеширане в JavaScript

[TL;Д-р версия: използва бисквитки за да съхранява резултатите от async повиквания; сравнимостта на резултатите от минали async повиквания веднага и след това ги утвърждава след зареждане на страницата.]

Съм бил на работа в интранет сайта на SharePoint за клиент, което функции, наред с други неща, стилизирана допълнителна навигация, чието меню опции се управляват чрез редовни стар списък по избор.  Идеята е, че клиентът получава за контрол на сайта "тяхната" меню без чувства или са засегнати от глобалната навигационна, изведен от нея.

(има нещо невероятно подривни за добавянето на CEWP, който сочи към HTML файл, който зарежда някои CSS и JS да променят фундаментално почти всичко за поведението на даден сайт..., но това е за друг пост)

Кодът за тази доста проста:

  • Изчакайте страницата да завърши зареждането и асинхронно повикване към товаря горе меню елементи от списък с помощта на почивка или lists.asmx или каквото и
  • Използване на jQuery, динамично пренесат китка, ако <Li>снимки на вътре родител <UL> (Вижте Кристиан Pinder статия тук за опростено обяснение на това tecnnique)
  • Използвайте CSS за цялото форматиране
  • Печалба!

Възпалено място тук е, че всеки път, когато някой удари един от страници на сайта, този потребител уеб браузър се достига до получите елементи от списъка.  След като dev е пълна и изпитване е доказано неща, за да бъде стабилна и пълна, тази покана е необходимо повече от 99% на времето, тъй като менюто рядко промени.  Тя също има странни UI влияние, което е често срещани в този смел нов свят на хипер-ajaxy уеб сайтове – страницата се рендира и само тогава прави менюто.  Той е нервен и разсейващи по мое мнение.  И нервност. Така, кеширане. 

Аз промяна логиката thusly:

  • Потърсете "бисквитка" в браузъра, която съдържа менюто, тъй като аз последно го прочетете
    • Ако намерени, направи го веднага.  Не чакайте за страницата, за да завърши зареждането.  (Трябва да се уверете, че HTML е стратегическо място тук, но това не е трудно да се направи).
  • Изчакайте страницата да завърши зареждането и асинхронно повикване към товаря горе меню елементи от списък с помощта на почивка или lists.asmx или каквото и
  • Сравнете това, което получих срещу бисквитката
    • Ако тя съвпада, Стоп
    • В противен случай, използване на jQuery, динамично пренесат китка, ако <Li>снимки на в <UL>
  • Използвайте CSS за цялото форматиране
  • Печалба!

Някои от вас ще кажат, "Ей! Няма реален кеширане връщане тук, тъй като вие сте четене на менюто все пак всеки път.”  И вие сте прав-не съм дава сървъра всякакъв вид на почивка.  Но тъй като повикването е готино и се случва след първоначалните констатации на страницата HTML payload напълно прави, Той се "чувства" по-отзивчиви към потребителя.  Менюто прави доста много, тъй като страницата равенства.  Ако менюто се случва с промяната, потребителят е подложен на нервност водих на менюто, но само че едно време.

Има няколко начина да направите това кеширане по-ефективно и да помогне на сървъра в същото време:

  • В едно правило, че кеша на"бисквитка" е валиден за най-малко 24 часове или някои други срокове. Както дълъг както там е не издишвам бисквит, Използвайте бисквитка меню снимка и никога не хит на сървъра.

Ами..., това е всичко, което дойде на ум в момента :). 

Ако някой има някакви умни идеи тук бих искал да ги знаят.

И на последно място-тази техника може да се използва за други неща.  Този клиент страница има няколко неща, данни задвижване на различни страници, много от тях промяна сравнително рядко (като веднъж седмично или веднъж месечно).  Ако насочвате конкретни области на функционалност, Можете да дадете по-отзивчиви потребителски интерфейс чрез издърпване на съдържанието от местните бисквитка се съхранява и оказване незабавно.  Той се чувства по-бързо за потребителя дори ако не записвате сървъра всички цикли.  Вие може да запишете на сървъра цикли от вземане на решение за някои условията и предпоставките да обезсили кеш тази местна бисквитка.  Това е всички ситуационни и artsy неща и наистина най-забавно :). 

</край>

undefinedАбонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

XSLT и jQuery проби

Аз са били правиш много XSLT и jQuery и мисленето, аз ще сподели няколко откъси, които други може да намерите за полезни в бъдеще.

Пример 1: Излъчват прости JavaScript / jQuery в XSLT:

<XSL:шаблон за съвпадение = "нещо" XML:космически = "запазите">

  <!– "Празно" е приятелски заявката филтрира скрито поле –>
  <скриптови тип = "текст/javascript">
    $(документ).готов(функция(){
      $("#QueryFriendlyFilters").вал("празно");
    });
  </скрипт>

</XSL:шаблон>

Този бит излъчва някои JavaScript, която изчаква на страницата, за да завърши зареждането (поради $(документ).готов(…)) и след това определя стойността на скрито поле QueryFriendlyFilters на литерален стойност "празно".

Пример 2: Употреба <XSL:Ако> за да проверите "по-голямо от",  "по-малко от", н.

<XSL:шаблон за съвпадение = "нещо" XML:космически = "запазите">

  <DIV ИД = "fdcAllFilters">
 
    <XSL:Ако test="@Count>0">
      <еталониране на клас = "fdcFilterLabel">Текущ филтри:</еталониране>
    </XSL:Ако>

    <!– повече неща се случва тук. –>

</XSL:шаблон>

Горните парченце проверява дали атрибут с име "Преброяване" на "нещо" на елемент е по-голямо от нула.  XML зад това би било нещо подобно:”

<нещо брой = "5" />

Пример 3: Обхождане на всички елементи, interspersing jQuery повиквания.

<!– Обхождане на всички филтри и да покаже правилното  връзки. –>
<XSL:за всеки избор = "UserFilter">

  <клас = "FilterHref" href = "javascript:mySubmitPage("RemoveUserFilter",'{@ ИД}’)">[X]</а>

  <еталониране на клас = "fdcFilterLabel"><XSL:стойността на select="@FilterValue"/></еталониране>

  <скриптови тип = "текст/javascript">

    $(документ).готов(функция(){
        <XSL:текст><![НЕЗАТВОРЕН[$("#QueryFriendlyFilters").вал( ($("#QueryFriendlyFilters").вал() + " ]]></XSL:текст>\"<XSL:стойността на select="@FilterValue"/>\"<XSL:текст><![НЕЗАТВОРЕН["));]]></XSL:текст>
    });

  </скрипт>

</XSL:за всеки>

Горните фрагмент е и най-сложните и може да има по-лесни начина да го направите.

XML зад това изглежда приблизително по следния начин:

<UserFilter ИД = "123" FilterValue = "xyzzy" />

Това парченце е iterating чрез <UserFilter> възли. 

Тя първо да излъчва котва, етикет, когато се натисне предизвика на JavaScript функция, която вече е на страницата, "mySubmitPage" и минава на стойността на даден атрибут на <UserFilter> възел, наречена "ИД". 

След това тя да излъчва някои jQuery, която изчаква на страницата, за да се зареди.  Този jQuery актуализира скрито поле с име "QueryFriendlyFilters" чрез добавяне на стойността на атрибута FilterValue.  Забележка всички луди <XSL:текст> и <![НЕЗАТВОРЕН[ … ]]> неща.

Това е, надежда, той помага!

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Lists.asmx, GetListItems и папки

Аз правя няколко изследвания на някой днес около list.asmx уеб услуга, предоставени като част от SharePoint 2010 (и по-рано).  Тя е в състояние да получи елементите от списъка в главната папка (включително имената на подпапките), но не можа да се получи елементите в подпапките.  Направих някои поглед по internets и това е изненадващо общ въпрос.  Още, Не мога да получа добра отговорът на прост въпрос, "Ако знам, че папката, Как да получа елементите в папката?”  За да бъда честен, Аз не опитайте всички усърдно, тъй като съм исках да фигура, тази комбинация, на моята собствена за известно време Усмивка.

За да зададете това като настройка, Създадох даден сайт, наречена "Сценарии за Blogging" и списък по избор, наречена "Потребителски списък с последващо папки".  След това създадох папки, наречени:

  • Година 2005
  • Година 2006
  • Година 2007

Добавих няколко елементи в папката "2006 година".  Ето как изглежда той:

image

Моят приятел не писане C# код а по-скоро използване на Java, така че САПУН плика е това, което тя наистина необходимо.  За да получите, I пише малко jQuery и използва fiddler, за да получите действителната HTTP разговор.

Ето съответните jQuery (Аз копиран кода под ако искате да копирате/поставяте):

image

Те първият ключ е да включат и двете <queryOptions> и <QueryOptions> възел.  Вторият ключ е, че <Папка> възел е URL АДРЕС, към която клиентът има достъп.

Може да има други начини да получите това, но това работи добре за мен, когато се използва jQuery.

Тук е SOAP пакет за горните:

<soapenv:Плик xmlns:soapenv =’HTTP://schemas.xmlsoap.org/SOAP/envelope/’>                
  <soapenv:Тяло>
    <GetListItems xmlns =’
HTTP://schemas.Microsoft.com/SharePoint/SOAP/’>
      <listName>Списък по избор с последващо папки</listName>
      <viewFields>  
        <ViewFields>
          <Име на FieldRef =' заглавие’ />
          <Име на FieldRef ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Папка>
HTTP://demoserver1/Blogging Списък на сценарии/списъци/по избор с последващо папки/година 2006</Папка>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Тяло>
</soapenv:Плик>

Много примери и дискусия около това довело ми да се смята, че всичко трябва да е <QueryOptions> и задайте име на папка.  За мен, Аз трябва да и го поставете между вътре <queryOptions> както и да укажете напълно квалифицирани URL АДРЕС за <Папка> възел.

Тук е настройка на jQuery AJAX:

$(документ).готов(функция() {
       var soapEnv =
           "<soapenv:Плик xmlns:soapenv =’HTTP://schemas.xmlsoap.org/SOAP/envelope/’> \
               <soapenv:Тяло> \
                    <GetListItems xmlns =’HTTP://schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <listName>Списък по избор с последващо папки</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <Име на FieldRef =' заглавие’ /> \
                              <Име на FieldRef ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Папка>http://demoserver1/Blogging Списък на сценарии/списъци/по избор с последващо папки/година 2006</Папка> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Тяло> \
           </soapenv:Плик>";

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Lists.asmx, GetList и "стойност не може да бъде нулев”

Аз открих днес, че GetList() метод в lists.asmx уеб услугата трябва да бъде наречен много внимателно или тя е склонна да хвърлят един тайнствен "Стойност може да бъде null" изключение (и това се предполага, можете да получите миналото дори по-лошо общо съобщение за грешка, "С изключение на тип" Microsoft.SharePoint.SoapServer.SoapServerException’ е било хвърлено.")  Специално, Открих, че не може да даде всякакъв вид на префикс на метода на GetList.  Следните jQuery фрагмент илюстрира точка:

image

Ако направите това, уеб услугата отговаря с "Стойност не може да бъде null" като това цигулар-при условие че HTTP препис:

<?XML версия = "1.0" кодиране = "utf-8"?>
  <сапун:Плик
     xmlns:сапун ="
HTTP://schemas.xmlsoap.org/SOAP/envelope/"    
     xmlns:XSi = "
HTTP://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
HTTP://www.w3.org/ 2001/XMLSchema">

  <сапун:Тяло>
    <сапун:Отказ>
      <faultcode>сапун:Сървър</faultcode>
      <faultstring>
        Изключение от тип "Microsoft.SharePoint.SoapServer.SoapServerException’ е било хвърлено.
      </faultstring>
      <детайли>
        <errorstring xmlns ="
HTTP://schemas.Microsoft.com/SharePoint/SOAP/">
Стойността не може да бъде нулев.
        </errorstring>
      </детайли>
    </сапун:Отказ>
  </сапун:Тяло>
</сапун:Плик>

Разбира се, вероятно няма да добави този префикс "s0" по своему, но някои инструменти са склонни да го направя (като затъмнение).

Това е още по-объркващо / разочароващ, защото други методи толерира представки.  Например, на GetListCollection метод няма нищо против, ако той е бил предварително фиксиран, дори и с глупости представки като "xyzzy":

image

Това "стойност може да бъде null" изглежда доста често с lists.asmx, така че се надяваме това ще помогне на някой, в бъдеще.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Безкрайно вложени SEARCH <DIV> Етикети и jQuery

Това изглежда като такава Одбол тема, Аз не съм сигурен, че е наистина си струва blogging за, но това никога не ми спря преди, така че тук ние отивам Усмивка

Аз съм работа по даден проект, където аз съм дърпа някои данни от търсене, пакетирането му в XML съобщение и след това тази XML в крайна сметка се преобразува в HTML чрез XSLT.  Има много на jQuery, участващи, една част от които реализира някои tabbing функционалност.  Когато щракнете върху даден раздел (Наистина, а <DIV>), jQuery извиква .hide() и .show() на различни divs (на началната страница натоварване изтегля цялото съдържание, така че няма никакви връщания обратно в този случай).

Няколко часа преди, раздела превключване на логиката започна да се държат erratically и тя няма да се покаже един от моите раздели.  Аз в крайна сметка го проследи до факта, че internet explorer (най-малко) Мислех, че <DIV> етикети, вложени далеч, далеч по-дълбоко отколкото е предвидено.Развивам оръдие ще покаже:

-<DIV id = "Tab1Content">
  -<DIV>
    -<DIV>
      -<DIV id = "Tab2Content">
        -<DIV>
           …………………………
                   </DIV>  <— най-накрая показва, че е затворен чак тук!

Така, Ако аз го направих $("#Tab1Content").Скрий(), Аз също така ще скриете Tab2 и никога не може да покаже Tab2 ако аз също не показват Tab1.  Аз копирани и поставили кода в visual studio и той показа всички на div подплата горе добре, точно като те би трябвало да се прави, гледам подобен този:

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

Бие главата ми срещу стената за известно време и забелязах, че в реалната HTML код е генериране много празни <DIV> Тагове, като:

<тяло>

  <DIV id = "Tab1Content">

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

  </DIV>

  <DIV id = "Tab2Content">

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

  </DIV>

</тяло>

(По-горе е waaaaaaaaaaaay опростени.  На празен div таговете са напълно валидни. Някои от моите <DIV> Tags са пълно съдържание, но много други не са.  Аз дойдох до осъзнаването, че ми <XSL:за всеки> директивите не се излъчва кратка форма когато Тагове div xsl:за всеки не "намери някакви данни.  Аз принудени HTML коментар в изхода, както е показано:

image

 

След като направих това, всички div подредени добре и ми tab превключване започва да работи.

Както винаги, Аз надежда този помагам някой в краен случай.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Още повече jQuery–Преоразмеряване на пример изображение

Аз наследих уеб компонент от стария доставчик на клиента и има изображение размер проблем.  Изображенията трябва да бъде 60×50 но за някои странни причина, оригиналния доставчик ги принуждава в 42×42, така че те изглеждат смачкано:

 

Добър имидж

Лош имидж

Тук е за маркиране (донякъде опростен):

<маса клас = "разширена-outlook">
  <thead>
    <TR>
      <TH  ширина = "100′>3 Вторник</TH>
    </TR>
  </thead>

  <tbody>
    <TR клас = "прогноза">
      <TD ширина = "100′>
        <UL>
          <Li клас = "високо">Високо: 72&deg;F</Li>
          <Li клас = "ниска цена">Ниска: 44&deg;F</Li>
          <Li клас = "състояние">Слънчев
            <IMG src =’
HTTP://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/EN/Trans/cond007.png’ ширина = "42’ височина = "42’ ALT =” />
          </Li>
        </UL>
      </TD>
    </TR>

  </tbody>

</таблица>

Ще се отбележи, че въпреки че пътя до самото изображение показва правилното измерение (60×50) оригиналния доставчик е принуден в 42×42.  Защо?  Луд.

Все пак, Исках бързо и лесно решение за този проблем и аз се обърна към jQuery.  Номерът е да намерите всички от съответния <IMG> Тагове.  Аз не искам да се мотам с всички други img Тагове (от които има много).  Това малко на jQuery е трик:

<скрипт тип = текст/javascript"" SRC ="HTTP://AJAX.googleapis.com/AJAX/libs/JQuery/1.5/JQuery.min.js"></скрипт>

<скриптови тип = "текст/javascript">
     $(документ).готов(функция () {

         $("li.condition > IMG ").всеки(функция (индекс, елемент)
           
{
             $(елемент).CSS("ширина", "60"); 
             $(елемент).CSS("височина", "50");
            });
     }); // при зареждане на документ
</скрипт>

Този късче на код намира колекцията <Li> Тагове, чиято класа е "условие" и <IMG> деца.  Той след това повтаря през всичко това.  Работи като чар.

Вероятно може да рационализира го, но аз никога не е от вида на unix човек, този решен π за да 18 цифри прецизна sed и awk и аз не съм такъв, ако jQuery човек или Усмивка.

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Прилагане на глобален пукане-горе съобщаване система

Аз написах една статия за www.SharePoint.Briefing.com озаглавен"Прилагане на глобален пукане-горе съобщаване система.”  Тази функция е приложена за една общност колеж да общуват почивни поради сняг и т.н. 

Тя използва списък по избор, на кутията SharePoint уеб услуги и някои jQuery да се свърши работата.

Тук е закачка:

image

Прочетете цялото нещо тук: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin

Поеме контрола на вашия OK и отказ бутони

Написах тази статия a време гръб, но изглежда, че аз не линк към него от моя блог в момента, така че тук върви:

image

Тази статия описва как да принуди newform.aspx да се пренасочи към една страница, когато потребителят щракне върху OK и друга страница, когато тя щракне върху "Отказ".

</край>

Абонирайте се за моя блог.

Следвайте ме на Twitter в http://www.twitter.com/pagalvin