Ajax的注意事项

JavaScript操作Ajax返回的JSON的注意事项及技巧 在Web开发中,使用Ajax技术获取和处理JSON数据是非常常见的任务。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输。在JavaScript中操作Ajax返回的JSON数据时,有一些注意事项和技巧可以帮助我们更有效地处理数据。下面将详细介绍这些内容,并提供相应的源代码示例。 错误处理 在使用Ajax获取JSON数据时,可能会遇到网络错误或服务器返回的错误信息。为了确保代码的健壮性,应该对这些错误进行适当的处理。可以使用try-catch 阅读详情

一、安全性问题

1.1 同源策略

    JavaScript不能访问不同来iuande脚本或者文档。这是浏览器厂商采取的一个安全措施。否则,恶意代码的编写者就能在任何地方执行代码。同源策略提出,仅当两个页面的协议(HTTP),端口号(默认为80)和主机名相同时,它们才是同源的。
    考虑以下两个页面:

  • 页面1位于:http://www.site.com/folder/mypage1.html
  • 页面2位于:http://www.site.com/folder/mypage2.html
        根据同源策略,这是两个同源页面。它们有相同的主机(www.site.com),使用相同的协议(HTTP),并在相同的端口上访问(这两个页面都没有指定端口,因此都使用80端口)。由于这是两个同源页面,因此一个页面中的JavaScript可以访问另一个页面

    再考虑下面的两个页面

  • 页面1位于:http://www.site.com/folder/mypage1.html
  • 页面2位于:https://www.site.com/folder/mypage2.html
        这两个页面是不同源的。他们的主机名相同,但协议和端口号不同。页面1使用HTTP协议(端口号为80),而页面2使用HTTPS协议(端口号为443)。这一差异虽然小,但足以使这两个页面不同源。因此,其中一个页面的JavaScripte无法访问另一页面。
        这与Ajax技术有什么关系?因为JavaScript在Ajax中占很大比例。例如,由于同源策略的限制,XMLHttpRequest对象将无法访问任何不同来源的的文件或文档。这一问题很容易解决uefa:使用一个同源的页面作为代理(proxy),获取另一个非同源服务器上的数据。同源策略还影响到隐藏的frame/iframe技术,即使两个不同来源的页面位于同一个框架中,JavaScript也无法与这两个页面交互。

1.2 ActiveX

    XMLHttpRequest的一个弊端在于它是一个ActiveX控件,只适用于Windows上的IE。如果用户完全禁用ActiveX,或者站点被标记为某个安全区域,就无法创建ActiveX对象,使基于XMLHttpRequest的Ajax应用程序无法正常工作


二、可用性问题

2.1 浏览器的Back按钮

    XMLHttpRequest的一个优点是易于使用。我们只需创建对象,发送请求,等待服务器的响应。但是,这个对象有一个缺点:大多数浏览器都不能在其历史记录中保存使用该对象发出的请求,因此,XMLHttpRequest实际上使用浏览器的Back按钮失效。这是一些支持Ajax的应用程序或组件希望出现的副作用,但它可能改用户带来严重的可用性问题

2.2 使用iframe创建支持Back和Forward按钮的表单

    使用旧式的Ajax技术可以避免使浏览器的导航按钮失效,即使用隐藏框架/内置框架进行客户端和服务端的通信。只有使用这两个框架时,这种方法才能正常功能做。其中一个框架是隐藏的,另一个框架是可见的。
    隐藏可见技术包含4个步骤

  1. 用户启动对隐藏框架的Javascript调用。为此,用户可以单击可见框架中的按钮,或者执行其他形式的交互操作。这个调用通常只是将隐藏框架重定向到另一个网页上。这个重定向会自动触发第二步。
  2. 向服务器发送请求,服务器会处理数据
  3. 服务器响应(一个网页)发送回隐藏框架
  4. 浏览器再隐藏框架中加载网页,执行联系课件框架所需的Javascript代码

2.3 服务器响应

    使用XMLHttpRequest对象从服务器上获取数据时,服务器的响应仅包含很少几个词语,当下面案例的响应不同,它必须包含两项内容:

  • 数据,必须是HTML格式
  • iframe接收到HTML响应时联系父文档的机制
    下面的的代码是响应HTML页面的示例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
        top.checkUsername_callBack("available","some_userame");
    </script>
</body>
</html>

2.4 iframe智能表单

