0

Ich versuche, eine Javascript-Funktion in meine Webview mit einer Server-URL "www.myserver.com" zu injizieren. Das kann ich jedoch nicht. Ich versuchte es auf verschiedene Arten, aber es gelang mir nicht. Ich habe versucht, js-Warnungen einzurichten, die beim Lesen der js-Datei nicht angezeigt werden. Ich bin mir nicht sicher, was ich falsch mache. Hier ist mein Code so weit: meine js Datei "page.js":Wie injiziere ich eine komplizierte Javascript-Selbstlauffunktion in eine Webansicht in Android?

(function() { 
    **alert("this is a test alert");** 
    if (window.page) { 
     return; // page has been loaded from somewhere, not to redefine it again 
    } 

    function Response(xhr) { 
     this.xhr = xhr; 
     this.status = xhr.status; 
    } 
    Response.prototype.getHeader = function(header) { 
     return this.xhr.getResponseHeader(header); 
    }; 
    Response.prototype.getBody = function() { 
     return this.xhr.responseText; 
    }; 

    function ajax(url, callback) { 
     //TODO support PUT method 
     var xhr = new XMLHttpRequest(); 
     xhr.open("GET", url, true); 
     xhr.onerror = function(e) { 
      callback.onerror(e); 
     }; 
     xhr.onreadystatechange = function(event) { 
      if (this.readyState != this.DONE || this.status == 0) { 
       return; 
      } 
      if (this.status != 200) { 
       var response = new Response(xhr); 
       callback.onfail(response); 
       return; 
      } 
      callback.onsuccess(this.responseText); 
     }; 
     xhr.send(); 
    }; 


    var rpc = { 
     type: ["SMALL", "LARGE"], 
     exec: function(call, type) {// "call" conform to JSON-RPC 2.0 
      //TODO differentiate POST/GET based on rpc.type.SMALL/LARGE 
      var param = encodeURIComponent(JSON.stringify(call)); 
      ajax("?_$b=" + param, { 
       onerror: function(e) { 
        //TODO use logging 
        alert("Error:"+e.toString()); 
       }, 
       onfail: function(response) { 
        //TODO use logging 
        alert("Failed:"+response.getBoby()); 
       }, 
       onsuccess: function(text) { 
        //TODO use logging 
        alert("page success:"+text); 
       }, 
      }); 
     } 
    }; 

    var _$b = window.page = { 
      version: "0.1" 
     }; 

    _$b.has = function(feature) { 
      // TODO support nested objects, e.g.: "cache.get" 
      return _$b[feature]; 
     }; 

    _$b.notify = function(id, data) { 
      // TODO invoke the function from native and send web event 
      // var event = document.createEvent('Event'); 
      // event.initEvent(id, true, true); 
      // document.dispatchEvent(event); 
      alert("id:" + id + ";data:" + data); 
     }; 

    _$b.navigate = function(url, title) { 
      rpc.exec(// JSON-RPC 2.0 
       {method: "navigate", params: { 
        "url": url, 
        "title": title 
       }}, rpc.type.SMALL); 
     }; 

    _$b.cache = {}; 

    _$b.cache.get = function(id) { 
      rpc.exec(
       {method: "cache.get", params: { 
        "id": id, 
       }}, rpc.type.SMALL); 
     }; 

    _$b.cache.put = function(id, obj, ts, ttl) { 
      rpc.exec(
       {method: "cache.put", params: { 
        "id": id, 
        "obj": obj, 
        "ts": ts, 
        "ttl": ttl, 
       }}, rpc.type.LARGE); 
     }; 

    _$b.cache.has = function(id) { 
      rpc.exec(
       {method: "cache.has", params: { 
        "id": id, 
       }}, rpc.type.SMALL); 
     }; 

})(); 

Hier ist mein webview Code:

@Override 
        public void onPageFinished(WebView view, String url) { 

         String javascript = ""; 
         try{ 
          AssetManager manager = view.getContext().getAssets(); 
          InputStream is = manager.open("page.js"); 
          InputStreamReader isr = new InputStreamReader(is); 
          BufferedReader br = new BufferedReader(isr); 

          String line; 
          while ((line = br.readLine()) != null) { 
           javascript += line; 

          } 
          is.close(); 
         } 

         catch(Exception e){} 

         view.loadUrl("javascript:" + javascript); 


        } 

       webview.setWebChromeClient(new WebChromeClient() {}); 
       webview.loadUrl(url); 

Irgendwelche Ideen, wie die Benachrichtigung zu erhalten Popup? Hinweis: Wenn ich alle Funktionen in js lösche und nur die Warnungen behalte, funktioniert die Warnung, aber nachdem ich die notwendigen js-Funktionen wieder hinzugefügt habe, funktioniert die Warnung nicht mehr. Irgendeine Idee, was es davon abhalten könnte, wie erwartet in die js einzuspritzen?

Antwort

0

Betrachten Sie diesen Code. Das ist einfach html & JavaScript-Code, Modelle nach dem page.js

<html> 
    <script type="text/javascript"> 

     (function() { alert('inside function'); }) 
     alert('ok'); 

    </script> 
</html> 

dies auszuführen, können Sie ableiten, dass der Alarm innerhalb der Funktion wird beim Start nicht ausgeführt werden, wenn Sie es ausdrücklich aufrufen.

Um Ihre Funktion mit einem Klick ausgeführt werden: (Try this)

<html> 
    <input type="button" onclick="run()" value="Start" /> 

    <script type="text/javascript"> 
     var run = (function() { alert('inside function'); }) 
     alert('ok'); 

    </script> 
</html> 

Um die Funktion [Self Run] (Try this)

<html> 
    <script type="text/javascript"> 
     var run = (function() { alert('inside function'); }) 
     alert('ok'); 

     //you need to execute your function that you have named 
     run(); 

    </script> 
</html> 
+0

läuft, wie kann ich das beheben und Rufen Sie meine js Funktion an, um es zur Arbeit zu bringen? wo und wie trigge ich es in meinem nativen code, um das onclick = "run" in deinem html zu ersetzen? –

+0

Ich habe ein neues Muster aktualisiert. Sie müssen die Funktion benennen und ausführen, um sie auszuführen – sihao

+0

danke. Es funktioniert, wenn ich kopiere den gesamten Dateiinhalt als String, anstatt den Inhalt als "file.js" in meinem Eingabe-Stream-Reader zu lesen. Ich denke, es sind auch die Tabs und neue Zeilen in meinen js-Dateien. Weißt du, wie ich sicherstellen kann, dass diese Tabs und neuen Zeilen nicht angezeigt werden? Wie auch immer, danke für Ihre Antwort. Kannst du mir auch mit diesem Problem helfen, das ich bezüglich jsons Parsing aus der gleichen Javascript-Zeichenfolge habe: http://stackoverflow.com/questions/36498500/how-to-json-parse-a-url-parameter-in-android -webview –

Verwandte Themen