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

我的初始状况没有任何变化。 –

相关问题