2

我正在使用具有类似功能但允许跨站点脚本等功能GM_xmlhttpRequest的油脂猴子脚本。xmlhttpRequest

我正在向各个页面发出一堆并行 http-requsts,然后使用 onload 从这些页面中读取一些数据。根据结果​​,我创建了新的 http-requst。这是一个示例,代码可能不起作用,更多的是为了说明我正在使用的东西。

function calleniro(nicerows, attempt){
    if( attempt === 1){
        var who = nicerows.contact.firstname+' '+nicerows.contact.lastname;
        var where = ''
    }else if(attempt === 2){
        var who = nicerows.contact.firstname+' '+nicerows.contact.lastname;
        var where = nicerows.contact.postal;
    }else if(attempt === 3){
        var who = nicerows.contact.firstname+' '+nicerows.contact.lastname;
        var where = nicerows.contact.adress;
    }

    var url = 'http://personer.eniro.se/resultat/'+who+'/'+where;
    GM_xmlhttpRequest({
    method: "GET",
    url: url,
    onload: function(data) {
        data = $.parseHTML(data.response);
        var phone = $(data).find('.tel.row a').map(function(){
            return $(this).text();
        }).get();
        //one company, save the data
        if(vCard.length = 1){
            //adding the company if we find a phonenumber or more.
            if (phone.length > 0){ 
                nicerows.contact.phone = phone;
            }
        more than one company.
        }else if(vCard > 1){
            attempt++;
            calleniro(nicerows, attempt)
        }


    }
})
}

这非常快速地变成了一个带有分支加载功能的布布什卡娃娃九头蛇。很难追踪正在发生的事情。我想将这些功能更多地分离成这样的东西,例如:

var contact = callenrio(foo,bar)
//the next thing should happen after onload only.
if(contact.tel){ 
save(contact);
}
else{
callenrio(foobar,barfoo)
}
4

1 回答 1

1

我相信您正在寻找的内容或多或少包含在面向对象的 Javascript的基础知识中。以最基本的形式,您可以执行以下操作:

function calleniro(foo,bar)
{
    this.tel = foo+"-"+bar;
}
contact = new calleniro("555","7777");
if (contact.tel)
...

但是由于您正在执行 ajax 查询,因此会遇到一些范围界定问题,因为this当您在内部时具有不同的含义GM_xmlhttpRequest。但是你可以用闭包来解决这个问题。下面是一个 $.ajax 示例,它this作为 传递给 $.ajax 函数obj,因此this.tel我们使用obj.tel并避免了范围问题,而不是 using 。

(function(obj) {
    $.ajax({
        async: false,
        url: url,
        method: "GET",
        success: function(data) {
            obj.tel = data;
        }
    });
})(this);

让我知道这是否有意义或者您有任何问题:)

于 2013-08-06T00:17:40.843 回答