GVKun编程网logo

ajax 注册事件 页面加载执行js事件(ajax实现注册)

9

这篇文章主要围绕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实现注册)


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

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]  view plain copy
 
  1. // 第一步:匹配加载的页面中是否含有js  
  2. var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;  
  3. var jsContained = ajaxLoadedData.match(regDetectJs);  
  4.   
  5. // 第二步:如果包含js,则一段一段的取出js再加载执行  
  6. if(jsContained) {  
  7.     // 分段取出js正则  
  8.     var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;  
  9.   
  10.     // 按顺序分段执行js  
  11.     var jsNums = jsContained.length;  
  12.     for (var i=0; i<jsNums; i++) {  
  13.         var jsSection = jsContained[i].match(regGetJS);  
  14.   
  15.         if(jsSection[2]) {  
  16.             if(window.execScript) {  
  17.                 // 给IE的特殊待遇  
  18.                 window.execScript(jsSection[2]);  
  19.             } else {  
  20.                 // 给其他大部分浏览器用的  
  21.                 window.eval(jsSection[2]);  
  22.             }  
  23.         }  
  24.     }  
  25. }  

解说下: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数据)

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动态刷新元素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局部更新导致JS事件重复触发问题的解决方法

如果在页面中包含一个ajax更新的列表,那么需要小心非动态更新部分的事件处理。

以带有公共工具栏的列表界面为例:

1.jpg

$.ajax( 
.... 
data: { ... 
}, 
success: function(data) { 
$(&#39;Menu1&#39;).click( 
function(){ 
//do something 
} 
); 
} 
)
登录后复制

由于Menu1界面部分是公共的,并不会随着列表数据的更新而被重新载入,那么上面的代码将产生重复的click事件触发(在多次更新列表后)。

所以我们要注意,在ajax列表更新的结果处理中,不能包含工具栏事件侦听的重新初始化。

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问JavaScript视频教程,AJAX视频教程!

我们今天的关于ajax 注册事件 页面加载执行js事件ajax实现注册的分享已经告一段落,感谢您的关注,如果您想了解更多关于ajax 加载 页面 执行 js、ajax 执行成功后返回j页面加载 joson 数据(加载select数据)、Ajax动态刷新元素js事件失效、Ajax局部更新导致JS事件重复触发问题的解决方法的相关信息,请在本站查询。

本文标签: