2014-10-21 8 views
6

Sto cercando di caricare il seguente codice HTML come una stringa in una WebView:Webview Android - commenti javascript a riga singola che causano errori Uncaught SyntaxError?

<html> 
    <head> 
    <script> 
     function foo() { 
     // test. 
     } 
    </script> 
    </head> 
    <body> 
    <p>hi.</p> 
    </body> 
</html> 

------------------------------ 

String content = readAboveContentIntoString(); 
WebView webview = ...; 
webview.loadData(content, "text/html", "utf-8"); 

ricevo il seguente messaggio dalla console WebView:

Uncaught SyntaxError: Unexpected end of input 

Se rimuovo il "// test. " commento, non ricevo l'errore di sintassi. E 'come se il WebView è spogliando a capo, e così il corpo della funzione sta applicando il commento alla parentesi graffa di chiusura in questo modo:

function foo() { // test. } 

Can chiunque altro Repro questo? Ho pensato che forse il mio readAboveContentIntoString() stava mettendo a nudo i newline, ma è stato testato e non lo è. Sto usando Android 4.4.4.

Grazie

- Modifica ---

Inoltre, un blocco di commento funziona bene al posto della riga di commento:

/* test. */ 
+0

avendo lo stesso problema con il recente Android accumulo Studio e API 21 – user636066

+0

Il problema tecnico ha confermato vivo e vegeto fino a WebView/Chromium 44 a API 23. Suggerisco interpretato da [il problema ] (https://code.google.com/p/android/issues/detail?id=23437) in quanto considerato "obsoleto"? –

risposta

2

Ho avuto lo stesso problema. Sembra che l'unico modo per rimuovere prima i commenti dalla stringa del contenuto e poi caricarlo su webview.

String content = readAboveContentIntoString(); 
WebView webview = ...; 

// Add This : 
content = removeComment(content); 

webview.loadData(content, "text/html", "utf-8"); 

La funzione removeComment() rimuove sia i commenti di singola riga che i commenti di blocco.

private String removeComment(String codeString){ 

    int pointer; 
    int[] pos; 
    String str = codeString; 

    while(true) { 

     pointer = 0; 
     pos = new int[2]; 
     pos[0] = str.indexOf("/*",pointer); 
     pos[1] = str.indexOf("//",pointer); 
     int xPos = xMin(pos); 

     if(xPos != -1){ 

      //========================= Pos 0 
      if(xPos == pos[0]){ 
       pointer = xPos + 2; 
       int pos2 = str.indexOf("*/", pointer); 
       if(pos2 != -1){ 
        str = str.substring(0,xPos) + str.substring(pos2+2,str.length()); 
       } 
       else{ 
        str = str.substring(0,xPos); 
        break; 
       } 
      } 
      //========================= Pos 1 
      if(xPos == pos[1]){ 
       pointer = xPos + 2; 
       int pos2 = str.indexOf('\n', pointer); 
       if(pos2 != -1){ 
        str = str.substring(0,xPos) + str.substring(pos2+1,str.length()); 
       } 
       else{ 
        str = str.substring(0,xPos); 
        break; 
       } 
      } 
     } 
     else break; 
    } 
    return str; 
} 

private int xMin(int[] x){ 
    int out = -1; 

    for(int i = 0;i < x.length;i++){ 
     if(x[i] > out)out = x[i]; 
    } 
    if(out == -1)return out; 

    for(int i = 0;i < x.length;i++){ 
     if(x[i] != -1 && x[i] < out)out = x[i]; 
    } 

    return out; 
} 
0

La stringa Java contiene un'interruzione di riga dopo la riga di commento? In caso contrario, tutto nell'elemento javascript dopo il primo "//" verrà interpretato come un commento a riga singola non terminato, poiché non trova "\ n" dopo "// test".

Si veda il commento 5 in questo numero: https://issuetracker.google.com/issues/36937564#comment5

Problemi correlati