执行AJAX返回HTML片段中的JavaScript脚本

FPGA HDMI视频环路输出实验解析:从像素时钟到工程调试 在FPGA视频处理领域,HDMI接口是绕不开的高速数字视频入口。视频信号从HDMI座子进入后,经接收芯片完成TMDS解码与8b/10b转换,输出并行像素数据与行场同步时序;FPGA在中间负责数据分发与时序组织,再通过发送芯片重新编码为TMDS信号输出,从而实现视频链路中的环路输出功能。环路输出的核心在于同源时钟透传与信号完整性的把控,像素时钟计算、I2C配置寄存器、HPD热插拔时序以及EDID读取是决定链路能否稳定工作的关键。该技术广泛应用于专业监视器、视频矩阵、采集卡等设备中,其设计思路也直接支撑图像缩放 阅读详情

如果AJAX加载的数据是一个HTML片段,而且这个HTML片段还包含脚本<script>块,那么在你把这数据xmlHttp.responseText用innerHTML方法插入到当前文档一个元素中,你会发现AJAX加载回来的脚本根本没有执行。这是AJAX开发中很常见的问题,如果你不是一直在用JavaScript框架做开发,相信你早就发现这个问题了。本文分析了两个解决办法,其中一个是讲解jQuery框架的实现。

一、 问题描述

下面举个简单的例子,演示问题所在。在下面的例子中,假设变量responseText就是AJAX加载的HTML片段数据,其中包含脚本弹出一条消息,用innerHTML方法插入ID为ajaxData的DIV中,你可能期望看到弹出那个消息框,结果你发现没有,问题就是这样。

< div  id ="ajaxData" ></ div >
< script  type ="text/javascript" >
var  responseText  =   ' <p>这是一个段落</p><script>alert("这是AJAX加载回来的脚本片段")</script> ' ;
document.getElementById(
' ajaxData ' ).innerHTML  =  responseText;
</ script >

二、两种解决办法

1、 利用JavaScript的eval方法执行脚本。

本方法的具体实现思路是把xmlHttp.responseText中的脚本都抽取出来,不管AJAX加载的HTML包含多少个脚本块,我们对找出来的脚本块都调用eval方法执行它即可。下面提供一个封装好的函数:

function  executeScript(html)
{
    
var  reg  =   / <script[^>]*>([^/x00]+)$ / i;
    
// 对整段HTML片段按<//script>拆分
     var  htmlBlock  =  html.split( " <//script> " );
    
for  ( var  i  in  htmlBlock) 
    {
        
var  blocks; // 匹配正则表达式的内容数组,blocks[1]就是真正的一段脚本内容,因为前面reg定义我们用了括号进行了捕获分组
         if  (blocks  =  htmlBlock[i].match(reg)) 
        {
            
// 清除可能存在的注释标记,对于注释结尾-->可以忽略处理,eval一样能正常工作
             var  code  =  blocks[ 1 ].replace( / <!-- / ,  '' );
            
try  
            {
                eval(code) 
// 执行脚本
            } 
            
catch  (e) 
            {
            }
        }
    }
}

本方法的使用如下,对HTML用innerHTML方法添加到DOM,紧跟着调用executeScript方法执行脚本块:

document.getElementById( " div1 " ).innerHTML  =  xmlHttp.responseText;
executeScript(xmlHttp.responseText);

显然这个方法还是存在缺陷的,如果xmlHttp.responseText包含像这样的外部脚本调用:
<script type="text/javascript" src="/js/common.js"></script>,executeScript方法不能再深入执行这个外部加载的脚本。

2、 学习并使用jQuery框架的实现

jQuery对于AJAX加载HTML,是最终在执行html(value)方法时把整个xmlHttp.responseText数据转换成DOM,然后利用DOM相关操作方法来找出里面的脚本,最后再把这些脚本插入到head中。具体原理也不好说,先举个最简单的例子,然后再分析一下大致思路。先看例子:

$.get( ' ajax.aspx ' ,  function (data)
{
    $(
' #div1 ' ).html(data);
});

现在假设上面ajax.aspx页面返回的是HTML片段,而且包含一个或多个脚本块,甚至外部脚本引用。div1是AJAX请求发起页的一个DIV标签的ID,整句代码实现的结果是加载ajax.aspx中的HTML填充到一个ID为div1的DIV标签中。

