标签归档:ajax

兼容firefox3,ie,firefox2的xmlhttp请求写法(转载未测)

最近安装了firefox3以后突然发现之前写的一些ajax请求无法正常的去获取数据了。于是赶快从网上找解决方法。终于在一个僻静的小角落找到了解决方法。马上写出共享之~积德啊积德~”

//创建xmlhttp。此写法兼容firefox2,firefox3和ie。
function createXMLHTTP() {
var xmlhttp = null;
if(window.ActiveXObject) {
try {xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){try{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
catch(e){}}
} else if(window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
if(xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType('text/xml');
}
} else {alert("Create XMLHttpRequest object false!");return false;}
return xmlhttp;
}

//调用处写法:
var xmlhttp = createXMLHTTP();
xmlhttp.open("GET","your request url",false);
xmlhttp.send(null);
if(xmlhttp.status == 200) {
if(xmlhttp.responseText.length !== 0) {
//此判断的内容为以前的回调函数。不明白为啥firefox3就成了这个样子~
}

完美兼容IE、FF、Opera的Ajax类支持get、post、自定义回调函数(转载待测)

Js代码

function Ajax(){  
    this.httpXML=false;  
    this.init();  
}  
Ajax.prototype.init=function(){  
    if(window.XMLHttpRequest){  
        this.httpXML=new XMLHttpRequest();   
        if (this.httpXML.overrideMimeType){  
            this.httpXML.overrideMimeType(“text/xml”);   
        }  
    }else if(window.ActiveXObject){  
        try{this.httpXML = new ActiveXObject(“Msxml2.XMLHTTP”);}catch (e){   
             try{this.httpXML = new ActiveXObject(“Microsoft.XMLHTTP”);}catch (e){}   
        }  
    }  
    if(!this.httpXML){  
        window.alert(“can’t create XMLHttpRequest object”);  
        return null;  
    }  
}  
Ajax.prototype.send=function(_method,_url,_data,_callback){  
    this.httpXML.onreadystatechange=function(){  
        if(this.readyState==4&&this.status==200){  
            _callback.call(this,this.responseText);  
        }  
    }  
      
    if (_method.toLowerCase() == “get”){   
         //if(navigator.userAgent.indexOf(“MSIE”)<=0){  
         //     netscape.security.PrivilegeManager.enablePrivilege(“UniversalBrowserRead”);  
         //}  
         this.httpXML.open(_method, _url, true);   
         this.httpXML.send(null);   
    }else if (_method.toLowerCase() == “post”){   
         this.httpXML.open(_method, _url, true);   
         this.httpXML.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);   
         this.httpXML.send(_data);   
    }   
      
}  
 
Ajax.prototype.callback=function(){  
       

function Ajax(){
 this.httpXML=false;
 this.init();
}
Ajax.prototype.init=function(){
 if(window.XMLHttpRequest){
  this.httpXML=new XMLHttpRequest();
  if (this.httpXML.overrideMimeType){
            this.httpXML.overrideMimeType(“text/xml”);
        }
 }else if(window.ActiveXObject){
  try{this.httpXML = new ActiveXObject(“Msxml2.XMLHTTP”);}catch (e){
             try{this.httpXML = new ActiveXObject(“Microsoft.XMLHTTP”);}catch (e){}
        }
 }
 if(!this.httpXML){
  window.alert(“can’t create XMLHttpRequest object”);
  return null;
 }
}
Ajax.prototype.send=function(_method,_url,_data,_callback){
    this.httpXML.onreadystatechange=function(){
        if(this.readyState==4&&this.status==200){
      _callback.call(this,this.responseText);
     }
    }
   
    if (_method.toLowerCase() == “get”){
         //if(navigator.userAgent.indexOf(“MSIE”)<=0){
         //     netscape.security.PrivilegeManager.enablePrivilege(“UniversalBrowserRead”);
         //}
         this.httpXML.open(_method, _url, true);
         this.httpXML.send(null);
    }else if (_method.toLowerCase() == “post”){
         this.httpXML.open(_method, _url, true);
         this.httpXML.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
         this.httpXML.send(_data);
 }
 
}

Ajax.prototype.callback=function(){
 
}

Html代码

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> 
<html xmlns=”http://www.w3.org/1999/xhtml” > 
<head> 
    <title>完美兼容IE、FF、Opera浏览器</title> 
    <script type=”text/javascript” src=”js/ajax.js”></script> 
    <script type=”text/javascript”> 
        function send(){  
            ajax=new Ajax();  
            ajax.send(“get”,”listener/Hajax.ashx”,”post测试请求”,ddd);  
        }  
          
        function ddd(data){  
            alert(data);  
        }  
    </script> 
</head> 
<body> 
    <button onclick=”send()”>测试</button> 
</body> 
</html> 

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” >
<head>
    <title>完美兼容IE、FF、Opera浏览器</title>
    <script type=”text/javascript” src=”js/ajax.js”></script>
    <script type=”text/javascript”>
        function send(){
            ajax=new Ajax();
            ajax.send(“get”,”listener/Hajax.ashx”,”post测试请求”,ddd);
        }
       
        function ddd(data){
            alert(data);
        }
    </script>
</head>
<body>
    <button onclick=”send()”>测试</button>
</body>
</html>

后台订单层—

function bind_order_event()
    {
        var order_seq = 0; //设置变量等于0
        //while 在进入循环时先检查条件,下面为true,那就直接进入循环
        while(true)   //整不明白
        {
            //先暂且不论Utils是什么东西, 可以肯定是一个对象
            //第一次进入循环 order_seq= 0
            //那么$(‘order_’+order_seq) = $(‘order_0’) 
            //这样看来可能是找页面上的某个元素对象
            //而这个$(‘order_0’) 又是Utils的一个属性
            
            var order_sn = Utils.$(‘order_’+order_seq); 整不明白

            //也就是说,如果这个存在,也就是找到了$(‘order_0’) 具体你点右键,查看源代码
            //看看是不是有order_0字样的东西
            if (order_sn)   //这里是判断什么的?判断order_sn存在呢,还是判断值呢?
            {
                //e 在函数参数列表内,那么当鼠标移动,会有个事件发生,就是event,
                order_sn.onmouseover = function(e) //设置函数e代表 鼠标移动? 
                {
                    //试图执行clearTimeout,如果失败,系统会转到catch
                    try         //没明白
                    {
                        window.clearTimeout(timer); //清除时间
                    }
                    catch(e)                           //没明白 ——–
                    {
                    }
                    //估计是调用ajax,返回一个什么值
                    var order_id = Utils.request(this.href, ‘order_id’); //没明白
                    //有了order_id,调用下面这个函数,估计是显示产品
                    show_order_goods(e, order_id, show_goods_layer);     //运行这个函数?
                }
                //
                order_sn.onmouseout = function(e)                //设置函数e代表 鼠标离开? 

                {
                    hide_order_goods(show_goods_layer)            //运行这个函数?

                }
                order_seq++;                                变量的值加1
            }
            else                                          //否则
            {
                break;                                     //终止运行
            }
        }

 
 
 
全文如下:
    onload = function()
    {
        // 开始检查订单
        startCheckOrder();
    }
    /**
     * 搜索订单
     */
    function searchOrder()
    {
        listTable.filter[‘order_sn’] = Utils.trim(document.forms[‘searchForm’].elements[‘order_sn’].value);
        listTable.filter[‘consignee’] = Utils.trim(document.forms[‘searchForm’].elements[‘consignee’].value);
        listTable.filter[‘composite_status’] = document.forms[‘searchForm’].elements[‘status’].value;
        listTable.filter[‘page’] = 1;
        listTable.loadList();
    }
    function check()
    {
      var snArray = new Array();
      var eles = document.forms[‘listForm’].elements;
      for (var i=0; i<eles.length; i++)
      {
        if (eles[i].tagName == ‘INPUT’ && eles[i].type == ‘checkbox’ && eles[i].checked && eles[i].value != ‘on’)
        {
          snArray.push(eles[i].value);
        }
      }
      if (snArray.length == 0)
      {
        return false;
      }
      else
      {
        eles[‘order_id’].value = snArray.toString();
        return true;
      }
    }
    /**
     * 显示订单商品及缩图
     */
    var show_goods_layer = ‘order_goods_layer’;
    var goods_hash_table = new Object;
    var timer = new Object;
    /**
     * 绑定订单号事件
     *
     * @return void
     */
    function bind_order_event()
    {
        var order_seq = 0;
        while(true)
        {
            var order_sn = Utils.$(‘order_’+order_seq);
            if (order_sn)
            {
                order_sn.onmouseover = function(e)
                {
                    try
                    {
                        window.clearTimeout(timer);
                    }
                    catch(e)
                    {
                    }
                    var order_id = Utils.request(this.href, ‘order_id’);
                    show_order_goods(e, order_id, show_goods_layer);
                }
                order_sn.onmouseout = function(e)
                {
                    hide_order_goods(show_goods_layer)
                }
                order_seq++;
            }
            else
            {
                break;
            }
        }
    }
    listTable.listCallback = function(result, txt)
    {
        if (result.error > 0)
        {
            alert(result.message);
        }
        else
        {
            try
            {
                document.getElementById(‘listDiv’).innerHTML = result.content;
                bind_order_event();
                if (typeof result.filter == “object”)
                {
                    listTable.filter = result.filter;
                }
                listTable.pageCount = result.page_count;
            }
            catch(e)
            {
                alert(e.message);
            }
        }
    }
    /**
     * 浏览器兼容式绑定Onload事件
     *
     */
    if (Browser.isIE)
    {
        window.attachEvent(“onload”, bind_order_event);
    }
    else
    {
        window.addEventListener(“load”, bind_order_event, false);
    }
    /**
     * 建立订单商品显示层
     *
     * @return void
     */
    function create_goods_layer(id)
    {
        if (!Utils.$(id))
        {
            var n_div = document.createElement(‘DIV’);
            n_div.id = id;
            n_div.className = ‘order-goods’;
            document.body.appendChild(n_div);
            Utils.$(id).onmouseover = function()
            {
                window.clearTimeout(window.timer);
            }
            Utils.$(id).onmouseout = function()
            {
                hide_order_goods(id);
            }
        }
        else
        {
            Utils.$(id).style.display = ”;
        }
    }
    /**
     * 显示订单商品数据
     *
     * @return void
     */
    function show_order_goods(e, order_id, layer_id)
    {
        create_goods_layer(layer_id);
        $layer_id = Utils.$(layer_id);
        $layer_id.style.top = (Utils.y(e) + 12) + ‘px’;
        $layer_id.style.left = (Utils.x(e) + 12) + ‘px’;
        if (typeof(goods_hash_table[order_id]) == ‘object’)
        {
            response_goods_info(goods_hash_table[order_id]);
        }
        else
        {
            $layer_id.innerHTML = loading;
            Ajax.call(‘order.php?is_ajax=1&act=get_goods_info&order_id=’+order_id, ”, response_goods_info , ‘POST’, ‘JSON’);
        }
    }
    /**
     * 隐藏订单商品
     *
     * @return void
     */
    function hide_order_goods(layer_id)
    {
        $layer_id = Utils.$(layer_id);
        window.timer = window.setTimeout(‘$layer_id.style.display = “none”‘, 500);
    }
    /**
     * 处理订单商品的Callback
     *
     * @return void
     */
    function response_goods_info(result)
    {
        if (result.error > 0)
        {
            alert(result.message);
            hide_order_goods(show_goods_layer);
            return;
        }
        if (typeof(goods_hash_table[result.content[0].order_id]) == ‘undefined’)
        {
            goods_hash_table[result.content[0].order_id] = result;
        }
        Utils.$(show_goods_layer).innerHTML = result.content[0].str;
    }

ecshop中ajax.call使用

 ecshop中的ajax非常好用,当自己第一次使用的时候,也非常吃力。当自己用多了的时候,却感觉十分简单,也特别方便。

   首先,建立dwt.里面写个form进去,加个form提交时间的按扭

<img src=”images/tijiaoanniu_07.gif” width=”69″ height=”20″ border=”0″ style=”cursor:pointer”  onclick=”return sub_zixun();” />

   其次,在js中增加函数

    function sub_zixun(){
   var frm      = document.forms[‘zixun_form’];
  
   var msg_title = frm.elements[‘msg_title’].value;
   var msg_phone = frm.elements[‘msg_phone’].value;
   var user_email = frm.elements[‘user_email’].value;
   var msg_content = frm.elements[‘msg_content’].value;
  
  
   var msg = ”;
   if (msg_title.length == 0)
   {
  msg += ‘标题不能为空’ + ‘\n’;
   }
   if (msg_phone.length == 0)
   {
  msg += ‘电话号码不能为空’ + ‘\n’;
   }
 
   if (user_email.length == 0)
   {
  msg += ‘Email不能为空’ + ‘\n’;
   }
    if (msg_content.length == 0)
   {
  msg += ‘评论不能为空’ + ‘\n’;
   }
   if (msg.length > 0)
   {
  alert(msg);
  return false;
   }
   else
   {
  Ajax.call( ‘zixun.php?act=act_sub’, ‘msg_phone=’ + msg_phone+’&user_email=’+user_email+’&msg_content=’+msg_content+’&msg_title=’+msg_title, act_callback , ‘POST’, ‘TEXT’, true, true );
   }
}

 3:增加回调函数act_callback ()

function act_callback(result){
 
 if(result == ‘true’){
  alert(“提交评论成功”);
 }else{
  alert(“提交评论失败”);
 }
}

  处理ajax回调值的结果

  elseif ($act == ‘act_sub’){
  include_once(ROOT_PATH . ‘includes/lib_clips.php’);
 $message = array(
        ‘user_id’     => $_SESSION[‘user_id’],
        ‘user_name’   => $_SESSION[‘user_name’],
        ‘user_email’  => isset($_POST[‘user_email’]) ? htmlspecialchars(trim($_POST[‘user_email’]))     : ”,
        ‘msg_type’    => isset($_POST[‘msg_type’]) ? intval($_POST[‘msg_type’])     : 0,
        ‘msg_title’   => isset($_POST[‘msg_title’]) ? trim($_POST[‘msg_title’])     : ”,
        ‘msg_content’ => isset($_POST[‘msg_content’]) ? trim($_POST[‘msg_content’]) : ”,
        ‘order_id’    => 0,
        ‘msg_area’    => 1,
        ‘msg_phone’   => trim($_POST[‘msg_phone’]),
        ‘upload’      => array()
     );//留言板提交的数据
    
     if (add_message($message)){
      echo ‘true’;
     }else{
      echo ‘false’;
     }
  

}

  这样就完成了一次ecshop中ajax的所有调用步骤。

AJAX名片–什么是ajax

读音:e:j^ks 。AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术

       国内通常的读音为“阿贾克斯”和阿贾克斯足球队读音一样。Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动态地写入网页中,给缓慢的Web应用体验着色使之像桌面应用一样。 虽然大部分开发人员在过去使用过XMLHttp或者使用Iframe来加载数据,但仅到现在我们才看到传统的开发人员和公司开始采用这些技术。就像新的编程语言或模型伴随着更多的痛苦,开发人员需要学习新的技巧及如何最好利用这些新技术。

AJAX模式
  许多重要的技术和AJAX开发模式可以从现有的知识中获取。例如,在一个发送请求到服务端的应用中,必须包含请求顺序、优先级、超时响应、错误处理及回调,其中许多元素已经在Web服务中包含了,就像现在的SOA。AJAX开发人员拥有一个完整的系统架构知识。同时,随着技术的成熟还会有许多地方需要改进,特别是UI部分的易用性。
  AJAX开发与传统的CS开发有很大的不同。这些不同引入了新的编程问题,最大的问题在于易用性。由于AJAX依赖浏览器的JavaScript和XML,浏览器的兼容性和支持的标准也变得和JavaScript的运行时性能一样重要了。这些问题中的大部分来源于浏览器、服务器和技术的组合,因此必须理解如何才能最好的使用这些技术。
  综合各种变化的技术和强耦合的客户服务端环境,AJAX提出了一种新的开发方式。AJAX开发人员必须理解传统的MVC架构,这限制了应用层次之间的边界。同时,开发人员还需要考虑CS环境的外部和使用AJAX技术来重定型MVC边界。最重要的是,AJAX开发人员必须禁止以页面集合的方式来考虑Web应用而需要将其认为是单个页面。一旦UI设计与服务架构之间的范围被严格区分开来后,开发人员就需要更新和变化的技术集合了。
  时刻想着用户
  AJAX的最大机遇在于用户体验。在使应用更快响应和创新的过程中,定义Web应用的规则正在被重写;因此开发人员必须更注重用户。现在用户已经逐渐习惯如何使用Web应用了。例如用户通常希望每一次按钮点击会导致几秒的延迟和屏幕刷新,但AJAX正在打破这种长时间的状况。因此用户需要重新体验按钮点击的响应了。
  可用性是AJAX令人激动的地方而且已经产生了几种新颖的技术。其中最引人注目的是一种称为“黄色隐出”的技术,它在数据更新之前时将用户界面变为黄色,更新完成后立刻恢复原来的颜色。AJAX开发人员将用户从Web应用的负载中解放出来;小心地利用AJAX提供的丰富接口,不久桌面开发人员会发现AJAX是他们的方向。
  几种工具和技术
  随着AJAX迅速地引人注目起来,我想开发人员对这种技术的期待也迅速地增加。就像任何新技术,AJAX的兴旺也需要一整个开发工具/编程语言及相关技术系统来支撑。
  JavaScript
  如名字所示,AJAX的概念中最重要而最易被忽视的是它也是一种JavaScript编程语言。JavaScript是一种粘合剂使AJAX应用的各部分集成在一起。在大部分时间,JavaScript通常被服务端开发人员认为是一种企业级应用不需要使用的东西应该尽力避免。这种观点来自以前编写JavaScript代码的经历:繁杂而又易出错的语言。类似的,它也被认为将应用逻辑任意地散布在服务端和客户端中,这使得问题很难被发现而且代码很难重用。在AJAX中JavaScript主要被用来传递用户界面上的数据到服务端并返回结果。XMLHttpRequest对象用来响应通过HTTP传递的数据,一旦数据返回到客户端就可以立刻使用DOM将数据放到网面上。
  XMLHttpRequest
  XMLHttpRequest对象在大部分浏览器上已经实现而且拥有一个简单的接口允许数据从客户端传递到服务端,但并不会打断用户当前的操作。使用XMLHttpRequest传送的数据可以是任何格式,虽然从名字上建议是XML格式的数据。
  开发人员应该已经熟悉了许多其他XML相关的技术。XPath可以访问XML文档中的数据,但理解XML DOM是必须的。类似的,XSLT是最简单而快速的从XML数据生成HTML或XML的方式。许多开发人员已经熟悉Xpath和XSLT,因此AJAX选择XML作为数据交换格式是有意义的。XSLT可以被用在客户端和服务端,它能够减少大量的用JavaScript编写的应用逻辑。
  CSS
  为了正确的浏览AJAX应用,CSS是一种AJAX开发人员所需要的重要武器。CSS提供了从内容中分离应用样式和设计的机制。虽然CSS在AJAX应用中扮演至关重要的角色,但它也是构建跨浏览器应用的一大阻碍,因为不同的浏览器厂商支持各种不同的CSS级别。
  服务器端
  但不像在客户端,在服务端AJAX应用还是使用建立在如Java,.Net和PHP语言基础上机制;并没有改变这个领域中的主要方式。
  既然如此,我们对Ruby o n Rails框架的兴趣也就迅速增加了。在一年多前,Ruby o n Rails已经吸引了大量开发人员基于其强大功能来构建Web和AJAX应用。虽然目前还有很多快速应用开发工具存在,Ruby o n Rails看起来已经储备了简化构建AJAX应用的能力。
  开发工具
  在实际构建AJAX应用中,你需要的不只是文本编辑器。既然JavaScript是非编译的,它可以容易地编写和运行在浏览器中。然而,许多工具提供了有用的扩展如语法高亮和智能完成。
  不同的IDE提供了对JavaScript支持的不同等级。来自JetBrains的IntelliJ IDEA是一个用来JavaScript开发的更好的IDE,虽然许多开发人员也喜欢Microsoft’s Visual Studio产品(允诺会在最新的版本中改善对AJAX的支持)。Eclipse包含了两个免费的JavaScript编辑器插件和一个商业的来自ActiveStat的Komodo IDE。
  另一个JavaScript和AJAX开发中的问题是调试困难。不同的浏览器提供不同的通常是隐藏的运行时错误信息,而JavaScript的缺陷如双重变量赋值(通常是由于缺少数据类型)使得调试更加困难。在AJAX的开发中,调试就更复杂了,因为其需要标识究竟是客户端还是服务端产生的错误。在过去,JavaScript调试的方法是删除所有代码然后一行行的增加直到错误出现。现在,更多开发人员回到为IE准备的Microsoft Script Debugger和为Mozilla浏览器准备的Venkman。
  浏览器兼容性
  JavaScript编程的最大问题来自不同的浏览器对各种技术和标准的支持。构建一个运行在不同浏览器(如IE和火狐)是一个困难的任务。因此几种AJAX JavaScript框架或者生成基于服务端逻辑或标记库的JavaScript,或者提供符合跨浏览器AJAX开发的客户端JavaScript库。一些流行的框架包括:AJAX.Net, Backbase, Bitkraft, Django, DOJO, DWR, MochiKit, Prototype, Rico, Sajax, Sarissa, and Script.aculo.us.
  这些框架给开发人员更多的空间使得他们不需要担心跨浏览器的问题。虽然这些框架提升了开发人员构建应用的能力,但由于厂商已经开发了更细节的用户界面的打包组件解决方案,因此在AJAX组件市场中需要考虑一些其他因素。例如提供通用用户界面的组件如组合框和数据栅格的几个厂商,都可以被用来在应用中创建良好的通过类似电子数据表方式来查看和编辑数据的体验。但这些组件不仅是封装了组件的用户界面而且包括与服务端数据的通讯方式,这些组件通常使用基于标记方式来实现如ASP.Net或JSF控件。
  展望
  最近IE和火狐之间的浏览器之争变得火热起来,因此AJAX开发人员需要足够敏捷的作出反应。关键点在一些问题如CSS或XML,虽然各种浏览器形成采用最新标准的不同阵营(如Mozilla拥抱SVG和E4X标准及在最新火狐BETA版本中使用XUL,而微软使用自己的XAML技术)。所有这些技术代表当前AJAX主流JavaScript和XML的市场方向改变。
  总的来说,AJAX开发人员必须尽快地跟进最新的技术并利用高产的工具集。成功的AJAX开发人员还需要留心他们的使用者以避免将任何问题扩大化。并且AJAX开发人员还需要持续地创新来创建增强Web应用易用性的新方法。