好的,Jason Smiley發佈了一個解決方案,但沒有解釋問題是什麼以及解決方案如何工作。
的第一個問題是,傳遞給executeScript
腳本不返回任何內容,期限。 executeScript
所做的是將您傳遞給它的腳本封裝在function() { ... }
中。所以形式$.ajax(...)
的東西會因爲這在瀏覽器中執行:
function() {
$.ajax(...);
}
這顯然不會以同樣的方式,如果腳本是2 + 2
它不會返回4
,因爲它會爲執行任何回報:
function() {
2 + 2;
}
傳遞給executeScript
該腳本將不得不return 2 + 2
。
然而,在這裏,只需添加這return
不會解決問題。還有一個額外的問題,$.ajax
是一個異步功能。當$.ajax
執行時,它立即返回。傳遞給它的函數存儲爲未來執行。如果$.ajax
立即返回,則該值返回不能可能是任何的被賦予它,因爲這些都沒有執行尚未該函數的返回值。相反,然後傳遞給$.ajax
的函數確實執行,無論它們給return
都不能通過代碼檢索到您的代碼。你可以做的唯一的事情就是使用你在函數內部關心的值,或者把它傳遞給另一個函數。
的解決方案是使用executeAsyncScript
,其被設計爲異步執行。這個函數就像executeScript
一樣,但增加了一個參數,它是一個回調函數,當腳本完成執行時應該調用該函數,並且應該使用您想要返回的值executeAsyncScript
來調用它。
請注意,這是絕對沒有必要放棄$.ajax
。下面應該工作:
public static String getHTMLResponse(String url){
String body = (String) js.executeAsyncScript(
"var url = arguments[0];" +
"var callback = arguments[1];" +
"$.ajax({url: url, success: callback});",
url);
return body;
}
注意使url
作爲參數,而不是被串聯成腳本傳遞,我已經設置此代碼。我發現這比連接更清潔。在需要解釋的情況下,arguments
是由JavaScript虛擬機自動提供的對象。它包含給函數的參數列表。
是否使用$.ajax
或直接使用XMLHttpRequest
的原理是相同的。
請注意,我現在只是關閉安全證書檢查。減少與HTTP和HTTPS功能相關的麻煩。 – 2015-01-30 16:26:17
這是如何回答你的原始問題?你沒有提到有關ssl的問題。 – tanjir 2016-01-27 16:37:00