1

我試圖從BrowserField裏面的Javascript中啓動一個ajax請求。BlackBerry - Browserfield XMLHttpRequest無效

這是一個演示應用程序,它只是一個嘗試在點擊時發出ajax請求的html元素。

public MyScreen() { 
    // Set the displayed title of the screen 
    setTitle("MyTitle"); 

    BrowserFieldConfig _myBrowserFieldConfig = new BrowserFieldConfig(); 

    _myBrowserFieldConfig.setProperty(
      BrowserFieldConfig.JAVASCRIPT_ENABLED, Boolean.TRUE); 
    _myBrowserFieldConfig.setProperty(BrowserFieldConfig.ALLOW_CS_XHR, 
      Boolean.TRUE); 
    BrowserField browser = new BrowserField(_myBrowserFieldConfig); 
    browser.displayContent(
      "<!DOCTYPE html><html><head>" 
        + "<script>function loadXMLDoc(){" 
         + "alert('t'); " 
         + "var xmlhttp;" 
         + "if (window.XMLHttpRequest) " 
         +"{ " 
          + "xmlhttp = new XMLHttpRequest(); " 
         + "} " 
         + "else { " 
          + "xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\"); " 
         + "}" 
         + " xmlhttp.onreadystatechange=function() " 
         +"{ " 
          + " if (xmlhttp.readyState==4 && xmlhttp.status==200) " 
          + "{" 
//         + " document.getElementById(\"myDiv\").innerHTML=xmlhttp.responseText;" 
          + "}" 
          +"alert('State:'+xmlhttp.readyState+ 'status'+ xmlhttp.status)" 
         + "} " 
         + "xmlhttp.open(\"GET\",\"http://www.w3schools.com/ajax/demo_get.asp\",true);" 
         + "xmlhttp.send(); " 
         + "}" 
        + "</script>" 
        + "</head><body><h2>AJAX</h2><a onclick=\"javascript:loadXMLDoc();\">Request data</a><div id=\"myDiv\"></div></body></html>", 
      "http://www.w3schools.com"); 
    add(browser); 
} 

的問題是,即使第一個警報不工作,所以應該有一個JavaScript語法錯誤,但好了,一切對我來說很好。我在我的電腦上從Firefox上試過這段代碼,並顯示警報(我知道跨域並不總是可行的)。 那麼,我的腳本中有什麼錯誤?

我已經在模擬器上用BB 5.0.0和7.0.0測試過了。

回答

0

問題是使用絕對URL打開XMLHttpRequest。它需要使用相對的url(即:demo_get.asp),並且browserfield需要正確設置baseurl(http://www.w3schools.com/ajax/)。

這非常不方便。

1

我沒有檢查出你的JavaScript,但我有,當我嘗試請求內容的BrowserField以前該領域實際上是添加到其含有ManagerScreen之前的問題。

所以,只要把這個行:

add(browser); 

該呼叫之前

browser.displayContent(/* content here */); 

更新:當我在9550 5.0模擬器上運行你的代碼,我看到了同樣的問題。然而,當它被分解成許多行時,很難調試一長串html和腳本,用引號,加號和轉義字符。一般來說,如果HTML是靜態的,我建議將它放入一個.html文件中,該文件與您的應用程序綁定爲資源

所以,我試圖把你的HTML字符串的全部內容複製到在我的項目文件時,/res文件夾下,命名爲content.html

<!DOCTYPE html> 
<html> 
    <head> 
     <script> 
       function loadXMLDoc(){ 
        alert('t'); 
        var xmlhttp; 
        if (window.XMLHttpRequest) 
        { 
         xmlhttp = new XMLHttpRequest(); 
        } 
        else { 
         xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
        } 
        xmlhttp.onreadystatechange=function() 
        { 
         if (xmlhttp.readyState==4 && xmlhttp.status==200) 
         { 
           //document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
         } 
         alert('State:'+xmlhttp.readyState+ 'status'+ xmlhttp.status) 
        } 
        xmlhttp.open("GET","http://www.w3schools.com/ajax/demo_get.asp",true); 
        xmlhttp.send(); 
       } 
      </script> 
     </head> 
     <body><h2>AJAX</h2><a onclick="javascript:loadXMLDoc();">Request data</a><div id="myDiv"></div> 
     </body> 
</html> 

和,然後我成功地看到它加載和執行JavaScript onclick使用Java:

public MyScreen() { 
     super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR); 

     browser = new BrowserField(); 
     add(browser); 

     InputStream content = getClass().getResourceAsStream("/content.html");  
     try { 
     byte[] html = IOUtilities.streamToBytes(content); 
     browser.displayContent(new String(html), "http://localhost"); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 

因此,我建議嘗試這種方式。 (注意:我不認爲我使用的本地主機基本URL很重要......只有當您的html包含相對鏈接和路徑時才重要)

+0

這沒有奏效。 –

+0

現在有什麼症狀? – Nate

+0

我的初始狀況沒有任何變化。 –

相關問題