(1)数据提交页面:validate_iframe_form.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title>Form Field Validation</title>
    <style type="text/css">
        .fieldname
        {
            text-align: right;
        }

        .submit
        {
            text-align: right;
        }

        #hiddenFrame {
            display: none;
        }
    </style>
    <script type="text/javascript">
        function checkUsername() 
        {
            var userValue = document.getElementById("username").value;

            if (userValue == "") 
            {
                alert("Please enter a user name to check!");
                return;
            }

            var url = "iframe_formvalidator.php?username=" + userValue;

            frames["hiddenFrame"].location = url;
        }

        function checkUsername_callBack(data, userValue) 
        {           
            if (data == "available") 
            {
                alert("The username " + userValue + " is available!");
            } 
            else 
            {
                alert("We're sorry, but " + userValue + " is not available.");
            }
        }

        function checkEmail() 
        {
            var emailValue = document.getElementById("email").value;

            if (emailValue == "") 
            {
                alert("Please enter an email address to check!");
                return;
            }

            var url = "iframe_formvalidator.php?email=" + emailValue;

            frames["hiddenFrame"].location = url;
        }

        function checkEmail_callBack(data, emailValue) 
        {            
            if (data == "available") 
            {
                alert("The email " + emailValue + " is currently not in use!");
            } 
            else 
            {
                alert("We're sorry, but " + emailValue + " is in use by another user.");
            }
        }
    </script>
</head>
<body>
    <form>
        <table>
            <tr>
                <td class="fieldname">
                    Username:
                </td>
                <td>
                    <input type="text" id="username" />
                </td>
                <td>
                    <a href="javascript: checkUsername()">Check Availability</a>
                </td>
            </tr>
            <tr>
                <td class="fieldname">
                    Email:
                </td>
                <td>
                    <input type="text" id="email" />
                </td>
                <td>
                    <a href="javascript: checkEmail()">Check Availability</a>
                </td>
            </tr>
            <tr>
                <td class="fieldname">
                    Password:
                </td>
                <td>
                    <input type="text" id="password" />
                </td>
                <td />
            </tr>
            <tr>
                <td class="fieldname">
                    Verify Password:
                </td>
                <td>
                    <input type="text" id="password2" />
                </td>
                <td />
            </tr>
            <tr>
                <td colspan="2" class="submit">
                    <input type="submit" value="Submit" />
                </td>
                <td />
            </tr>
        </table>
    </form>
    <iframe src="about:blank" id="hiddenFrame" name="hiddenFrame" />   
</body>
</html>

(2)后台处理页面:iframe_formvalidator.php

<html>
<head>
    <title>Returned Data</title>
</head>
<body>
<?php
$array = Array(
    Array("jmcpeak", "someone@zyx.com"),
    Array("pwilton", "someone@xyz.com")
);

if (isset( $_GET["username"]) || isset( $_GET["email"])) 
{
    $result = false;
    $jsFunction = "";
    $searchTerm = "";

    if (isset( $_GET["username"])) 
    {
        $searchTerm = $_GET["username"];
        $jsFunction = "checkUsername_callBack";

        for ($i = 0; $i < count($array); $i++) 
        {
            if (strtolower($array[$i][0]) == strtolower($searchTerm)) 
            {
                $result = true;
            }
        }
    }

    if (isset( $_GET["email"])) 
    {
        $searchTerm = $_GET["email"];
        $jsFunction = "checkEmail_callBack";

        for ($i = 0; $i < count($array); $i++) 
        {
            if (strtolower($array[$i][1]) == strtolower($searchTerm)) 
            {
                $result = true;
            }
        }
    }

    $strResult = ($result)?"not available":"available";
?>
    <script>
        top.<?php echo $jsFunction; ?>("<?php echo $strResult; ?>", "<?php echo $searchTerm; ?>" );
    </script>
<?php
} 
else 
{
    echo "PHP is working correctly. Congratulations!";
}
?>
</body>
</html>

(3)输入用户名和email地址点击”Check Availability”进行检查。提交后,文本框被清空,单击浏览器的Back按钮几次,前面输入的信息将按倒序出现。也可以单击Forward按钮进行测试

(4)代码解析
    页面正文中的HTML没有变化,只是在最后添加了iframe标签。

