none
我在bar_Top.aspx文件里面加了js,为什么有时候报错? RRS feed

  • 问题

  • 处于特殊需要,要在crm里面显示logo的地方后面加一个显示和查看消息实体的图标,我就在bar_Top.aspx文件的body 加了onload="ShowNotice();",然后在页面的最下边</html>标签后面加了如下js,其他一切都正常,只是在切换左面的导航的时候有时候会出现错误。为什么呢?:

    <script type ="text/javascript" >
        //window.onload = ShowNotice();

        //定义图标变量
        var noticeElement;
        //全局变量
        var userid;
        //消息扫描间隔时间
        var IntervalTime=600000;
       
        //显示Message提示的入口程序
        function ShowNotice() {
            //查找当前用户
            LookMy();       
            //创建控件对象
            noticeElement = MakeNoticeObject();
     //第一次扫描在一分钟以后开始
     setTimeout("ScanNotice()",10000);
        }

        //扫描函数
        function ScanNotice(){
     
            //如果控件创建成功,去看看该用户有没有没看过的信息
            if (noticeElement != null) {
                //获取该用户所有未读的信息
                var isReaded = IsHasMessageNotRead();
                //如果有未读的信息,信息控件不断闪烁。
                if (isReaded) {
                    noticeElement.src = "../../_imgs/notice2.gif";
                }
            }

     setTimeout("ScanNotice()",600000);
        }

        //看看是否登陆用户有未读的信息
        function IsHasMessageNotRead() {
     var strXMLResponse=LookForMyMessage();
     if(strXMLResponse==null){
         //当查询无结果的时候,查询出错,页面处理一下。
         SetNotice("noConnect");
         return false;
     }
     else{
         //当查询有结果时,分析结果,看看有没有未读的信息
         xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async = false;
                xmlDoc.loadXML(strXMLResponse);
                var lineNUM=xmlDoc.getElementsByTagName("BusinessEntities")[0].childNodes.length;
                //定义一个计数器
         var notread=0;
         for(var i=0;i<lineNUM;i++){
      var isReaded=xmlDoc.getElementsByTagName("BusinessEntities")[0].childNodes[i].childNodes[1].childNodes[0].nodeValue;
                    if(isReaded=="0"){
          notread++;
                    }
         }
         if(notread>0){
      //如果有未读过的信息,提示。
      SetNotice("hasMsg");
      return true;
                }else{
      //如果没有未读过的信息,提示。
      SetNotice("noMsg");
      return false;
         }
     }
        }

       

        //设置消息提醒按钮为没信息。
        function SetNotice(flag){
     if(flag=="noConnect") {
         noticeElement.src = "../../_imgs/notice1.gif";
         noticeElement.title="目前系统不能连接消息库。";
     }else if(flag=="hasMsg"){
         noticeElement.src = "../../_imgs/notice2.gif";
         noticeElement.title="您有未查看的信息。";
     }else if(flag=="noMsg"){
         noticeElement.src = "../../_imgs/notice1.gif";
         noticeElement.title="您没有未查看的信息。";
     }
        }

        //查找当前用户信息
        function LookForMyMessage() {
            //用局部变量暂存用户id
            var new_msgreceive = userid;
            //Define the request using SOAP
            var soapBody = "<soap:Body>" +
    "<RetrieveMultiple xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
    "<query xmlns:q1='http://schemas.microsoft.com/crm/2006/Query'"+
    " xsi:type='q1:QueryExpression'>"+
    "<q1:EntityName>new_messageinfo</q1:EntityName>"+
    "<q1:ColumnSet xsi:type='q1:ColumnSet'>"+
    "<q1:Attributes>"+
    "<q1:Attribute>new_msgreceive</q1:Attribute>"+ 
    "<q1:Attribute>new_islooked</q1:Attribute>"+ 
    "</q1:Attributes>"+
    "</q1:ColumnSet>"+
    "<q1:Distinct>false</q1:Distinct>"+
    "<q1:Criteria>"+
    "<q1:FilterOperator>And</q1:FilterOperator>"+
    "<q1:Conditions>"+
    "<q1:Condition>"+
    "<q1:AttributeName>new_msgreceive</q1:AttributeName>"+
    "<q1:Operator>Like</q1:Operator>"+
    "<q1:Values>"+
    "<q1:Value xsi:type='xsd:string'>{"+new_msgreceive+"}</q1:Value>"+
    "</q1:Values>"+
    "</q1:Condition>"+
    "</q1:Conditions>"+
    "</q1:Criteria>"+
    "</query>"+
    "</RetrieveMultiple>"+
     "</soap:Body>";

            var soapXml = "<?xml version='1.0' encoding='utf-8'?>" +
     "<soap:Envelope " +
     "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'>";
            soapXml += GenerateAuthenticationHeader();
            soapXml += soapBody;
            soapXml += "</soap:Envelope>";

            var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            xmlhttp.open("POST", "/MSCRMservices/2007/crmservice." +
     "asmx", false);
            xmlhttp.setRequestHeader("Content-Type", "text/xml; " +
     "charset=utf-8");
            xmlhttp.setRequestHeader("SOAPAction", "http://schemas." +
     "microsoft.com/crm/2007/WebServices/RetrieveMultiple");

            xmlhttp.send(soapXml);
            xmlhttp.responseXML.xml;
            try {
                return xmlhttp.responseXML.xml;
            }
            catch (e) {
                err = xmlDoc.getElementsByTagName("description")[0].childNodes[0].nodeValue;
                alert("查询即时消息时出现了错误 :" + e.description + " : " + err);
                return null;
            }
        }

        //创建控件对象
        function MakeNoticeObject() {
            try {
                noticeContainer = document.createElement("div");
                noticeContainer.style.width = "340px";
                noticeContainer.style.height = "50px";
                noticeContainer.style.textAlign = "right";
                noticeContainer.innerHTML = "<table style='width:100%'><tr><td style='width:100%;height:22px'>" +
                                          "</td></tr><tr><td style='text-align:right;'>" +
                                          "<img src='../../_imgs/notice1.gif' style='height:18px;cursor:hand' id='image_notice' title='消息'" +
                                          " onclick='ShowAllMessage()'" +
                                          "/></td></tr><table>";

                document.appendChild(noticeContainer);
                return document.getElementById("image_notice");
            } catch (e) {
                alert("创建消息控件出错。Error :" + e.description);
                return null;
            }
        }


        function LookMy() {
            /*Define the soapBody for the WhoAmI request.*/
            var soapBody = "<soap:Body>" + "<Execute xmlns='http://schemas.microsoft.com/crm/2007/" + "WebServices'>" +
     "<Request xsi:type='WhoAmIRequest' /> " + "</Execute></soap:Body>";

            /*Wrap the Soap Body in a soap:Envelope.*/
            var soapXml = "<soap:Envelope " +
     "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'>";
            soapXml += GenerateAuthenticationHeader();
            soapXml += soapBody;
            soapXml += "</soap:Envelope>";


            /* Create the XMLHTTP object for the execute method.*/
            var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
            xmlhttp.open("POST", "/MSCRMservices/2007/crmservice." +
     "asmx", false);
            xmlhttp.setRequestHeader("Content-Type", "text/xml; " +
     "charset=utf-8");
            xmlhttp.setRequestHeader("SOAPAction", "http://schemas." +
     "microsoft.com/crm/2007/WebServices/Execute");

            /* Send the XMLHTTP object. */
            xmlhttp.send(soapXml);

            /* Create an XML object to parse the results.*/
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.async = false;
            xmlDoc.loadXML(xmlhttp.responseXML.xml);

            /* Get the user's ID. */
            try {
                var rawUserid = xmlDoc.getElementsByTagName("UserId")[0].childNodes[0].nodeValue;
                userid = rawUserid.toUpperCase() ;
            }
            catch (e) {
                err = xmlDoc.getElementsByTagName("description")[0].childNodes[0].nodeValue;
                alert("查询用户信息时出现了错误 :" + e.description + " : " + err);
            }
        }

        //点击显示所有的信息
        function ShowAllMessage(){
     window.open("homepage.aspx?etc=10025&viewid=%7b9B08FBD2-E932-4169-80AB-8D5AAEF5A338%7d","_blank","menubar=no,");
        }
    </script>

     

     

    2010年8月6日 7:00

