2015-02-24 40 views
2

問題:提取從ajax請求數據內page.evaluatePhantomJs - 獲得價值了page.evaluate + AJAX(同步版)

說明:我通常簡單地返回他們得到變量出來page.evaluate。但是,我需要在頁面上下文中發出ajax請求,然後我需要將結果處理出頁面的上下文。

我試圖修復代碼是:

var theOutput = page.evaluate(function() { 
    return $.ajax({ 
     async: false, 
     url: 'http://localhost:8080/captcha.php', 
     data: { filename: 'C:\\wamp\\www\\images\\0.png' }, 
     type: 'post', 
     success: function (output) { 
      parsed_output = $.parseHTML(output); 
      return parsed_output[4].data.trim(); 
     }, 
    }); 
}); 
console.log(theOutput); 

變量parsed_output[4].data.trim()是一個字符串。但是,當我登錄output時,我收到[object Object],屬性爲abort, always, complete, done, error, fail, getAllResponseHeaders, getResponseHeader, overrideMimeType, pipe null, progress, promise, readyState, setRequestHeader, state, statusCode, success,then

問題:如何從page.evaluate中提取theOutput

+0

Artjom的解決方案爲我使用[jquery 1.8.0](https://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.0/jquery-1.8.0.min.js)。我沒有使用早期版本,因爲我還需要函數'$ .parseHTML'(在版本1.8.0中添加)。 – 2015-02-25 19:01:13

回答

4

由於這是一個阻擋AJAX請求,您可以創建一個臨時變量:

var theOutput = page.evaluate(function() { 
    var result; 
    $.ajax({ 
     async: false, 
     ... 
     success: function (output) { 
      parsed_output = $.parseHTML(output); 
      result = parsed_output[4].data.trim(); 
     }, 
    }); 
    return result; 
}); 
console.log(theOutput); 

您也可以直接從jqXHR對象訪問responseText

var theOutput = page.evaluate(function() { 
    var jqXHR = $.ajax({ 
     async: false, 
     url: 'http://localhost:8080/captcha.php', 
     data: { filename: 'C:\\wamp\\www\\images\\0.png' }, 
     type: 'post' 
    }); 
    parsed_output = $.parseHTML(jqXHR.responseText); 
    return parsed_output[4].data.trim(); 
}); 
console.log(theOutput); 

如果擔心async: false已棄用,您可以簡單地使用底層的XMLHttpRequest來使用阻止執行:

var theOutput = page.evaluate(function() { 
    var request = new XMLHttpRequest(); 
    request.open('POST', 'http://localhost:8080/captcha.php', false); 
    request.send($.param({ filename: 'C:\\wamp\\www\\images\\0.png' })); 

    var parsed_output = $.parseHTML(request.responseText); 
    return parsed_output[4].data.trim(); 
}); 
console.log(theOutput); 
+0

我在這兩種解決方案上都收到了'null'。也許'async:false'不工作? (已棄用) – 2015-02-24 20:45:41

+0

不能否決'async',因爲這是底層XMLHttpRequest對象的屬性。註冊「onError」和「onConsoleMessage」事件並查看是否有錯誤。這應該工作。可能你的'parsed_output [4]'選擇了一些破碎的元素,或者有少於5個元素開始。所以'data'是未定義的。 – 2015-02-24 20:53:40

+0

看看這裏的答案(關於異步棄用):http://stackoverflow.com/questions/12930202/jquery-ajax-call-with-async-false-is-not-working – 2015-02-24 21:06:28