<iframe src="about:blank" id="hiddenFrame" name="hiddenFrame" />   

    该框架初始化为欸一个空白的HTML页面,其name和id属性都包含hiddenFrame的值。后面使用name属性的值。从Bom的frames集合中获取这个框架。接下来设置该框架的CSS

#hiddenFrame {
    display: none;
}

    下面是Javascript代码

function checkUsername() 
{
    var userValue = document.getElementById("username").value;

    if (userValue == "") 
    {
        alert("Please enter a user name to check!");
        return;
    }

    var url = "iframe_formvalidator.php?username=" + userValue;

    frames["hiddenFrame"].location = url;
}

    checkUsername()使用iframe替代XMLHttpRequest,来发出请求。改函数最后使用frames集合和location属性把URL加载到隐藏的iframe中。
    剩余的函数不再赘述。

2.5 处理延迟

    Web浏览器与传统的应用程序一样,其用户界面(UI)会提示浏览器执行某个任务。用户单击链接时,会运行一个跳动的动画,光标的旁边会出现一个沙漏图标,状态栏会显示浏览器加载页面的进度
    这正是Ajax技术特别是XMLHttpRequest没有解决的另一个问题。但这个问题非常容易解决:只需添加UI元素,告诉用户某个任务正在运行,在该任务完成时删除或隐藏UI元素

2.6 在Ajax失败时正常退出

    在理想情况下,编写的代码每次都能正常运行。但如果用户在浏览器上关闭了Javascript,Ajax就会运行失败
    解决方法:创建一个旧式的网页,使用旧式的表单、链接和其他HTML元素。然后,关闭这些HTML元素的默认行为,并使用Javascript来添加相应的Ajax功能。考虑下面的超链接

<a href="http://www.baidu.com" title="test" onclick="return false;"></a>

    这个功能的关键在于上述代码中的onclick事件处理程序,并返回false。可以在该事件处理程序中执行任何代码,只是最后必须放回false。这将告诉浏览器,单击超链接时不执行其默认动作。如果用户禁止了JavaScript,则忽略onclick事件处理程序,超链接将恢复其正常行为。
    作为一个经验法则,应先创建网页,再添加Ajax.

51、深入探究Ajax:从XMLHttpRequest到IFrame智能表单及注意事项 本文深入探讨了Ajax技术,重点分析了XMLHttpRequest和IFrame在异步通信中的应用与局限性。内容涵盖邮箱可用性检查、IFrame智能表单实现、浏览器历史记录兼容性处理,以及同源策略、ActiveX和可用性问题。同时,文章介绍了Ajax的实际应用场景如实时搜索建议和动态加载内容,并对XMLHttpRequest与IFrame的优缺点进行了对比,最后展望了Ajax技术的未来趋势,包括Fetch API和WebSocket的使用。 阅读详情

相关推荐

Python多进程实战:用BaoStock高效下载股票历史数据的5个优化技巧

本文详细介绍了使用Python多进程技术通过BaoStock高效下载股票历史数据的5个优化技巧。从理解BaoStock的数据获取机制到进程池配置、智能任务分片、异常处理及性能监控,帮助开发者显著提升数据下载效率,特别适合量化交易领域的数据采集需求。

weixin_30369041的博客 456

ajax使用详解及注意事项

ajax简介 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。 要学一门技术,最基本名字是要读正确的,美式发音音标:[ˈeˌdʒæks] 。对于ajax的这个名字,究其历史原因,当时Ajax技术使用于JavaScript之上,进行的是XML格式数据的传输,通过在后台与服务器进行少量数...

qq_29018891的博客 2154

Audio2Face进阶玩法:结合LiveLink在UE5中实现MetaHuman全身动画+语音驱动(保姆级配置指南)

本文提供了一份详尽的保姆级教程,指导如何将NVIDIA Audio2Face与Unreal Engine 5的LiveLink功能结合,实现驱动MetaHuman数字人面部表情的同时,无缝融合身体动画。文章详细讲解了从环境准备、插件部署、基础面部驱动测试,到动画蓝图高级配置与多数据流融合的全流程,并分享了性能优化与问题排查的实战经验,旨在帮助创作者打造表情与肢体动作协调统一的生动数字人。

q9w8e7r6t5的博客 196

AJAX 开发中的注意点

摘要 本文介绍了AJAX开发中的关键注意事项,包括错误处理、跨域解决方案(CORS)、安全防护(XSS/CSRF)、用户体验优化(加载状态提示)、请求频率控制(防抖/节流)、缓存策略(HTTP/本地存储)、请求取消(AbortController)以及数据格式统一化。通过示例代码演示了如何实现这些优化,帮助开发者构建更稳定、安全且高效的Web应用。

BUG糕手的博客 887

EtherCAT-7 从站代码移植-SPI

STM32F103 + AX58100,从站代码移植。

tianya_xuan的博客 3567

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5847

HttpURLConnection中获得重定向的地址

当使用HttpURLConnection访问A地址,但是A地址内部会自动重定向到B地址,因为我们是会HttpURLConnection方式访问接口,故我们应用无法直接重定向到B地址,此时需要我们通过HttpURLConnection获取重定向后的B地址返回给前端,让前端去访问B地址,达到跳转的目的。(对于页面表单访问A地址的话,浏览器会自动帮我们重定向到B地址,完成重定向过程) 一、该方式可以获...

Code-Create-World 3723

Vue - 详细实现低代码平台,支持拖曳式可视化生成应用软件功能,用户通过拖拽元素、搭积木的方式创建应用(适合迭代的基础架构、低代码平台)

