한 번 기록 하고 SetInternal 과 SetTimeout 다시 배우 기

배경:Chrome 의 TamperMoney 스 크 립 트 를 만 들 고 슈퍼 스타 모 과 를 수집 하 는 모든 학교:http://passport2.chaoxing.com/login?fid=145&refer=http://i.mooc.chaoxing.com。이것 은 2 급 으로 연 결 된 것 입 니 다.왼쪽 은 도시 이 고 오른쪽 은 26 개의 자모 입 니 다.오른쪽 아래 는 수집 할 학교 목록 입 니 다.모든 데 이 터 를 한꺼번에 수집 하려 면 도시 와 자 모 를 계속 클릭 하여 전환 해 야 합 니 다.데 이 터 는 ajax 비동기 로 불 러 온 후에 페이지 에 렌 더 링 됩 니 다.전체적으로 학교의 이름과 ID 를 전단 에서 캡 처 하고$.ajax 로 자신 이 쓴 ashx 방법 에 전송 하여 데이터베이스 에 저장 하 기 를 바 랍 니 다.갱 1:먼저 발생 하 는 문 제 는 바로 이렇게 수집 한 데 이 터 는 도 메 인 문제 로 인해$.ajax 에서 localhost:1066/r.ashx?method=a 에서 해결 방식 은 JSONP 를 사용 하 는 것 입 니 다.
 $.ajax({
        url: "http://localhost:1066/handle/r.ashx?method=updateChaoXingSchool",
        type: "get",
        dataType:"jsonp", //  jsonp
        jsonp:"jsonpCallback",
        jsonpCallback:"success_jsonpCallback", 
        data: {schoolId:id,name:name,letter:lt},
        success:function(result){
            csl++;
        },
        error:function(data){
        }
    });

 
백 엔 드 context.response.write 도 jsonpCallback 에서 만 든 방법 명 과 일치 해 야 합 니 다.그 내용 은 중요 하지 않 습 니 다.context.Response.Write("success"jsonpCallback({\"result\":true})");사고방식 1:$.each 플러그 인 순환 을 사용 하여 하지만$.each 는 비동기 이 고 JSONP 도 비동기 이 며 동기 화로 강제로 설정 할 수 없습니다.동기 화 할 수 있어 도 웹 페이지 를 막 아서 클릭 이벤트 가 효력 을 상실 합 니 다.이렇게 하면 도시 와 알파벳 을 바 꿀 수 없습니다.사고 2:for 순환+sitetimeout 을 사용 합 니 다.for 순환 은 동기 화 방법 이기 때문에 settimeout 은$.ajax 의 운행 간격 을 제어 할 수 있 습 니 다.사용 해 봐 야 setTimeout 이 비동기 적 인 방법 이라는 것 을 깊이 이해 할 수 있 습 니 다.여러 가지 방식 으로 setTimeout(예 를 들 어 i*1000)을 설정 하 는 것 도 효과 가 매우 좋 지 않 습 니 다.순서 와 내용 을 수집 하 더 라 도 브 라 우 저 카드 가 무 너 질 수 있 습 니 다.사고 3:앞의 시 도 는 저 로 하여 금 순환 을 사용 하여 실현 하 는 것 을 완전히 포기 하 게 했 습 니 다.타이머 SetInternal 을 사용 하여 실현 하 는 것 을 바 꾸 었 습 니 다.전체 웹 페이지 의 상황 을 정기 적 으로 감시 하고 채집 을 어떻게 수행 하 는 지 판단 합 니 다.원리:    1.시작 단 추 를 누 르 면 도시 대상 집합,현재 학교 대상 집합 가 져 오기;시작 도시,알파벳,학교의 Inex 값 과 같은 초기 값 을 설정 합 니 다.    2.타이머 A 설정,0.1 초 마다 현재 페이지 를 수집 하 는 학교,현재 학교 Index 자체 증가      3.if(현재 학교 인덱스==현재 페이지 총 학교 수)                              then                                    타이머 A 를 제거 하고 알파벳 을 전환 하 는 과정 에서 계속 채집 하지 않도록 합 니 다.                                  누 르 면 다음 알파벳 전환         else                            학교 데이터 수집... 4.타이머 B5,if 설정(현재 알파벳 인덱스==26)                              then                                    타이머 B 를 제거 하여 도 시 를 전환 하 는 과정 에서 계속 채집 하지 않도록 합 니 다.                                  클릭 하여 다음 도시 로 전환         else                            학교 데이터 수집...                                   최종 코드:
// ==UserScript==
// @name               
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http://passport2.chaoxing.com/*
// @require http://code.jquery.com/jquery-1.10.0.min.js
// @grant        none
// ==/UserScript==
//   
var cl=$(".zw_s_li a").length;
var ll=26;
var sl=$(".zw_m_li a").length;
//    
var ccl=0;
var cll=1;
var csl=0;
//    
var city=$(".zw_s_li a");
var school=$(".zw_m_li a");
var letter=$(".zw_m_t_li a");
var timerA;
var timerB;

function getSchool(){
    if(cll>ll){
        clearInterval(timerB);
        //
        ccl++;
        cll=1;//    
        $(city[ccl]).click();
        setTimeout(function(){
            $(letter[1]).click();
            timerB=setInterval(function(){
                getSchool();
            },1000);
        },2000);
    }
    else if(ccl>cl){
        clearInterval(timerB);
        return;
    }
    else if(csl==sl){
        //
        clearInterval(timerB);
        cll++;
        console.log($(letter[cll]).attr("id"));
        $(letter[cll]).click();
        setTimeout(function(){
            school=$(".zw_m_li a");
            csl=0;
            sl=school.length;
            timerB=setInterval(function(){
                getSchool();
            },1000);
        },2000);
    }
    else{
        //        
        console.log(ccl+"_"+cll+"/"+ll+"_"+csl+"/"+sl);
        var id=$(school[csl]).attr("id");
        var name=$(school[csl]).attr("name");
        var lt=$(letter[cll]).attr("id");
        csl++;
        insertSchool(id,name,lt);
        getSchool();
    }
}
function insertSchool(id,name,lt){
    $.ajax({
        url: "http://localhost:1066/handle/r.ashx?method=updateChaoXingSchool",
        type: "get",
        dataType:"jsonp",
        jsonp:"jsonpCallback",
        jsonpCallback:"success_jsonpCallback",
        data: {schoolId:id,name:name,letter:lt},
        success:function(result){
        },
        error:function(data){
        }
    });
}
(function() {

    $(".zw_m_box").before("");
    $("#caiji").click(function(){
        cl=$(".zw_s_li a").length;
        sl=$(".zw_m_li a").length;
        city=$(".zw_s_li a");
        school=$(".zw_m_li a");
        letter=$(".zw_m_t_li a");
        getSchool();
    });
})();

좋은 웹페이지 즐겨찾기