这篇文章主要围绕ajax注册事件页面加载执行js事件和ajax实现注册展开,旨在为您提供一份详细的参考资料。我们将全面介绍ajax注册事件页面加载执行js事件的优缺点,解答ajax实现注册的相关问题,
这篇文章主要围绕ajax 注册事件 页面加载执行js事件和ajax实现注册展开,旨在为您提供一份详细的参考资料。我们将全面介绍ajax 注册事件 页面加载执行js事件的优缺点,解答ajax实现注册的相关问题,同时也会为您带来ajax 加载 页面 执行 js、ajax 执行成功后返回j页面加载 joson 数据(加载select数据)、Ajax动态刷新元素js事件失效、Ajax局部更新导致JS事件重复触发问题的解决方法的实用方法。
本文目录一览:- ajax 注册事件 页面加载执行js事件(ajax实现注册)
- ajax 加载 页面 执行 js
- ajax 执行成功后返回j页面加载 joson 数据(加载select数据)
- Ajax动态刷新元素js事件失效
- Ajax局部更新导致JS事件重复触发问题的解决方法
ajax 注册事件 页面加载执行js事件(ajax实现注册)
jsp 页面
<div>
<li></li>
<input id="ac-1" name="accordion-0" type="checkBox"https://www.jb51.cc/tag/dis/" target="_blank">display: none;" />
<label for="ac-1" id ="title-1">Car Database
<img id="img-0"src="../images/progress/common/add.png" />
</label>
<articleid="accordion-content0"></article>
<li></li>
</div>
js 代码
<script src="${pageContext.request.contextpath}/plugin/jquery/jquery-1.7.2.min.js"></script>
<script src="${pageContext.request.contextpath}/plugin/jquery/jquery-ui-1.8.20.custom.min.js"></script>
//注册事件
$(document).ready(function() { $("input[name='accordion-0']").attr("checked","checked"); $("#img-0").attr('src','../images/progress/common/sub.png'); var url = contextpath + "/market/showCar.action"; //点击加号 后加载 Car Database 录入界面 $("#accordion-content0").load(contextpath + "/market/showCar.action",{'sID':'${sID}'}); });
ajax 加载 页面 执行 js
ajax 加载 页面 执行 js 博客分类: java事件背景
有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。
解决思路
1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。
2. 使用document.write输出代码,我等简洁主义者所不愿。
3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。
4. eval是个解决方法,虽然低效。
5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个<script>标签,把js内容插入即可执行。但使用中发现,firefox可行,但IE还是不从。(师太,您就从了吧~)
解决方案 (一)
综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:
function executeScript(html) {alert(13);
var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
var jsContained = html.match(regDetectJs);
if(jsContained) {
var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;
var jsNums = jsContained.length;
for (var i=0; i<jsNums; i++) {
var jsSection = jsContained[i].match(regGetJS);
if(jsSection[2]) {
if(window.execScript) { alert(1);
// 给IE的特殊待遇
window.execScript(jsSection[2]);
} else {
// 给其他大部分浏览器用的
window.eval(jsSection[2]); alert(2);
}
}
}
}
}
- // 第一步:匹配加载的页面中是否含有js
- var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
- var jsContained = ajaxLoadedData.match(regDetectJs);
- // 第二步:如果包含js,则一段一段的取出js再加载执行
- if(jsContained) {
- // 分段取出js正则
- var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;
- // 按顺序分段执行js
- var jsNums = jsContained.length;
- for (var i=0; i<jsNums; i++) {
- var jsSection = jsContained[i].match(regGetJS);
- if(jsSection[2]) {
- if(window.execScript) {
- // 给IE的特殊待遇
- window.execScript(jsSection[2]);
- } else {
- // 给其他大部分浏览器用的
- window.eval(jsSection[2]);
- }
- }
- }
- }
解说下:window.execScript就IE认,其他浏览器需要用eval啦。
至此,算比较完美的解决。
[转自:http://www.impng.com/web-dev/execscript-loaded-by-ajax.html]
解决方案 (二)
执行ajax加载页面中的js总结
2010-12-01 16:40:15| 分类: JavaScript | 标签:ajax 执行 js |字号大中小 订阅
看了《执行ajax加载的页面中包含的javascript》一文,最近刚好被这个问题纠结过,献给痛不欲生的童鞋们…
事件背景
有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。
解决思路
1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。
2. 使用document.write输出代码,我等简洁主义者所不愿。
3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。
4. eval是个解决方法,虽然低效。
5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个<script>标签,把js内容插入即可执行。但使用中发现,firefox可行,但IE还是不从。(师太,您就从了吧~)
解决方案
综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:
// 第一步:匹配加载的页面中是否含有js
var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
var jsContained = ajaxLoadedData.match(regDetectJs);
// 第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {
// 分段取出js正则
var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;
// 按顺序分段执行js
var jsNums = jsContained.length;
for (var i=0; i<jsNums; i++) {
var jsSection = jsContained[i].match(regGetJS);
if(jsSection[2]) {
if(window.execScript) {
// 给IE的特殊待遇
window.execScript(jsSection[2]);
} else {
// 给其他大部分浏览器用的
window.eval_r(jsSection[2]);
}
}
}
}
解说下:window.execScript就IE认,其他浏览器需要用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_r(code) //执行脚本
if (!!(window.attachEvent && !window.opera)) {
//ie
execScript(code);
} else {
//not ie
window.eval_r(code);
}
} catch (e) {
}
}
}
网上查询了一些资料,感觉不怎么实用,有兼容浏览器的等问题。
最后还是将相关的htm代码抓取到当前页面,填充,相当于执行js脚本。
ajax 执行成功后返回j页面加载 joson 数据(加载select数据)
后台代码josn 数据传给前台
import net.sf.json.JSONObject;
CarDataCache.getInstance().refreshCarList();
Map<String,List> mapUtils = new HashMap<String,List>();
mapUtils.put("vmCarSeriesList",vmCarSeriesList);
JSONObject object = JSONObject.fromObject(mapUtils);
result = object.toString();
outPutMssage(result);
前台 代码
$.ajax({
async:false,
type: 'POST',
url:saveCarurl,
data: formData,
dataType: 'json',
success:function(data){
if(data!= null && data !=-1){
var optionhtml = '<option value="0"></option>';
var index =0;
var staffList = data.staffList;
for(index =0 ; index < staffList.length; index++){
optionhtml = optionhtml + '<option value='+staffList[index].staff_id+'>'+staffList[index].staff_name+" "+staffList[index].staff_surname+'</option>';
}
$("#staffId").empty();
$("#staffId").append(optionhtml);
var msgBox = $("#waringBox1"); //显示提示框
initAlertMarket(328,109,msgBox.html());
}
}
});
提示框
<div id="waringBox1"
https://www.jb51.cc/tag/dis/" target="_blank">display: none;background-color:transparent;">
<div
https://www.jb51.cc/tag/contextpath/" target="_blank">contextpath}/images/tips/tip6-save.png);width:328px;height: 109px;background-color:transparent;">
<div>
<input id="yellowwaringbtn" type="button" value=""
onclick="hideWarinDiv();"
https://www.jb51.cc/tag/contextpath/" target="_blank">contextpath}/images/tips/blue-esc.png);background-color:transparent;border: none;" />
</div>
</div>
</div>
提示框js
function initAlertMarket(width,height,content){ var msgw,msgh,bordercolor; msgw= width;//提示窗口的宽度 msgh= height;//提示窗口的高度 //titleheight=25 //提示窗口标题高度 var sWidth,sHeight; sWidth=document.body.offsetWidth; sHeight=screen.height; var bgObj=document.createElement("div"); bgObj.setAttribute('id','bgDiv'); bgObj.style.position="absolute"; bgObj.style.top="0"; bgObj.style.backgroundcolor="#transparent"; bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75"; bgObj.style.opacity="0.6"; bgObj.style.left="0"; bgObj.style.width=sWidth + "px"; bgObj.style.height=sHeight + "px"; bgObj.style.zIndex = "10000"; document.body.appendChild(bgObj); var msgObj=document.createElement("div") msgObj.setAttribute("id","msgDiv"); msgObj.setAttribute("align","center"); msgObj.style.backgroundcolor="transparent"; msgObj.style.border="1px solid " + bordercolor; msgObj.style.position = "absolute"; msgObj.style.left = "60%"; msgObj.style.top = "40%"; msgObj.style.font="12px/1.6em Verdana,Geneva,Arial,Helvetica,sans-serif"; msgObj.style.marginLeft = "-225px" ; msgObj.style.marginTop = -85+document.documentElement.scrollTop+"px"; msgObj.style.width = msgw + "px"; msgObj.style.height =msgh + "px"; msgObj.style.textAlign = "center"; msgObj.style.lineHeight ="7px"; msgObj.style.zIndex = "10001"; document.body.appendChild(msgObj); var txt=document.createElement("p"); txt.style.margin="1em 0" txt.setAttribute("id","msgTxt"); txt.innerHTML=content; document.getElementById("msgDiv").appendChild(txt); }
Ajax动态刷新元素js事件失效
工作中遇到一个情况,通过Ajax动态刷新某一区域后,原来绑定在这些dom元素上的js事件就失效了,定位了半天也不知道原因在那,后来查了资料发现动态刷新后的区域Dom元素是重新生成,所以页面之前的js不会动态绑定到新生成的元素上,这怎么解决呢,这里就用到了jQuery的事件委托机制来实现,示例代码如下:
jQuery1.7版本以前可以通过live事件委托方式:
$(selector).live("click",function(){ // 事件逻辑 });
1.7版本后jQuery废除了live事件,而是采用了统一的api方式,这样对程序开发人员来说是个好消息,不用记那么多api了,统一用on的方式调用:
$(document).on("click",selector,function(){ // 事件逻辑 })这里如果是用新版本推荐用on的方式,document尽量是要绑定事件的最小包含元素,比如父元素,这样性能会更好,selector则是要绑定元素的选择器。
Ajax局部更新导致JS事件重复触发问题的解决方法
如果在页面中包含一个ajax更新的列表,那么需要小心非动态更新部分的事件处理。
以带有公共工具栏的列表界面为例:
$.ajax( .... data: { ... }, success: function(data) { $('Menu1').click( function(){ //do something } ); } )
由于Menu1界面部分是公共的,并不会随着列表数据的更新而被重新载入,那么上面的代码将产生重复的click事件触发(在多次更新列表后)。
所以我们要注意,在ajax列表更新的结果处理中,不能包含工具栏事件侦听的重新初始化。
总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问JavaScript视频教程,AJAX视频教程!
我们今天的关于ajax 注册事件 页面加载执行js事件和ajax实现注册的分享已经告一段落,感谢您的关注,如果您想了解更多关于ajax 加载 页面 执行 js、ajax 执行成功后返回j页面加载 joson 数据(加载select数据)、Ajax动态刷新元素js事件失效、Ajax局部更新导致JS事件重复触发问题的解决方法的相关信息,请在本站查询。
本文标签: