问题描述:
我写了一个弹出层事件,用在TextBox中,只有3两种情况下,允许触发。
1,双击该输入框。IE和火狐的均已实现。
2,在输入框中按下回车,IE下已经实现,FF尚未实现。
3,在输入框中按下空格,IE下已经实现,FF尚未实现。2和3在FF中未实现的原因是,在IE中,event.screenX不仅能够获取鼠标点击时的坐标,还能获取“按下回车”时光标所在位置的坐标(不知道是不是这样。。我猜得 哈哈),所以无论是点击,还是输入回车和空格,都能计算出合适准确的坐标,来显示层。但是在FF中,经测试,点击时传入的event,是有event.screenX的,当然也有event.which。而按下回车或者空格时的event,却是只有event.which而没有event.screenX。请问这个问题怎么解决呢?
顺便问一个ajax的问题哈~代码如下
//发送请求
function xmlhttpPost(url, xml) {
    xmlHttp = CreateXMLHttpRequest();
    if (window.XMLHttpRequest) { //Mozilla、Netscape、Safari 火狐等浏览器
        try {
            xmlHttp.open("POST", url, true);  //需要异步 并且open要小写 我日
            xmlHttp.onreadystatechange = handleStateChange;
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
        } catch (e) {
            alert("[系统提示]\n \n打开服务器出错!");
        }
        try {
            xmlHttp.send(xml);
        } catch (e) {
            alert("[系统提示]\n \n发送到服务器数据出错!");
        }
        if (foxgetReturnXml != null) {
            return foxgetReturnXml;
        } else {
            return null;
        }
    }
    else if (window.ActiveXObject) { //各种版本的IE浏览器
        try {
            xmlHttp.Open("POST", url, false);  //IE下可以同步
        } catch (e) {
            alert("[系统提示]\n \n打开服务器出错!");
        }
        try {
            xmlHttp.Send(xml);
        } catch (e) {
            alert("[系统提示]\n \n发送到服务器数据出错!");
        }
        try {
            var getReturnXml;
            if (xmlHttp.readyState == 4) {
                getReturnXml = xmlHttp.responseXML;
            }
        } catch (e) {
            alert("[系统提示]\n \n从服务器返回数据出错!");
        }
        if (getReturnXml != null) {
            return getReturnXml;
        } else {
            return null;
        }
    }
}//发送请求,获取数据
var foxgetReturnXml;
function handleStateChange() {
    if (xmlHttp.readyState == 4) { //表示请求状态 4为完成
        if (xmlHttp.status == 200) { //http状态指示码,200表示ok
            //将服务器返回信息。
            var result = xmlHttp.responseText;
            foxgetReturnXml = xmlHttp.responseXML;
        }
    }
}//调用时
var URL = "../../Public/GetEntryDataByKeyName.aspx?Keyname=" + escape(type);
var strPostValues = xmlhttpPost(URL, null);这里遇到的问题是,火狐下异步时,执行完“xmlHttp.onreadystatechange = handleStateChange;”后,foxgetReturnXml的值第一次总是为空,第一次之后才正常。这个事件是双击触发的,这样就导致了,在FF下,第一次双击总是没任何反应。求解~~

解决方案 »

  1.   

    第一个问题 可用 onkeydown 事件来触发   如果字符的编码是 event.keyCode==13 的时候                       obj.keydown=function(evt)
    {
    var keynum=window.event?window.event.keyCode:evt.which;
                                     if(keynum==13)
                                     {
                                         alert("按了回车");
                                     }
    }然后得到文本框的位置可以这样:
    /**
     * 坐标
     * @param x
     * @param y
     * @return
     */
    function CPos(x, y)
    {
        this.x = x;
        this.y = y;
    }
    /**
     * 得到对象的相对浏览器的坐标
     * @param ATarget
     * @return
     */
    function GetObjPos(ATarget)
    {
        var target = ATarget;
        var pos = new CPos(target.offsetLeft, target.offsetTop);
        
        var target = target.offsetParent;
        while (target)
        {
            pos.x += target.offsetLeft;
            pos.y += target.offsetTop;
            
            target = target.offsetParent
        }
        return pos;
    }        var pos = GetObjPos($("id"));
            $("div").style.top=pos.y + eval($("id").offsetHeight)+"px";
            $("div").style.left=pos.x + eval($("id").offsetWidth)+"px";这样就差不多了
      

  2.   

      xmlHttp = CreateXMLHttpRequest();改成  var xmlHttp=CreateXMLHttpRequest();
    试下 
      

  3.   

    3楼的朋友,你的建议肯定是无效的。。
    xmlHttp可不只是在xmlhttpPost()里调用,必须是全局~
      

  4.   

    2楼的朋友,因为我不知道你的思路,又考虑到FF下各种X,Y的值和IE下出入很大,所以想麻烦下解释一下那些算坐标的代码语句。
      

  5.   

    第一个问题已经解决啦~~谢谢qianzai5765638