写了个FireFox的用户脚本,在firefox下运行(也可存为html测试),主要是针对百度空间访问留言发消息等操作,遇到一些问题,向大家求教
只说主要的,关于this上下文的问题,红色字体标注的位置,此处this在执行中并不一直是HiBaiDuSpider 实例本身,还望请高手指教,对于用面向对象实现javascript应用,还属新手,希望大家多多指点,特别说明一下,此脚本并非恶意,并不能完全实现功能,百度对留言验证码和发消息都有一定限制,并不能完全实现,这里只是作为学习之用。对于此代码面向对象机制的实现不足,还请高手指点.完全脚本可访问:http://hi.baidu.com/freezesoul/blog/item/81eada3359a84c45ad4b5ff5.html// ==UserScript==
// @name           HiBaiDu
// @namespace      http://hi.baidu.com/freezesoul
// @description    HiBaiDuSpider
// @include        http://hi.baidu.com/
// ==/UserScript==
////用户空间////
var _userlink = "http://hi.baidu.com/freezesoul";
////发送文本////
var _sendtext = "abc";
////验证码字典/////
////由于百度对同一验证码出现的次数有限制,因此并不是特别牢靠////
var _imgcode = new Array();
var _imgvalue = new Array();
////验证码获得代码////
_imgcode[0] = "###";
////验证码值////
_imgvalue[0] = "###";
////用户性别1男2女3不限////
var _sex = "3";
////用户年龄起始值////
var _age_from = "";
////用户年龄结束值////
var _age_to = "";
////省份////
var _reside_province = "";
////市////
var _reside_city = "";
////兴趣////
var _word = "baidu";
HiBaiDuSpider = function() {
//获得页面数
HiBaiDuSpider.PageNum = 1;
//获得空间总数
HiBaiDuSpider.Num = 0;
//ajax行为参数
HiBaiDuSpider.StopAjax = false;
//模式窗口
此处略、、、、 HiBaiDuSpider.ModalAlertText = this.ModalAlert(this);    var _BDFPageHtml; var BDCommitSpider = new CommitSpider();
var BDSendMSpider = new SendMSpider();    this.OnSuccess = function() {
//获得页面HTML
_BDFPageHtml = this.GetResponseText();
//找百度空间用户
var findLinks = new RegExp('<td valign="top" class="f">([^\*]*?)</' + 'script>','gi'); if(findLinks.test(_BDFPageHtml))
{
var urls = _BDFPageHtml.match(findLinks);
//留言爬虫工厂

for (var i = 0; i < urls.length; i++) { //找用户空间Link
var findLink = new RegExp('<a href=\'([^\*]*?)\' target=\'_blank\'><img src=\'http://img.baidu.com/passport/hi.gif\' border=\'0\' align=\'absmiddle\'></a>"','gi');
var match1 = findLink.exec(urls[i]);
var link = match1[1]; var findname = new RegExp('http://hi.baidu.com/sys/checkuser/([^\*]*?)/0" target="_blank">','gi');
var match2 = findname.exec(urls[i]);
var username = match2[1];

//访问空间,留下脚印
this.GetData(link + "/profile"); //准备留言参数
var strparam = "ct=10";
strparam += "&cm=5";
strparam += ("&spRefURL=" + encodeURIComponent(link));
strparam += "&spBCmtFlag=2";
strparam += ("&spBCmtURL=" + encodeURIComponent(_userlink + "/profile"));
strparam += ("&spBCmtAuthor=" + encodeURIComponent(_userlink.replace("http://hi.baidu.com/","")));
strparam += ("&spBCmtText=" + encodeURIComponent(_sendtext));
strparam += ("&spVcode=" + _imgcode[i]);
strparam += ("&spVerifyKey=" + _imgvalue[i]);

//BDCommitSpider._strLen = strparam.length;
//创建Ajax爬虫留言
BDCommitSpider.GetData(link + "/commit" , strparam); //document.domain = "baidu.com"; //发送消息
BDSendMSpider.GetData("http://msg.baidu.com/?ct=22&cm=MailSend&tn=bmSubmit&sn="  + encodeURIComponent("freeze_soul") + "&co=" + encodeURIComponent(_sendtext));
//记录访问总数 HiBaiDuSpider.Num++;
//输出访问结果
HiBaiDuSpider.ModalAlertText.innerHTML += "<a href='" + link + "/profile' target='_blank' >" + link.replace("http://hi.baidu.com/","") + "</a><br/>";

}
//页面累加
HiBaiDuSpider.PageNum++;

//判断是否关闭Ajax行为
if(!HiBaiDuSpider.StopAjax)
{
//递归调用 this.GetData('http://hi.baidu.com/sys/uquerys/?type=3&sex' + _sex + '=1&age_from=' + _age_from + '&age_to='+ _age_to + '&reside_province' + encodeURIComponent(_reside_province) + '&reside_city' + encodeURIComponent(_reside_city) + '&word=' + encodeURIComponent(_word) + '&pn=' + HiBaiDuSpider.PageNum);
}
}
else
{
alert("You Have Visited " + HiBaiDuSpider.Num + " Spaces.");
}
    }
//创建一个Ajax
    this.GetData = function(Url) {
//初始化一个Ajax
        this.InitializeRequest('get', Url);
//提交
        this.Commit(null);
    }

}CommitSpider = function(){
this.GetData = function(Url,data) {
//初始化一个Ajax
this.InitializeRequest('post', Url ,true);
//提交
this.Commit(data);
}
}
SendMSpider = function(){
this.GetData = function(Url) {
//初始化一个Ajax
this.InitializeRequest('get', Url);
//提交
this.Commit(null);
}
}Ajax = function() {
    此处实现了一个几个本的ajax操作类,具体代码可查看http://hi.baidu.com/freezesoul/blog/item/81eada3359a84c45ad4b5ff5.html
}//继承
HiBaiDuSpider.prototype = new Ajax();
CommitSpider.prototype = new Ajax();
SendMSpider.prototype = new Ajax();BDSpider = new HiBaiDuSpider();
//出发
BDSpider.GetData('http://hi.baidu.com/sys/uquerys/?type=3&sex' + _sex + '=1&age_from=' + _age_from + '&age_to='+ _age_to + '&reside_province' + encodeURIComponent(_reside_province) + '&reside_city' + encodeURIComponent(_reside_city) + '&word=' + encodeURIComponent(_word));

解决方案 »

  1.   

    你是如何绑定this.OnSuccess 方法的??如果处理不好闭包,此时的this.OnSuccess中调用的this对象就不是HiBaiDuSpider的实例了你最好加一个闭包变量,使用闭包变量来调用方法,这样可以避免this使用不当时长生的错误这样试试HiBaiDuSpider = function() { 
    var PackUp=this;//======================================闭包变量
    //获得页面数 
    HiBaiDuSpider.PageNum = 1; 
    //获得空间总数 
    HiBaiDuSpider.Num = 0; 
    //ajax行为参数 
    HiBaiDuSpider.StopAjax = false; 
    //模式窗口 
    此处略、、、、 HiBaiDuSpider.ModalAlertText = this.ModalAlert(this);     var _BDFPageHtml; var BDCommitSpider = new CommitSpider(); 
    var BDSendMSpider = new SendMSpider();     this.OnSuccess = function() { 
    //获得页面HTML 
    _BDFPageHtml = PackUp.GetResponseText(); //==========使用闭包变量,而不是this对象
    /*其他的代码*/