分类存档: jQuery 和 SharePoint

克服恼人的问题与 SharePoint 快速启动中的相对 Url

我想要将链接添加到快速启动导航那天和 SharePoint 告诉我:

image

纯文字版本的是:

确保该 URL 是有效的和开头也是有效的字符 (数字符号 (#) 或正斜杠 (/)) 或有效支持的协议 (例如, http://’, https://’, 文件://’, ftp://’, mailto:’, ' 新闻:’).

"Blech 和痘!"我说.

对此的解决方法是使用 JavaScript 在快速启动中查找已知的链接和重写其行为.

对此进行测试, 添加新链接到您的测试站点难耐:

image

我使用 jQuery. 解决这个问题, 得到一些 JavaScript 和 jQuery 拖到页上使用您喜欢的方法和代码像这样的一条线:

 

$(文档).准备好了( 功能 () {

    $("一:包含(测试 URL 替换)").单击(功能 () { 警报("更改的单击行为!"); 返回 false;});

});

鲍勃的你叔叔.

JQuery 选择器查找每个 <一> 标记在其名称中包含"测试 URL 替换". 您可能想要查找-曲调,根据您的链接和这种.

笔者(功能() 重写 SharePoint 将所做的一切当用户单击. 请确保您"返回 false",否则它会做你的东西,然后尝试 href 东西太, 几乎可以肯定不是你的目标.

这样做的和在 SharePoint 的在线环境中测试,但应该很好的工作 2010 和早些时候太.

</结束>

undefined订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

快速和简单: 解决"无效 URL 参数” UpdateListItems 在 lists.asmx 的问题

当通过 lists.asmx 和 UpdateListItems 一起工作, 很容易地生成错误:

无效的 URL 参数.

所提供的 URL 包含无效命令或值. 请再次检查 URL.

你可以得到此错误,当您忘了包括 ID 在要更新的字段的列表。  这, 像很多这些 SP 的 web 服务, 是有点违反直觉的因为你需要的 ID 属性中包含的 ID <方法> 元素。  你不更新 ID 和可能永远不会想在第一次的地方.

此 SOAP 信封工程:

<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 ="继续">
          <方法 ID ="1" Cmd ="更新">
            <字段名称 ="CooperativeLock">锁定!</字段>
            <字段名称 ="ID">1</字段>
          </方法>
        </批处理>                     
        </更新>                
      </UpdateListItems>             
  </soapenv:正文>         
</soapenv:信封>

如果你带出来的 ID 字段引用然后你会令人讨厌的"无效 URL 参数"消息.

</结束>

undefined订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

 

可怜的人在 JavaScript 中的缓存

[TL;博士版本: 使用 cookie 来存储异步调用的结果; 立即呈现过去异步调用的结果,然后在页面加载后验证它们。]

我一直在 SharePoint 的内联网网站为客户端的功能, 除其他外, 程式化的二级导航菜单选项都通过定期的老自定义列表管理。  想法是在客户端获取,不影响或受影响,由它推出的全球导航控制"他们的"网站的菜单.

(有件事令人难以置信颠覆有关添加指向一个 HTML 文件,加载一些 CSS 和 JS,从根本上改变几乎一切有关站点的行为......,但那是另一篇文章为 CEWP)

这个漂亮的简单的代码:

痛点这里是,每次有人点击其中一个站点的页面, 该用户的 web 浏览器伸出手来获取列表中的项。  一旦开发完成并测试已被证明是稳定和完整的东西, 此调用是不必要的多 99% 因为菜单中很少发生变化的时间。  它也有一个怪异的 UI 影响这是常见的这个勇敢新世界的超 ajaxy web 站点 — — 呈现页和菜单只然后呈现。  它是紧张不安,在我看来让人分心。  和紧张不安. 所以, 缓存。 

我修改了逻辑广交:

  • 查找包含菜单中,当我最后读到它的浏览器中的 cookie
    • 如果发现, 立即呈现它。  不要等待页面完成加载。  (您需要确保您的 HTML 战略性地放在这里, 但它是不难做到).
  • 等待页面完成加载,使异步调用以加载菜单项从列表中使用休息或 lists.asmx 或不管了
  • 比较与 cookie 得到了什么
    • 如果它匹配, 停止
    • 否则, 使用 jQuery, 如果动态填充一束 <李>中 <ul>
  • 使用 CSS 来做的所有格式
  • 利润!

你们中的一些将要说的话, "嘿,你! 有是没有真正缓存会在这里因为你反正读菜单中 每一次.”  你说得对 — — 我不会给服务器任何种类的休息。  但因为该调用是异步和发生后页面的初始 HTML 有效载荷完全呈现, 它"感觉"更能响应用户。  菜单中将呈现相当多为页绘制。  如果菜单中发生的变化, 用户被受到紧张不安重新绘制菜单, 但仅此一次.

有一些方法可以使此缓存更有效,同时也帮助了服务器:

  • 在"cookie 缓存"是有效的最低限度的规则中 24 小时或一些其他时限. 只要没有过期的 cookie, 使用 cookie 的菜单快照和永远不会撞到服务器.

好,这就是一切,现在我想 :). 

如果任何人有任何聪明的想法在这里我想知道他们.

最后 — — 这种技术可以用于其他的东西。  此客户机的页面在各种页面上有大量的数据驱动的事情, 很多人改变相对地很少 (如每周或每月一次).  如果您针对特定地区的功能, 你可以通过从本地 cookie 存储拉内容并立即呈现给一个响应更快的用户界面。  它感觉快到用户即使你不节省服务器任何周期。  你 可以 通过一些条件和触发器决定作废这本地 cookie 缓存保存服务器周期。  这就是所有情景和艺术的东西和真正最大的乐趣 :). 

</结束>

undefined订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

XSLT 和 jQuery 样本

我做了很多的 XSLT 和 jQuery 和思想会分享他人在将来可能会发现有用的几个片段.

示例 1: 发出简单 JavaScript / 在 XSLT jQuery:

<xsl:模板匹配 ="的东西" xml:空间 ="维护">

  <!– 出查询友好筛选器隐藏字段保留为空 –>
  <脚本类型 ="文本/javascript">
    $(文档).准备好了(功能(){
      $(""#QueryFriendlyFilters).瓦尔("空");
    });
  </脚本>

</xsl:模板>

这位会发出一些等待完成加载页面的 JavaScript (由于 $(文档).准备好了(…)) 和则集命名隐藏的字段的值为 QueryFriendlyFilters,"空"的文本值.

示例 2: 使用 <xsl:如果> 要检查"大于",  "小于", 等.

<xsl:模板匹配 ="的东西" xml:空间 ="维护">

  <div id ="fdcAllFilters">
 
    <xsl:如果 test="@Count>0">
      <跨类 ="fdcFilterLabel">当前的筛选器:</大跨度>
    </xsl:如果>

    <!– 在这里发生了更多的东西. –>

</xsl:模板>

在上面的代码段检查名为"计数"的"东西"元素的属性是否大于零。  这背后的 XML 就像:”

<东西计数 ="5"/>

示例 3: 循环访问所有元素, 排布 jQuery 的调用.

<!– 遍历的所有筛选器,并显示正确  链接. –>
<xsl:为每个选择 ="UserFilter">

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

  <跨类 ="fdcFilterLabel"><xsl:值的 select="@FilterValue"/></大跨度>

  <脚本类型 ="文本/javascript">

    $(文档).准备好了(功能(){
        <xsl:文本><![CDATA[$(""#QueryFriendlyFilters).瓦尔( ($(""#QueryFriendlyFilters).瓦尔() + " ]]></xsl:文本>\"<xsl:值的 select="@FilterValue"/>\"<xsl:文本><![CDATA["));]]></xsl:文本>
    });

  </脚本>

</xsl:为每个>

上面的代码段是最复杂的可能还有更容易的方法做这件事.

这背后的 XML 大致如下:

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

此代码段循环访问 <UserFilter> 节点。 

它首先发出锚标签,单击时调用已经在页面上的 JavaScript 函数, "mySubmitPage",并传递的属性的值 <UserFilter> 名为"ID"的节点。 

然后,它会发出一些等待加载页面的 jQuery。  那 jQuery 更新隐藏的字段命名为"QueryFriendlyFilters"中添加 FilterValue 属性的值。  请注意所有疯狂 <xsl:文本> 和 <![CDATA[ … ]]> 东西.

就是这样, 希望它可以帮助!

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

Lists.asmx, GetListItems 和文件夹

我做了一些调查有人今天周围作为 SharePoint 的一部分提供的 list.asmx web 服务 2010 (及更早版本).  她之所以能够获得在根文件夹的列表项 (包括子文件夹的名称), 但不能在子文件夹中的项目。  我做了一些环顾四周在互联网络上,这是一个令人惊讶的常见的问题。  然而, 没能得到很好简单问题的答案, "如果我知道该文件夹, 如何获取文件夹中的项目?”  要诚实, 因为我想我自己对这一出图了一会儿我并没有试图在所有的努力 微笑.

进行此设置, 我创建了名为"博客情境"站点和自定义列表名称为"自定义列表的子文件夹"。  然后创建文件夹名:

  • 一年 2005
  • 一年 2006
  • 一年 2007

我添加的文件夹"2006 年"几个项目。  这是它看起来像:

image

我的朋友并不是编写 C# 代码,但宁愿使用 Java, 所以 SOAP 信封是她的真正需要。  达到目标,, 写了有点 jQuery,然后用于小提琴手获得实际的 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/博客 子文件夹/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 web 服务已非常仔细地调用或很容易引发一种神秘"的值不能为空"的异常 (这是假设你过去的更糟的一般错误消息, "类型的异常 ' Microsoft.SharePoint.SoapServer.SoapServerException’ 引发了。")  具体, 我发现你不能提供任何种类的前缀的 GetList 方法。  下面的 jQuery 片断阐释了点:

image

如果你这样做, 以"值不能为空"按此 web 服务响应 小提琴手-提供 HTTP 谈话全文:

<?xml 版本 ="1.0" 编码 ="utf-8"?>
  <肥皂:信封
     xmlns:soap ="
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

这"的值不能为空"似乎相当常见,所以希望这会帮助别人,在将来的 lists.asmx 与.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

无止境地嵌套 <div> 标记和 jQuery

这似乎是一个古怪的话题, 我不确定这的确值得有关的博客, 但是,从未停止过我, 所以在这里我们去 微笑

我正在那里我揪一些数据从搜索一个项目, 打包成一条 XML 消息,然后该 XML 是最终转换为 XSLT 通过 HTML。  有很多的 jQuery 涉及, 其中一位实现一些制表符的功能。  当您单击某个选项卡上 (真的, 一 <div>), jQuery 调用.hide() 和.show() 对各种 div (初始页面加载下载的所有内容,所以在这种情况下有没有回发).

一群小时前, 选项卡切换逻辑开始运行不稳定,它不会显示我的选项卡中的一个。  我最终跟踪它的事实,ie 浏览器 (至少) 原以为, <div> 远嵌套标签, 远远超过预期。开发商工具栏将显示:

-<div id ="Tab1Content">
  -<div>
    -<div>
      -<div id ="Tab2Content">
        -<div>
           …………………………
                   </div>  <— — 最后展示它关闭一路了这里!

所以, 如果我做了 $("#"Tab1Content).隐藏(), 我还会隐藏前台,我可能永远不会告诉前台是否我还没显示标签页 1。  我复制并粘贴代码到 visual studio 和它很好地显示所有 div 的衬砌起来的, 就像他们应该做的事情, 看起来像这:

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

我的头靠在墙上打了一会儿,并注意到在实际的 HTML 代码产生大量的空 <div> 标签, 像:

<正文>

  <div id ="Tab1Content">

    <div id ="第一行"/>
    <div id ="行 2"/>

  </div>

  <div id ="Tab2Content">

    <div id ="第一行"/>
    <div id ="行 2"/>

  </div>

</正文>

(以上是过于简单化的 waaaaaaaaaaaay。  空的 div 标签都是完全有效. 一些我 <div> 标记是内容的完整, 但更多的不是。  我认识到,那我 <xsl:为每个> 指令发出短型 div 标签时 xsl:对于每个才 ' 找到的任何数据。  被迫输出的 HTML 注释, 如图所示:

image

 

毕竟这样做, 所有 div 的很好地都排队和我选项卡切换开始工作.

如往常一样, 我希望这将有助于在必要时有人.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

然而更多的 jQuery–调整大小图像示例

我继承旧客户端供应商的 web 部件,它有一个图像的大小问题。  图像应该是 60×50 但由于某种奇怪的原因, 原始的供应商将他们被迫 42×42, 因此,他们看挤压:

 

良好的形象

坏的图像

这里是标记 (某种程度上简化):

<表类 =' 扩展 outlook'>
  <thead>
    <tr>
      <th  宽度 = 100′>3 (星期二)</th>
    </tr>
  </thead>

  <tbody>
    <tr 类 = '预测'>
      <td 宽度 = 100′>
        <ul>
          <李类 = '高'>高: 72&二甘醇;F</李>
          <李类 = '低'>低: 44&二甘醇;F</李>
          <李类 = '条件'>阳光灿烂
            <img src =’
http://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/en/trans/cond007.png’ 宽度 = 42年’ 高度 = 42年’ alt =” />
          </李>
        </ul>
      </运输署>
    </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);
            });
     }); // 在加载文档
</脚本>

这位的代码查找集合 <李> 谁的班是"条件"的标签和 <img> 儿童。  然后,它循环访问所有这一切。  迷人.

我大概可以提高 it 效率, 但我永远不会是那种解决 π 的 unix 家伙 自 18 使用 sed 和 awk 的位数精度和我不是那种如果 jQuery 家伙要么 微笑.

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

实施全球的弹出式通知系统

我写了一篇文章 www.sharepoint.briefing.com 题为"实施全球的弹出式通知系统.”  此函数被实施社区学院通信学校倒闭由于要下雪,等等。 

它使用一个自定义列表, 出的框 SharePoint 的 web 服务和一些 jQuery 来做这项工作.

这里是个难题:

image

阅读整件事情在这里: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</结束>

订阅我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin