【问题标题】:Presence indicator menu problem in SharePoint 2007 contact web partsSharePoint 2007 联系人 Web 部件中的状态指示器菜单问题
【发布时间】:2011-04-04 14:27:47
【问题描述】:

当我在页面上添加多个联系人 Web 部件时,Sharepoint 2007 中的状态指示器出现问题。

我注意到添加多个联系人时总是出现灰色气泡,因此我在互联网上搜索了解决方案。有人发现 img 标签的 ID(存在指示器气泡)不应该是唯一的。因为 SharePoint 会自动将静态 ID 添加到我需要覆盖 ID 的 img 标签。所以我写了这段 javascript 代码(实际上是复制了 guid 函数 ;-)):

function S4() 
{
    return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
function guid() {
   return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
window.IMNRC = function(native) {
   return function(name, elem) {
       if(elem != null)
       {
       if(elem.id="contact_im,type=sip")
       {
           elem.id = guid();
       }
    }
    native(name, elem);    
    }
 }(window.IMNRC);

我不知道它是否是好的代码,但是当我将它添加到页面时,气泡显示联系人的存在良好。 我现在唯一的问题是菜单不起作用。当我将鼠标悬停在状态指示器上时,它会变成灰色,并且菜单中的所有链接都不起作用。

我的一位同事注意到,当他将鼠标悬停在状态指示器上时,会出现一个带有联系人姓名的工具提示。奇怪的是名字与联系人不匹配。当他刷新时,他注意到工具提示中的名称随机更改。所以我认为这与我玩img标签的ID有关。

所以现在我有两个选择: - 或者我需要重新开始,不要弄乱img标签上的ID,并为存在指示器问题找到另一种解决方案 - 或者我需要修复菜单问题。

有人可以帮我解决这两个选项中的任何一个吗?

谢谢!

【问题讨论】:

    标签: sharepoint sharepoint-2007


    【解决方案1】:

    从纯 Javascript 的角度来看,我立即注意到的一件事是:

    if(elem.id="contact_im,type=sip")
    

    应该是:

    if(elem.id=="contact_im,type=sip")
    

    这可能是您的 ID 变得异常的原因(它们被分配而不是比较)。

    【讨论】:

    • 嗨斯图尔特,谢谢你的提示。当我访问该站点时,我现在可以正常工作了。当我刷新页面时,它仍然会混淆名称,或者有时只是显示一个灰色(离线)气泡。你知道如何解决这个问题吗?
    • @Janus:如果它在第一次访问站点时有效但在刷新时不起作用,则可能会以某种方式缓存,这可以通过硬刷新(Ctrl+F5)来解决。如果这不是问题,那么我建议在您的问题中添加一些屏幕截图和有关情况的更新,以帮助比我有更多线索的其他人来回答它。 :)
    【解决方案2】:

    好的,我让它工作了:-)。 感谢 Stuart 修复了我的 JavaScript 代码,我得以解决我的问题。 修复后菜单问题消失了,但是刷新页面时仍然出现问题。链接到状态指示器的名称不再与 Web 部件中的联系人匹配。我注意到名字完全相反。我注意到我试图覆盖的 IMNRC 函数被另一个执行此操作的函数调用:

    function QueuePopulateIMNRC(sipAddress, element)
    {
        setTimeout("IMNRC('" + sipAddress + "', document.getElementById('" + element.id + "'));", 100);
    }
    

    其中 element.id 是旧元素。我曾经读到 JavaScript 只记住最后一个对象以防重复名称,所以我认为这个方法调用会导致错误的名称错误。我只需要重写 QueuePopulateIMNRC 函数,以便此时我的状态指示器的 ID 被更改(在 document.getelementbyid 之前)。

    这是我的最终解决方案:

    function S4() {
        return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
    }
    function guid() {
        return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
    }
    function QueuePopulateIMNRC(sipAddress, element)
    {
        if(element!=null)
        {
            if(element.id=="contact_im,type=sip")
            {
                element.setAttribute('id',guid());
            }
        }
        setTimeout("IMNRC('" + sipAddress + "', document.getElementById('" + element.id + "'));", 100);
    }
    

    如果您在隐藏的内容编辑器 web 部件中或直接在母版页中添加这段代码,则在添加多个联系人 web 部件时,您的状态指示器将起作用。

    【讨论】:

    • 很高兴您解决了这个问题。您应该单击此答案左上角的勾号以将其显示为解决方案。
    猜你喜欢
    • 2012-09-29
    • 2012-04-28
    • 2010-12-28
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多