`
leo_faith
  • 浏览: 101392 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

答复: [疑惑]js动态加载中的事件触发

阅读更多
代码代表我的思想,就是不用去检查状态,靠xhr计数来得知是否完毕.
完毕了就执行代码.

核心方法:

void A9Loader.asyncImportClass(String clzz)
    async import an js and export like java
    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'

void A9Loader.runAfterImport(Function func)
    run the func when all class imported
    @param func (Function)

你可以修改修改,改成你适用的.
这段代码,经过严格测试,在a9text的异步动态载入中表现还不错.

/**
UTF8(BOM)  GPL  trydofor.com  Feb.2008
===========================================================

void A9Loader.tagLoadScript(String url)
    load the js/text by html tag(script)
    @param url (String) the url of script

void A9Loader.syncImportClass(String clzz)
    sync import an js and export like java
    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'

void A9Loader.asyncImportClass(String clzz)
    async import an js and export like java
    @param clzz (String) eg:'com.trydofor.a9text.parser.a9text'

void A9Loader.runAfterImport(Function func)
    run the func when all class imported
    @param func (Function)

void A9Loader.syncLoadText(String url)
    sync load a text
    @param url (String)

void A9Loader.asyncLoadText(Function func,String|Array urls)
    sync load a text or Array of text
    @param func (Function) function(String|Array urls,String|Array texts)
    @param url  (String or Array of String)

void A9Loader.setStdout(Function func)
    show the stdout info of a9loader
    @param func (Function) function(info)
void A9Loader.setStderr(Function func)
    show the stderr info of a9loader
    @param func (Function) function(info)
    
Object A9Loader.__$(String clzz)
    get class object by class name. eg
    A9Loader.__$('com.trydofor.a9text.parser.a9text')
    return com.trydofor.a9text.parser.a9text
    
String A9Loader.getCorePath()
    get the path of a9loader.js
String A9Loader.getPagePath()
    get the path of html page
String A9Loader.getPageName()
    get the name of html page
String A9Loader.getPageInfo()
    get the querystring of html page
Object A9Loader.getPageArgs()
    get the querystring's key-value pairs of html page
*/

var __A9Loader__ = function()
{
    var __selfConf__ = {name:"a9loader.js",extn:'.js',info:"__info__.js"};
    var __pageInfo__ = {core:"",path:"",name:"",info:"",args:{}};
    var __stdHandler__ = {stdout:null,stderr:null};
    var __asyncTextTask__ = {num:0,map:{}};
    var __asyncClzzTask__ = {rcnt:0,clzz:[],func:[]};
    var __clzzInfoPools__ = {}; //{clzz,pubs,deps,text,impl}

    __init__(); // init
    
    //
    function __tagLoadScript__(url)
    {
        __checkType__(url,"string","url@__tagImportScript__");
        try
        {
            var element=document.createElement('SCRIPT'); 
            element.setAttribute('src', url); 
            var parrent = document.getElementsByTagName("head").item(0)||document.body;
            parrent.appendChild(element);
        }catch(e){
            document.write("<script type='text/javascript' src='"+url+"'></script>");
            document.close();
        }
    }
    
    function __syncImportClass__(clzz)
    {
        __checkType__(clzz,"string","clzz@__syncImportClass__");
        new __clzzTask__(clzz,false);
    }
    
    function __asyncImportClass__(clzz)
    {
        __checkType__(clzz,"string","clzz@__asyncImportClass__");
        //new __clzzTask__(clzz,true);
        new __clzzTask__(clzz,self.location.protocol.indexOf('file')<0);
    }
    
    function __runAfterImport__(func)
    {
        __checkType__(func,"Function","func@__runAfterImport__");
        __stdout__("__runAfterImport__:"+func);
        __asyncClzzTask__.func.push(func);
        __clzzTaskCallback__();
    }
    
    function __syncLoadText__(url)
    {
        __checkType__(url,"string","url@__syncLoadText__");
        var xhr = __newXHRequest__();
        var resText = null;
        try{
            xhr.open("GET",url,false);
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
            xhr.send(null);
            resText = xhr.responseText;
        }finally{
            xhr.abort();
            delete xhr;
        }
        return resText;
    }

    /**
     * async load text by one or more url,
     * when all text is loaded,the func will be called back.
     * @param func <Function> function(<String|Array>urls,<String|Array>text)
     * @param urls <String|Array> 
     */
    function __asyncLoadText__(func,urls)
    {
        __checkType__(func,"Function","func@__asyncLoadText__");
        __checkType__(urls,"string","urls@__asyncLoadText__");
        
        __asyncTextTask__.num++;
        var task = {};
        task.id = __asyncTextTask__.num;
        task.func = func;
        task.urls = urls
        task.xhrs = [];
        
        if(typeof(urls) == 'string'){
            task.xhrs[0] = new __textTask__(urls,task.id);
        }else{
            for(var i=0;i<urls.length;i++){
                task.xhrs[i] = new __textTask__(urls[i],task.id);
            }
        }
        __asyncTextTask__.map[task.id] = task;
    }
    
    /////////////////// helper functions  ///////////////////
    
    function __clzzTask__(clzz,async)
    {
    	//(step,init:0,info:1,text:2,impl:3)
    	if(typeof(__clzzInfoPools__[clzz]) != 'undefined' 
    	   && __clzzInfoPools__[clzz]['text'] != null) return;
    	
    	if(async == null||async != false) async = true;
    	else async = false;
    	
    	__asyncClzzTask__.rcnt++;
    	__asyncClzzTask__.clzz.push(clzz);
    	
        __stdout__("__clzzTask__:"+clzz+","+async);
        
    	if(typeof(__clzzInfoPools__[clzz]) == 'undefined'){
	    	__clzzInfoPools__[clzz] = {'clzz':clzz,'pubs':null,'deps':null,'text':'','impl':null};
    	}
    	
    	//document.body.innerHTML +="<br>"+clzz;
    	var clzzUri = __pageInfo__.core+clzz.replace(/\./g,'/')+__selfConf__.extn;
    	var infoUri = clzzUri.substring(0,clzzUri.lastIndexOf('/')+1)+__selfConf__.info;
    	
        // get info (async|sync)
        if(__clzzInfoPools__[clzz]['pubs'] == null){
    		__asyncClzzTask__.rcnt++;
            var xhrInfo = __newXHRequest__();
            if(async){
                xhrInfo.onreadystatechange = function(){
                    if(xhrInfo.readyState == 4){
                        var infoText = null;
                        if (xhrInfo.status == 0 || xhrInfo.status == 200 || xhrInfo.status == 304 ){
                            infoText=xhrInfo.responseText;
                        }else{
                            // do something
                        }
                        xhrInfo.abort();
                        delete xhrInfo;
                        //
                        if(infoText != null)eval(infoText);
                        __asyncClzzTask__.rcnt--;
                        __clzzTaskCallback__();
                    }
                }
            }
            
            xhrInfo.open('GET',infoUri,async);
            xhrInfo.setRequestHeader('If-Modified-Since','0');
            xhrInfo.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
            xhrInfo.send(null);
            
            if(!async){
                var infoText=xhrInfo.responseText;
                xhrInfo.abort();
                delete xhrInfo;
                if(infoText != null)eval(infoText);
                __asyncClzzTask__.rcnt--;
                __clzzTaskCallback__();
            }
        }
    	
        // get text (async|sync)
        var xhrClzz = __newXHRequest__();
        if(async){
	        xhrClzz.onreadystatechange = function(){
	            if(xhrClzz.readyState == 4){
	                if (xhrClzz.status == 0 || xhrClzz.status == 200 || xhrClzz.status == 304 ){
	                	__clzzInfoPools__[clzz]['text']=xhrClzz.responseText;
	                }else{
	                    // do something
	                }
	                xhrClzz.abort();
	                delete xhrClzz;
	                __asyncClzzTask__.rcnt--;
	                __clzzTaskCallback__();
	            }
	        }
        }
        
        xhrClzz.open('GET',clzzUri,async);
        xhrClzz.setRequestHeader('If-Modified-Since','0');
        xhrClzz.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
        xhrClzz.send(null);
        
        if(!async){
        	__clzzInfoPools__[clzz]['text']=xhrClzz.responseText;
			xhrClzz.abort();
            delete xhrClzz;
            __asyncClzzTask__.rcnt--;
        	__clzzTaskCallback__();
        }
        
        // inner function
    	function __info__(scriptName,publicMemeber,dependencs){
    		var clzzBall = clzz.substring(0,clzz.lastIndexOf('.')+1);
    		var clzzName = clzzBall + scriptName.substring(0,scriptName.lastIndexOf(__selfConf__.extn));
            
    		if(typeof(__clzzInfoPools__[clzzName]) == 'undefined'){
	    		__clzzInfoPools__[clzzName] = {'clzz':clzzName,'pubs':publicMemeber,'deps':dependencs,'text':null,'impl':null};
    		}else{
    			__clzzInfoPools__[clzzName]['pubs']=publicMemeber;
    			__clzzInfoPools__[clzzName]['deps']=dependencs;
    		}
    		
    		__stdout__("__info__:"+clzzName);
    		
    		if(dependencs!= null){
    			for(var i=0;i<dependencs.length;i++){
    				if(dependencs[i].indexOf('.')<0) dependencs[i] = clzzBall+dependencs[i];
    				new __clzzTask__(dependencs[i],async);
    			}
    		}
    	}
    }
    
    function __clzzTaskCallback__()
    {
    	__stdout__("__clzzTaskCallback__:"+__asyncClzzTask__.rcnt);
    	
    	if(__asyncClzzTask__.rcnt > 0) return;
    	
    	__asyncClzzTask__.rcnt ++;
		do{
	    	var ci = __asyncClzzTask__.clzz.length;
	    	var fi = __asyncClzzTask__.func.length;
	    	for(var i=0;i<ci;i++){
	    		__initAndExportClzz__(__asyncClzzTask__.clzz.shift());
	    	}
	    	for(var i=0;i<fi;i++){
	    		try{
	    		    var func = __asyncClzzTask__.func.shift();
	    		    __stdout__("__asyncClzzTask__.func:"+i+"\n"+func);
	    			func();
	    		}catch(e){ __stderr__("__clzzTaskCallback__:"+e)};
	    	}
		}while(__asyncClzzTask__.rcnt<=1 && (ci>0 ||fi>0))
		
		__asyncClzzTask__.rcnt --;
    }
    
    function __initAndExportClzz__(clzz)
    {
    	if(typeof(__clzzInfoPools__[clzz]) == 'undefined' 
    	   || __clzzInfoPools__[clzz]['impl'] != null
    	   || __clzzInfoPools__[clzz]['text'] == null
    	   ) return;
    	
    	// deps check
    	var cip = __clzzInfoPools__[clzz];
    	cip['impl'] = 'ready'; // avoid looping deps
    	//__stdout__("check@__initAndExportClzz__:"+clzz);
		for(var i=0;cip['deps']!=null && i<cip['deps'].length;i++){
            __stdout__("deps@__initAndExportClzz__:"+clzz+"->"+cip['deps'][i]);
			__initAndExportClzz__(cip['deps'][i]);
		}
		__stdout__("init@__initAndExportClzz__:"+clzz);
    	// init clzz
    	var clzzScript = ["__clzzInfoPools__[clzz].impl = function(){\n"];
    	if(cip['pubs']!=null)
	        for(var i=0;i<cip['pubs'].length;i++)
	    		clzzScript.push("var " + cip['pubs'][i] + ";\n");
    	clzzScript.push(cip['text']);
        clzzScript.push("\nreturn { __$:function(s){return eval(s)}\n");
    	if(cip['pubs']!=null)
	        for(var i=0;i<cip['pubs'].length;i++)
            	clzzScript.push(","+cip['pubs'][i]+":"+cip['pubs'][i]+"\n");
        clzzScript.push("};\n");
        clzzScript.push("}();\n");
        
        try{
            eval(clzzScript.join(''));
        }catch(e){
            throw "bad clzz :"+clzz+" :\n"+e;
        }
        delete clzzScript;
        
        // export ball
        var ballScript = [];
        var ballPart = clzz.split('.');
        if(ballPart.length>1){
        	ballScript.push("if(typeof("+ballPart[0]+")=='undefined')"+ballPart[0]+"={};\n");
	        var ballCell = ballPart[0];
	        for(var i=1;i<ballPart.length-1;i++){
	            ballCell += "['"+ballPart[i]+"']";
	            ballScript.push("if(typeof("+ballCell+")=='undefined') "+ballCell+"={};\n");
	        }
        }
        
        ballScript.push("if(typeof("+clzz+")!= 'undefined'){ throw '"+clzz+" exists';}\n");
        ballScript.push("else{"+clzz+"=__clzzInfoPools__[clzz].impl;}\n");
        try{
            eval(ballScript.join(''));
        }catch(e){
        	throw "bad ball :"+clzz+" :\n"+e;
        }
        delete ballScript;
        
        // alias pubs
        var aliasScript = [];
        if(cip['pubs']!=null)
	        for(var i=0;i<cip['pubs'].length;i++){
	    		aliasScript.push("if(typeof("+cip['pubs'][i]+")!='undefined'){__stderr__('conflict:"+cip['pubs'][i]+"@"+clzz+"');}\n");
	    		aliasScript.push("else{"+cip['pubs'][i]+"=__clzzInfoPools__[clzz].impl['"+cip['pubs'][i]+"']}\n");
	        }
        eval(aliasScript.join(''));
		delete aliasScript;
    }
    /**
     * do xmlhttprequest as a thread of task group
     * @param url
     * @param taskid task group id
     */
    function __textTask__(url,taskid)
    {
        var text = null;
        var done = false;
        
        var xhr = __newXHRequest__();
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4){
                if (xhr.status == 0 || xhr.status == 200 || xhr.status == 304 ){
                    text = xhr.responseText;
                    done = true;
                    __textTaskCallback__(taskid);
                }else{
                    // do something
                }
                xhr.abort();
                delete xhr;
            }
        }
        xhr.open('GET',url,true);
        xhr.setRequestHeader('If-Modified-Since','0');
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
        xhr.send(null);
        //
        this.isDone = function(){return done;}
        this.getUrl = function(){return url;}
        this.getText = function(){return text;}
    }
    
    function __textTaskCallback__(taskid)
    {
        if(typeof(__asyncTextTask__.map[taskid]) == 'undefined') return;
        
        var xhrs = __asyncTextTask__.map[taskid].xhrs;
        var isAllDone = true;
        for(var i=0;i<xhrs.length;i++){
            if(!xhrs[i].isDone()){
                isAllDone = false;
                break;
            }
        }
        //alert(taskid+"::"+xhrs.length+":"+isAllDone)
        if(isAllDone){
            var task = __asyncTextTask__.map[taskid];
            if(typeof(task.urls) == 'string'){
                task.func(task.xhrs[0].getUrl(),task.xhrs[0].getText());
            }else{
                var urls  = [];
                var texts = [];
                for(var i=0;i<xhrs.length;i++){
                    urls[i]  = xhrs[i].getUrl();
                    texts[i] = xhrs[i].getText();
                }
                task.func(urls,texts);
            }
            
            delete __asyncTextTask__.map[taskid];
        }
    }    
    
    function __newXHRequest__()
    {
        if(window.XMLHttpRequest) // Gecko
        {
            return new XMLHttpRequest() ;
        }
        else if(window.ActiveXObject) // IE
        {
            var activeXo = ['MSXML2.XMLHTTP','Microsoft.XMLHTTP'] ;
            for(var i=0;i<activeXo.length;i++)
                try {return new ActiveXObject(activeXo[i]);}catch (e){};
        }
        else
        {
            throw "can not create XMLHttpRequest on your browser";
        }
    }
    
    function __checkType__(para,type,info)
    {
        var mess = "para:"+para+" should be "+type+" ::"+info;
        if(para == null) throw mess;
        if(para instanceof Array && type != "Array"){
            for(var i=0; i<para.length; i++) {
            	if(typeof(para[i]) == type) continue;
            	try{
            	   if(eval("para[i] instanceof "+type)) continue;
            	}catch(e){};
                throw mess;
            }
            return;
        }else{
            if(typeof(para) == type || eval("para instanceof "+type)) return;
        }
        throw mess;
    }
    
    function __stderr__(info){
        if(__stdHandler__.stderr != null){
            try{__stdHandler__.stderr(info);}catch(e){alert(e)};
        }
    }
    function __stdout__(info){
        if(__stdHandler__.stdout != null){
            try{__stdHandler__.stdout(info);}catch(e){alert(e)};
        }
    }
    
    function __init__()
    {
        // CORE
        var scriptTags = document.getElementsByTagName("SCRIPT");
        for(var i=0;i<scriptTags.length;i++)
        {
            var src = scriptTags[i].src;
            var pos = src.lastIndexOf(__selfConf__['name']);
            if( pos == (src.length - __selfConf__['name'].length))
            {
                __pageInfo__['core'] = src.substring(0,pos);
                break;
            }
        }
        // PAGE
        var theURL = self.location.href;
        var questPos = theURL.indexOf('?');
        var pureUrl = questPos<0?theURL:theURL.substring(0,questPos);
        var slashPos = pureUrl.lastIndexOf('/') + 1;
        
        __pageInfo__['path'] = theURL.substring(0,slashPos);
        __pageInfo__['name'] = questPos>slashPos ? theURL.substring(slashPos,questPos):theURL.substr(slashPos);
        // URL_ARGS
        if(questPos > slashPos)
        {
            var queryString = theURL.substr(questPos+1);
            var equalPos = 0;
            var keyValArray = queryString.split("&");
            for( var i = 0 ; i < keyValArray.length; i++)
            {
                equalPos = keyValArray[i].indexOf("=");
                if(equalPos > 0)
                    __pageInfo__['args'][keyValArray[i].substring(0,equalPos)] = keyValArray[i].substr(equalPos+1);
                else
                    __pageInfo__['args'][keyValArray[i]] = "";
            }
            __pageInfo__['info'] = queryString;
        }
    }
    
    // export public members
    this.tagLoadScript    = __tagLoadScript__;
    this.syncImportClass  = __syncImportClass__;
    this.asyncImportClass = __asyncImportClass__;
    this.runAfterImport   = __runAfterImport__;
    this.syncLoadText     = __syncLoadText__;
    this.asyncLoadText    = __asyncLoadText__;
    
    this.setStdout       = function(f){if(f instanceof Function)__stdHandler__.stdout = f;};
    this.setStderr       = function(f){if(f instanceof Function)__stdHandler__.stderr = f;};
        
    this.__$              = function(s){return __clzzInfoPools__[s].impl;}
    this.getCorePath      = function(){ return __pageInfo__['core']; };
    this.getPagePath      = function(){ return __pageInfo__['path']; };
    this.getPageName      = function(){ return __pageInfo__['name']; };
    this.getPageInfo      = function(){ return __pageInfo__['info']; };
    this.getPageArgs      = function(){ var t={};for(var k in __pageInfo__['args'])t[k]=__pageInfo__['args'][k]; return t;};
}

// init instance
if(typeof(A9Loader) == 'undefined' || !(A9Loader instanceof __A9Loader__))
{
    A9Loader = new __A9Loader__();
    
    /*
    var _console_ = null;
    var stdout = function(info){
        if(_console_ == null){
            _console_= window.open("","A9LoaderConsole","width=680,height=600,resizable,scrollbars=yes");
            _console_.document.write("<meta content='text/html; charset=utf-8' http-equiv='content-type'><body style='font-size:12px'></body>");
        }
    	_console_.document.write("<pre>"+info+"</pre>");
    }
    var stderr = function(info){
        stdout("[ERR]"+info);
    }
    
	A9Loader.setStdout(stdout);
	A9Loader.setStderr(stderr);
	*/
}

分享到:
评论

相关推荐

    js触发事件大全

    本文将详细讲解JavaScript中的各种触发事件。 1. 鼠标事件: - onclick:当鼠标单击元素时触发。 - ondblclick:鼠标双击元素时触发。 - onmousedown:鼠标按钮被按下时触发。 - onmouseup:鼠标按钮被释放时...

    自动化控制、事件触发机制研究

    自动化控制、事件触发机制研究,动态事件触发,静态事件触发,自适应事件触发,相对静态事件触发。事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理...

    动态加载外部JS文件

    动态加载外部JS文件是网页开发中的一个重要技术,它允许网页在需要时按需加载JavaScript资源,从而提高页面的加载速度,优化用户体验,并有效地管理复杂的项目结构。以下将详细阐述动态加载的原理、方法以及相关实践...

    vue动态加载js.zip

    在Vue.js应用开发中,有时候我们可能需要动态加载JavaScript资源,比如某些库或者插件只在特定场景下使用,为了优化性能,不希望一开始就加载。Vue动态加载JS是一种实现这一需求的技术,它允许我们在运行时根据需要...

    js事件触发大全

    ### JS事件触发大全 在JavaScript编程中,事件处理是与用户交互的重要手段之一。通过监听特定的事件,我们可以实现各种动态效果和响应式操作。本文将详细介绍一系列常见的JS事件及其触发场景,帮助开发者更好地理解...

    bootstrap-treeview树节点实现动态加载(懒加载)

    在官方版本中,虽然提供了丰富的功能,但并未直接支持动态加载或懒加载。动态加载(也称为懒加载)是一种优化性能的技术,只在用户需要时才加载数据,而不是一次性加载所有数据,这对于处理大量数据或层级结构尤其...

    vue动态加载外部依赖js代码实现

    同时,它还监听`onload`事件,以便在JS文件加载完成后触发相应的回调函数。 5. **使用示例** - **导入组件**: 首先,我们需要在项目中导入`myScript.vue`组件。 ```javascript import myScript from '@/modules/...

    javascript函数动态加载javascript文件

    在实际项目中,为了提高页面加载速度和优化用户体验,我们常常需要按需加载JavaScript文件,而不是一次性加载所有资源。这正是"javascript函数动态加载javascript文件"这一主题的核心所在。 动态加载JavaScript文件...

    javascript页面加载完执行事件代码

    3. 如果页面中有多个JavaScript文件,可以考虑将window.onload事件中的代码提取到一个单独的JavaScript文件中,并确保该文件在所有其他脚本加载之后执行。 4. 对于需要频繁交互的复杂页面,合理组织代码,避免使用...

    动态加载树(tree)和动态加载表格(table)

    在JSP中,可能使用了JavaScript库(如jQuery、AngularJS或React)和AJAX来实现表格的动态加载功能,以及与后台服务器进行交互。 总结来说,动态加载树和动态加载表格都是为了提高数据展示的效率和用户体验。通过...

    js页面动态加载弹出窗口

    在JavaScript(JS)编程中,页面动态加载和弹出窗口是常见的交互设计技术,它们能够提升用户体验并实现灵活的信息展示。下面将详细讲解这两个概念及其结合应用。 **1. JS动态加载** 动态加载,顾名思义,是在网页...

    页面加载中js 页面加载中js 页面加载中js

    页面加载过程中,JavaScript(js)的执行对用户感知的页面加载速度有着直接影响。在这个主题下,我们将深入探讨JavaScript如何影响页面加载,以及如何利用它来改善用户在页面加载过程中的体验。 1. **JavaScript与...

    JS EasyUI DataGrid动态加载数据

    动态加载数据通常指的是懒加载(Lazy Loading)机制,即只在用户滚动到数据视图的底部或者触发特定事件时,才向服务器请求更多的数据。这种方式避免了一次性加载大量数据导致的页面响应慢和内存消耗大等问题。 实现...

    javascript触发模拟鼠标点击事件

    在Web开发中,事件处理是实现动态交互的重要手段。有时我们需要在JavaScript中模拟用户的行为,比如模拟鼠标点击事件。这样可以无需用户直接交互即可触发事件处理函数。本文详细介绍了如何使用JavaScript来触发模拟...

    listbox动态加载item

    首先,我们要明确动态加载的基本思路:根据用户操作或特定事件,如滚动、搜索或分页,向服务器发送请求,获取部分数据并将其添加到ListBox中。这种技术通常与Ajax(异步JavaScript和XML)相结合,利用JavaScript进行...

    jsTree 很好用的动态加载数

    动态加载是 jsTree 的核心特性之一,它允许在用户滚动或展开树节点时按需加载数据,而不是一次性加载所有数据。这种机制对于处理大量数据特别有用,因为它减少了初始页面加载时间,提高了用户体验。通过设置适当的...

    鼠标触发的事件,JS脚本

    鼠标触发的事件,JS脚本 鼠标事件是指在 Web 浏览器中,用户通过鼠标交互引发的事件。这些事件可以被 JavaScript 捕获和处理,以实现各种交互效果。下面是常见的鼠标事件: 1. onClick:鼠标点击事件,多用在某个...

    javascript:onmouse事件大全

    "javascript:onmouse事件大全" javascript语言中提供了多种onmouse事件,可以根据实际情况选择合适的事件来实现网页特效。下面是javascript中常用的onmouse事件大全: 一般事件 * onClick:鼠标点击事件,多用在...

    JS中包涵的事件分类

    JavaScript(简称JS)作为前端开发的核心技术之一,广泛应用于网页交互设计与动态效果实现。为了更好地理解和应用JS事件,本文将详细介绍JS中的各种事件及其应用场景。 #### 1. 鼠标事件 (Mouse Events) 鼠标事件...

Global site tag (gtag.js) - Google Analytics