在匿名回调函数中通过typeof(data)可以发现data还是原始的字符串,即等同于xmlHttp.responseText,通过代码执行跟踪发现,对AJAX加载脚本片段的执行处理不在jQuery的AJAX模块代码中,而是在html(value)方法,即把一段包含脚本块的HTML字符串插入DOM时,由它负责抽出脚本进行调用处理。而html(value)方法其实又是调用了append(value)方法……,整个过程大概调用了以下方法,箭头代表调用这些方法的先后顺序:

html -> append -> domManip -> clean -> evalScript -> globalEval

其中clean方法特别关键,这个方法也是jQuery比较重要的方法,其中也涉及修复HTML错误(标签没有结束,表格结构调整等方法)处理脚本。而脚本的抽出也是在这里进行的。看看相关源代码(jQuery1.3.2):

if  (fragment) 
{
    
for  ( var  i  =   0 ; ret[i]; i ++ ) 
    {
        
if  (jQuery.nodeName(ret[i],  " script " )  &&  ( ! ret[i].type  ||  ret[i].type.toLowerCase()  ===   " text/javascript " )) 
        {
            scripts.push(ret[i].parentNode 
?  ret[i].parentNode.removeChild(ret[i]) : ret[i]);
        }
        
else  
        {
            
if  (ret[i].nodeType  ===   1 ) 
                ret.splice.apply(ret, [i 
+   1 ,  0 ].concat(jQuery.makeArray(ret[i].getElementsByTagName( " script " ))));
            fragment.appendChild(ret[i]);
        }
    }
    
return  scripts;
}

另外,在evalScript方法中我们还发现如下代码,这里是“同”步加载像<script type="text/javascript" src="/js/common.js"></script>这样的外部脚本,解决executeScript方法存在的一个缺陷:

if  (elem.src) 
    jQuery.ajax(
    {
        url: elem.src,
        async: 
false ,
        dataType: 
" script "
    });

同时也发现如下代码,这段代码是把xmlHttp.responseText中的脚本删除,因为在这个方法中,jQuery是准备把抽取的脚本放入head区,所以删除可以避免最终的HTML出现重复的脚本块:

if  (elem.parentNode)
    elem.parentNode.removeChild(elem);

最后,在globalEval方法中,发现head.removeChild( script );方法,就是把脚本插入head后马上又移除脚本标签,这也是避免因为重复执行html(value)方法在head区生成重复的脚本块。这个移除是不影响脚本执行的,同是也是不会清除脚本块中的相关变量值。显然,如果你想看看html(data)最终的执行结果,比如抽取后插入到head的脚本块是什么,你可以先临时注释这一行代码。

用AJAX返回HTML片段中的JavaScript脚本 这是AJAX开发中很常见的问题,如果你不是一直在用JavaScript框架做开发,相信你早就发现这个问题了。本文分析了两个解决办法,其中一个是讲解jQuery框架的实现。 一、 问题描述 下面举个简单的例子,演示问题所在。在下面的例子中,假设变量responseText就是AJAX加载的HTML片段数据,其中包含脚本弹出一条消息,用innerHTML方法插入ID为ajaxData的DIV中,你可能期望看到弹出那个消息框,结果你发现没有,问题就是这样。 代码如下: <div id=”ajaxData”></div> [removed] var res 立即下载

相关推荐

文章详细介绍了进行DoIP(DiagnosticoverInternetProtocol)测试的完整过程,包括样件的正确接线、CANoe软件的环境配置、端口设置、VLAN配置、IP和MAC地址的设定

关于Tester和DUT的地址,其实最主要的就是DUT的IP、MAC和逻辑地址,如果不知道Tester的IP、MAC和逻辑地址,可以配置为与DUT同一网段的就可以。ps:最重的是知道DUT的IP、逻辑、MAC地址,如果有VLAN也需要知道,Tester的地址可以根据DUT地址进行设定,其余的值可根据DoIP的报文查到相关参数。ps:如果在通信中没有建立VLAN,但是源地址和目的地址都填写正确,此时就要考虑是否是遗漏了VLAN,建立一个VLAN,在重新试试是否可通信。此处与硬件连接是相对应的,要注意!

qq_40965861的博客 1127

ajax获取的数据中包含html代码,执行ajax返回数据中包含的script脚本代码

ajax虽然很方便,提升了我们的交互体验,但是它也有可恨之处,就是ajax请求得到的数据中如果包含脚本代码,比如说请求得到的是一块html内容,我们把这块html内容插入到网页中的某个地方,但是其中明明存在的脚本却不能得以运行,如果你听不懂我在说什么,说明你还不懂ajax或者用得少没遇到这种现象。通常来讲,页面中包含的脚本形式无非两种:第一种:var _hmt = _hmt || [];(func...

weixin_34028581的博客 621

sysbench安装(在线&离线)

sysbench下载、安装、编译和异常处理方法

m0_61066945的博客 8751

ajax请求返回后JS无法执行的问题

一:发送ajax请求,在onComplete时,如果返回的html时包含有javascript,则这些javascrip并不会被认到,也并不不执行。这个问题困扰了我很长时间,后面再发个时间把这个知识点总结一下及如何来解决这个问题。 1.发现对于ajax的理解还是不够深,抽些时间看看书,看看资料,好好地研究下。 2.发现对于protype的理解还是不够深,抽些时间看看书,看看资料,好好地研究下。 3...

lgx2351 739

Linux【实战】—— LAMP环境搭建 & 部署网站

由LinuxApacheMySQLPHP组成的一个web网络平台。

2201_75935630的博客 4980

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

执行AJAX返回HTML片段中的JS脚本

在开发中,做某一遮罩层显示功能发现: 如果AJAX加载的数据是一个HTML片段,而且这个HTML片段还包含脚本&lt;script&gt;块,那么在你把这数据插入到当前文档一个元素中,你会发现AJAX加载回来的脚本根本没有执行,但是这个页面在单独的情况下是可以执行的。 在网上查找资料,发现这个问题是AJAX数据传输常见的问题,一般有两种解决思路: 1 利用JavaScript的eval...

M-zone 402

redhawk:使用rh_setup.pl产生gsr模板

必须加的option工具会在rh_setup.pl给出提示,按照要求填写即可,另外工具会把所有填写的输入文件和信息放到rh_setup.init文件中,拷贝这个文件可在任何平级运行目录下,直接rh_setup.pl产生gsr以及run sta/dyn/em的脚本。rhsetup.pl -top top_cell_name -vdd_nets VDD 1.2 VDD2 1.2 -vss_nets VSS -frequency 100e6 (100m是默认值)更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1050

ajax处理html视频,执行AJAX返回HTML片段中的JavaScript脚本

如果AJAX加载的数据是一个HTML片段,而且这个HTML片段还包含脚本块,那么在你把这数据xmlHttp.responseText用innerHTML方法插入到当前文档一个元素中,你会发现AJAX加载回来的脚本根本没有执行。这是AJAX开发中很常见的问题,如果你不是一直在用JavaScript框架做开发,相信你早就发现这个问题了。本文分析了两个解决办法,其中一个是讲解jQuery框架的实现。一、...

weixin_42299244的博客 152

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 811

[转]执行AJAX返回HTML片段中的JavaScript脚本

[转]原文地址:http://www.cnblogs.com/webflash/archive/2010/01/04/1638621.html   如果AJAX加载的数据是一个HTML片段,而且这个HTML片段还包含脚本&lt;script&gt;块,那么在你把这数据xmlHttp.responseText用innerHTML方法插入到当前文档一个元素中,你会发现AJAX加载回来的脚本根本...

iteye_5524的博客 179

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5659

prototype ajax external javascript

用 new Ajax.updater 更新了一个文件,这个文件中有   &lt;script src="/files/inc/tests.js" type="text/javascript" &gt;&lt;/script&gt;   &lt;script type="text/javascript"&gt;     alert(11); &lt;/script&gt;

abcs007 141

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ajax 必须要有触发吗,IE没有触发ajax 成功事件

$.ajax({url: '/comment_rewards/' + comment_reward_id + '/pay.js',type: 'POST',data: {channel: reward_style, reward_num: reward_num},dataType: "script",cache: true}).done(function() {console.log("succe...

weixin_28756021的博客 193

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ajax获取html片段,用AJAX返回HTML片段中的JavaScript脚本

这是AJAX开发中很常见的问题,如果你不是一直在用JavaScript框架做开发,相信你早就发现这个问题了。本文分析了两个解决办法,其中一个是讲解jQuery框架的实现。一、 问题描述下面举个简单的例子,演示问题所在。在下面的例子中,假设变量responseText就是AJAX加载的HTML片段数据,其中包含脚本弹出一条消息,用innerHTML方法插入ID为ajaxData的DIV中,你可能期望...

weixin_33908906的博客 559

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: jQuery数据缓存data(name, value)详解及实现
下一篇: 当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
webflash
博客等级 码龄18年 19粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值