全部回复

  • 你直接修改CRM 的aspx网页是一种不支持的开发,你需要使用其它的方法来实现。
    Darren Liu (MSFT) | 刘嘉鸿 | Blog: http://liudarren.spaces.live.com
    2010年8月8日 3:22
    版主
  • 我也试过用在ISV的<buton>里面加JS的方式来实现,可是为啥isv导入后啥反应都没有?isv导入似乎就没有被加载。

    2010年8月9日 9:11
  • 我看到你在 JS 那里做了很多的 SOAP calls,  一定需要在Application Level 那里做吗? 可不可以告诉我你想做很么吗, 看看我能不能帮到你。


    Darren Liu (MSFT) | 刘嘉鸿 | Blog: http://liudarren.spaces.live.com
    2010年8月10日 6:32
    版主
  • 很感谢斑竹的热心。

    本来是想在“高级搜索”按钮旁边,也就是CRM默认界面的横杠加一个消息图标按钮,实现这样的功能:比如我在系统里面向供应商付款的时候,也就是新建一个“付款”实体的实例的时候,需要向相关销售人员发送一个“消息”实体的实例,通知他们我已经付款了。在销售人员面板上,只要我这里付了款,他们的面板上那个消息图标按钮会异步获取到有新消息,他就不停的闪呀闪,销售人员就会注意到我这边已经付过款了。

    但是按照sdk里面的做法,我把这段js写到isv里面的<button>标签后,发现上传后的isv没有被加载,isv还是原来的模样。实在没办法,我就直接修改bar_Top.aspx文件了。

    现在还有些功能还要在实体的显示页面加按钮或下拉菜单式的按钮,我还不知道怎么做呢。郁闷得很。

    2010年8月10日 9:24