Vue低代码平台-拖曳式拖拉拽可视化生成应用软件,拖拽式低代码数据可视化开发平台,vue实现拖拽,拖拽式Vue组件代码生成平台,基于vue的可视化拖拽代码生成工具,Vue实现可拖拽组件的方法,一个低代码平台的前端部分,靠拖拉拽生成页面。Vue技术栈从零实现低代码可视化搭建平台示例,低代码轮子,通过拖拽就可生成Vue代码的平台来了,vue低代码平台开发相关比低代码更强大的零代码开发平台,这款低代码SAAS数据可视化工具,拖拽生成大屏。vue实现拖拽效果,Vue自由拖拽缩放组件,自定义组件(文本、图片

🏆 前端领域优质创作者 1万+

使用ajax注意事项

$.ajax({ url: ctx +"/meeting/getMeetingRoomMap", //请求后台地址 type:"get", //请求方式 cache:false, //控制是否缓存数据(post请求默认false,而get请求会为true,容易造成页面数据缓存问题) async:false, //控制同步还是异步 data:{scheduleDate:sc...

weixin_44021910的博客 459

10、数据挖掘与轨迹生成技术:FSSEMiner与CondTraj - GAN的探索

本文介绍了两种先进的数据处理技术:FSSEMiner算法用于从动态属性图中挖掘频繁顺序子图演化模式,揭示如交通流和疾病传播等复杂系统的演化规律;CondTraj-GAN是一种端到端的条件生成对抗网络,能够生成高质量的合成车辆轨迹,解决真实轨迹数据因隐私问题难以获取的挑战。通过实验评估与真实数据集验证,两种技术在可扩展性、实用性及生成质量方面均表现出色,并在交通管理、城市规划、自动驾驶研发等领域具有广泛应用前景。

grafana8visual的博客 87

18年陕西省TI杯电赛无人机赛题视觉部分

更新: 相同任务另外两种不同的视觉方法: https://blog.youkuaiyun.com/qq_41895747/article/details/97613077 https://blog.youkuaiyun.com/qq_41895747/article/details/97614971 任务:识别前方的方框,无人机从方框中飞出去 视觉任务:识别特定方框,返回方框中心坐标 # -*- codin...

沉迷单车的追风少年 1506

AJAX 注意事项

Ajax:Asynchronous JavaScript and XML 1.异步的javascript和xml技术,允许浏览器与服务器通信而无须刷新当前页面的技术 Ajax包含的技术有使用javascript操作DOM(Document Object Model)进行动态显示及交互 ;使用XML和XSLT进行数据交换以及相关操作;使用XMLHttpRequest对象与服务器进行异步数据交互

moonhelena的专栏 875

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

学无止境、积少成多、厚积薄发 3983

AJAX注意事项

AJAX注意事项 一、中文URL问题 中文URL必须做转换,用encodeURIComponent 请求超时用obj.abort来进行异步处理 URL只能有ASCII码 二、post请求 post请求要使用Content-type指定类型 在send方法中进行传递参数 三、XML文件 结果有中文,要添加header 来设置中文 f...

茂木残花任风萧 362

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ajax的get和post请求,Ajax Get和POST请求注意事项

友情提示:此篇文章大约需要阅读 2分钟33秒,不足之处请多指教,感谢您的阅读。Ajax中的Get请求ajax中get请求需要注意两个地方:在URL地址后面以请求字符串(传递的get参数信息)形式传递数据;对中文、=、&等特殊符号的处理。对特殊信息的处理:在浏览器中通过get请求传递一些特殊符号信息会被误解与混淆,例如& 、 = 等为了避免特殊符号被误解产生歧义,需要对其进行编码处理...

weixin_34515601的博客 316

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

简述ajax请求过程,以及注意事项

请求过程: // ajax 提交 post 请求的数据 // 1. 创建核心对象 var xhr = new XMLHttpRequest(); // 2. 准备建立连接 xhr.open("POST", "register.php", true); // 3. 发送请求 // 如果要POST提交数据,则需要设置请求头 xhr.setRequestHeader("Content-Type", "a...

weixin_45259626的博客 635

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ajax注意事项

ssm,使用ajax好像必须有返回值,不然jsp页面没有反应

qq_42331499的博客 169

Ajax使用注意事项

Ajax是一种从页面获取数据,传送到服务器,服务器进行数据处理后,将处理结果返回到页面的一种技术。   虽然在使用这种技术的时候,我们大多数时间都在使用像jquery,ext,dojo等等的框架封装过的技术来使用,这虽然能够减少很多的注意事项,不过并不是全部。下面是我在使用过程中总结的注意事项: 1.同步和异步问题    如果你需要立即使用返回的数据,接下来的数据处理过程需要等待服务

seacean2000的专栏 885

ajax 请求注意哪些方面,JQuery实现ajax请求的示例和注意事项

JQuery实现ajax请求的示例和注意事项最近很多人问我ajax该怎么用,怎么访问后台,怎么取得数据页面显示写一个简单的ajax访问:$.ajax({url: ctx +"/meeting/getMeetingRoomMap", //请求后台地址type:"get", //请求方式cache:false, //控制是否缓存数据(post请求默认false,而get请求会为true,容易造成...

weixin_32323465的博客 375

eclipse servlet ajax,Hbuilder用ajax连接eclipse中的servlet例子以及注意事项

今天用前端神器Hbuilder连接eclipse中的servlet,真是费了九牛二虎之力,才把问题解决Hbuilder中的代码:test.htmlHello MUIh5 {margin: 5px 7px;}input(输入框)Input密码确认取消mui.init({swipeBack: true //启用右滑关闭功能});function login() {// var ...

weixin_34379989的博客 664

js读取图片以及AJAX上传图片注意事项

对于读取一个文件,图片,大家都很熟悉,但是这里面必须注意一些细节问题。 首先我们必须保证我们的图片读取成功了,以及读取完成了,读取成功,大家都会判断,而这个读取完成了,大家往往会忽略掉它, 这里,我提供一个我自己写的经常用的一个函数模板吧,其实不是什么函数模板,只是经常这么写而已,对此,我希望读者可以去看看js里面的Image()对象的属性判断的方法什么的,对大家有好处,下面我为大家给截图过来

qq_18661257的专栏 6267

ajax提交表单的一些注意事项:解释为什么return false却依然提交

ajax提交表单的一些注意事项.ajax提交表单是经常用到的.一般ajax提交要求不再跳转,自然而然的用到了return false .但是你知道 return false 无效,有哪些原因吗? 1.js代码有错误,语法错误,逻辑错误,等等. 语法错误相对容易解决,firebug可以看得清楚.逻辑错误就得仔细排查了; 2.跨域. www.xiaojudeng.com 域名下ajax请求 w

shaozengwei的专栏 6586

使用ASP.NET AJAX的注意事项

1. 画面迁移应该使用执行画面重定向的Response.Redirect而不是Server.Transfer,因为Server.Transfer不改变IE客户端URL,会导致ASP.NET AJAX客户端脚本访问资源的时候出现URL错误。 2.在服务器端注册脚本和隐藏字段应该使用类ScriptManager,而不是Page.ClientScript对象,因为Page.ClientScri

longvslove的专栏 361

Jquery 的Ajax 注意事项

以前的我都喜欢使用$.get和$.post 这两种方式来

史上最强的弟子 759
上一篇: 理解JavaScripte this关键字
下一篇: JavaScript特效1——页面特效
chenyonken
博客等级 码龄11年 43粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值