2012-03-24 23 views
1

我試圖加載一個HTML文件,搜索一個字符串裏面,如果沒有找到,加載另一個文件並重復該過程(總共約5-6個文件)。

這裏是我的過程來進一步說明:

  1. 負載的file1.html
  2. 如果找到,告訴用戶(和結束進程)
  3. 如果沒有找到一個字符串搜索,移動到下一個文件並使用file2.html重複步驟1

我一直在試圖圍繞jQuery推遲AJAX調用的對象。簡單地說,我到目前爲止所提出的是,如果找到字符串,則解析主延遲對象(mainDef) - 這可能會阻止腳本加載第二個文件,因爲沒有必要。

否則(即,如果在第一個文件中沒有找到字符串),它會加載第二個文件。然後是第三個,依此類推。

這裏是我的代碼:

// var $q = string to be searched 
// resolved when answer found 
var mainDef = $.Deferred(); 
// resolved when not found in one day 
var dayDef = $.Deferred(); 

$.ajaxSetup({ 
    success: function(data) { 
     var $result = $(data).find("td:contains('"+ $q +"')"); 
     if ($result.length !== 0) { 
      mainDef.resolve(); 
      return data; 
     } 
     else { 
      return false; 
     } 
    }, 
    dataType: 'html', 
}); 

function one() { 
    return $.ajax({ 
     url: 'one.html' 
    }); 
} 

function two() { 
    return $.ajax({ 
     url: 'two.html' 
    }); 
} 

$.when(one(), two()).then(
    // success 
    function(data) { 
     var $result = $(data).find("td:contains('"+ $q +"')"); 
     // found it 
     if ($result.length !== 0) { 
      $success.removeClass('hidden'); 
     } 
     else { 
      $error.removeClass('hidden'); 
     } 
    }, 
    // fail 
    function() { 
     alert("Promise failed"); 
    } 
); 

的問題是,我無法阻止經歷的第二個AJAX請求,並muddles事情對我來說,因爲在$.when()/.then()塊時,成功回調沒有得到響應文本(在變量data

我不太確定這是更具概念性的問題,我有技術或者技術問題。我意識到我需要運行2級如果找到了字符串,它會解析主層並退出該腳本,如果沒有找到,它將解決延遲的「低級」,同時繼續主要級別。

所以我的問題是:我怎麼搜索字符串中AJAX'd文件,如果沒有找到,加載另一個文件?

+0

而不是敲我的頭這,我已經決定要解決這個項目的問題,通過合併文件,使得它只需加載一個HTML文件 - 我仍然想知道我的初衷是否可能,所以如果有人知道我很想聽到它! – wzub 2012-03-25 10:51:17

回答

1

像這樣的東西可能會回答你的問題:推遲建造一個自定義的,逐個檢查文件,標誌着作爲延期解決,如果條件滿足,標誌着延期被否決,如果所有的文件都失敗了。

var urls=["one.html","two.html","three.html"]; 

function Finder(urls) { 
    var dfd=jQuery.Deferred(); 

    function fetchUrl(url) { 
     return jQuery.ajax({ 
      url: url 
     }); 
    } 

    function parseMatch(res) { 
     // that would be the actual parsing 
     // a bit of randomness instead 
     return (Math.round(Math.random())) ? true:false; 
    } 

    function getMatch() { 
     if (dfd.state()!=="pending") //problem already solved 
      return; 
     if (urls.length==0) { // no more url to check 
      dfd.reject(); // we did not find a match 
      return; 
     } 

     // let's try the next url 
     fetchUrl(urls.shift()). 
      pipe(parseMatch,getMatch). // and filter the result 
      done(function(found) { //file loaded and parsed 
       if (found) 
        dfd.resolve(); 
       else 
        getMatch(); 
      }); 
    } 
    getMatch(); 
    return dfd.promise(); 
} 

var f=Finder(urls); 
f.done(function() {console.log("found")}); 
f.fail(function() {console.log("not found")}); 

http://jsfiddle.net/RnhfG/

+0

這簡直太棒了!完全按照預期工作。我覺得我一直在圍繞這個概念徘徊,但無法弄清楚如何實際做到這一點。謝謝! – wzub 2012-03-29 17:33:24

0

.pipe()是你的朋友:

function testData(data) { 
    return $(data).find("td:contains('"+ $q +"')").length 
     ? data 
     : $.Deferred().reject($q + " not found"); 
} 

function find(urls) { 
    return $.ajax(urls[ 0 ]) 
     .pipe(testData) 
     .pipe(null, urls.length > 1 && function() { 
      return find(urls.slice(1)); 
     }); 
} 

find([ "one.html", "two.html", "three.html" ]).done(function() { 
    // FOUND 
}).fail(function() { 
    // NOT FOUND 
}); 
相關問題