none
JavaScript的问题:封装在类里面的Ajax,如何设置onreadystatechange事件的处理函数? RRS feed

  • 问题


  • function mysearch() { var http = null; } mysearch.prototype= { search:function() { var sUrl = "....."; if( this.http == null ) this.http = new ActiveXObject("Microsoft.XMLHTTP"); else if( this.http.readyState != 4 ) return false; this.http.onreadystatechange = this.handleResult; this.http.open( "get", sUrl, true ); this.http.setRequestHeader( "CACHE-CONTROL", "nocache" ); this.http.send(); }, handleResult:function() { //do something } }
    上面是我写的一段代码,运行到:
      this.http.onreadystatechange = this.handleResult;

    就会报错,说“类型不匹配”,请问这是为什么?


    如果我写成这样:
      this.http.onreadystatechange = function(){.....}
    就可以,但是里面的代码太多了,这样写不好看。
    da jia hao!
    2010年3月13日 12:42

答案

  • 你采用下面这种方式试试,下面是采用microsoft ajax的一个例子。

    Type.registerNamespace("Demo");
    
    Demo.Person = function(firstName, lastName, emailAddress) {
        this._firstName = firstName;
        this._lastName = lastName;
        this._emailAddress = emailAddress;
    }
    
    Demo.Person.prototype = {
    
        getFirstName: function() {
            return this._firstName;
        },
    
        getLastName: function() {
            return this._lastName;
        },
    
        getName: function() {
            return this._firstName + ' ' + this._lastName;
        },
    
        dispose: function() {
            alert('bye ' + this.getName());
        }
    }
    Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);
    
    // Notify ScriptManager that this is the end of the script.
    if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
    详细情况可以查看下面的网页。
    http://www.asp.net/AJAX/Documentation/Live/tutorials/CreatingCustomClientScripts.aspx

    Microsoft Online Community Support
    2010年3月18日 4:11

全部回复

  • handleResult:function()
    	{
    	//do something
    	}

    search:function()
    	{
    		var sUrl = ".....";
    		if( this.http == null )
    			this.http = new ActiveXObject("Microsoft.XMLHTTP");
    		else if( this.http.readyState != 4 )
    			return false;
    		this.http.onreadystatechange = this.handleResult;
    		this.http.open( "get", sUrl, true );
    		this.http.setRequestHeader( "CACHE-CONTROL", "nocache" );
    		this.http.send();
    	},

    这样试试看。
    
    	
    2010年3月13日 13:13
  • 谢谢,不过不行....
    da jia hao!
    2010年3月13日 16:42
  • 你好,

    上面代码在我本地测试没出现你说的这个问题。

    你的测试浏览器是IE还是Firefox,“Microsoft.XMLHTTP”应该是IE的。
    Microsoft Online Community Support
    2010年3月15日 5:55
  • 不好意思我没有说清楚,这段代码是放在HTC里面用的,运行就会报错。通过调试我发现在:

    this.http.onreadystatechange = this.handleResult

    这里的时候,“this”居然是HTCDocument,而不是mysearch对象本身,而“this.handleResult"的类型就是“undefined”,不知道为何。


    还有一个问题,就是如果直接放在htm页面里面,虽然:
    this.http.onreadystatechange = this.handleResult

    这里不会出错,但是当运行到handleResult里面的时候,如果这里面要访问类里面的成员,同样会出错,因为此时的“this”是“HTMLWindow2”而不是“mysearch”对象本身。


    da jia hao!
    2010年3月16日 2:59
  • ding,thanks。
    da jia hao!
    2010年3月18日 3:15
  • 你采用下面这种方式试试,下面是采用microsoft ajax的一个例子。

    Type.registerNamespace("Demo");
    
    Demo.Person = function(firstName, lastName, emailAddress) {
        this._firstName = firstName;
        this._lastName = lastName;
        this._emailAddress = emailAddress;
    }
    
    Demo.Person.prototype = {
    
        getFirstName: function() {
            return this._firstName;
        },
    
        getLastName: function() {
            return this._lastName;
        },
    
        getName: function() {
            return this._firstName + ' ' + this._lastName;
        },
    
        dispose: function() {
            alert('bye ' + this.getName());
        }
    }
    Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);
    
    // Notify ScriptManager that this is the end of the script.
    if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
    详细情况可以查看下面的网页。
    http://www.asp.net/AJAX/Documentation/Live/tutorials/CreatingCustomClientScripts.aspx

    Microsoft Online Community Support
    2010年3月18日 4:11
  • 谢谢,我先研究下。能告诉我:
    Type.registerNamespace("Demo");

    这个东西是JS的吗?我没见过js有“registerNamespace”方法的吧?

    我说的js是在网页上运行的那些脚本,不是.net的程序代码啊。
    da jia hao!
    2010年3月18日 16:57
  • 这是微软ajax框架内定义的。

    页面上放入一个scriptmanager就可以了。

    你看看我给你的那个连接的文档。


    Microsoft Online Community Support
    2010年3月19日 0:55
  • 我看了下,发现好像是服务器端的程序吧。我的程序是要在客户端用的。


    da jia hao!
    2010年3月19日 2:47
  • 既然是ajax,当然是客户端使用的。

    其实它也只是对一些javascript进行了封装,本质上还是javascript。


    Microsoft Online Community Support
    2010年3月19日 2:53