2013-05-23 12 views
14

Ich habe eine Website mit href darin, die michprogrammatische Klick in Android WebView

<a id="mA" href="javascript:pLogin(2)" class="login-link__link private-cab-link"><i class="icon-user"></i>Авторизация</a> 

Also auf https umgeleitet, ich auf sie durch JavaScript klicken. Es funktioniert in Chromkonsole

javascript:(function(){document.getElementById('mA').click();})() 

Nun Ich versuche, das gleiche in WebView zu tun, indem sie meine App-Schaltfläche klicken.

public class RostelecomLoginActivity extends Activity { 

    WebView webView; 
    String url; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     setContentView(R.layout.activity_rostelecom_login); 
     Intent webIntent = getIntent(); 
     String url = webIntent.getStringExtra("url"); 

     webView = (WebView) findViewById(R.id.webView1); 
     webView.setWebViewClient(new MeWebViewClient()); 
     webView.getSettings().setJavaScriptEnabled(true); 
     webView.getSettings().setSaveFormData(true); 
     webView.getSettings().setSavePassword(true); 
     webView.loadUrl(url); 

     Button buttoner = (Button) findViewById(R.id.button1); 
     buttoner.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       webView.loadUrl("javascript:(function(){document.getElementById('mA').click();})()"); 
      } 
     }); 

    } 

} 

I MyWebViewClient bin mit allen Zertifikaten js

public class MeWebViewClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
     handler.proceed(); 
    } 
} 

Die Injektion ermöglichen funktioniert nicht. Wenn ich in WebView auf href klicke, funktioniert es. Was kann falsch sein?

+1

beachten Sie bitte an akzeptiere eine Antwort. Die Lösung von "deviato" funktioniert super. Ich habe es getestet. Grüße – Lisitso

Antwort

28

click() wird in android js Schnittstelle nicht implementiert, müssen Sie HTML-DOM Event-Objekt verwenden, wie folgt aus:

webView.loadUrl("javascript:(function(){"+ 
    "l=document.getElementById('mA');"+ 
    "e=document.createEvent('HTMLEvents');"+ 
    "e.initEvent('click',true,true);"+ 
    "l.dispatchEvent(e);"+ 
    "})()"); 
+3

Gott segne dich! Sie haben mir nach vielen Tagen geholfen, die Lösung zu finden. Vielen Dank – Lisitso

+0

@deviato: hi, was, wenn button/href keine ID haben? Könnten Sie bitte eine Lösung geben? in meinem Beispiel 'code ' Danke –

+1

@JasbirBhinder ist in diesem Fall einfach ein JavaScript-Problem, das Sie lösen können, indem Sie 'getElementsByClassName' oder' getElementsByName' verwenden, die ein Array von Objekten zurückgeben. Wenn Sie beispielsweise nur ein Element mit diesem Namen haben, können Sie '" l = document.getElementsByName ('initCaseSearch'); "+ ' an der Stelle der zweiten Zeile verwenden. – deviato

5

Sie müssen eine JavaScript-Schnittstelle zum WebView hinzufügen, um eine JavaScript-Funktion von Android-Code aufzurufen.

Probieren Sie etwas wie folgt aus: -

Button buttoner = (Button) findViewById(R.id.button1); 
    buttoner.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      JavascriptInterface javasriptInterface = new JavascriptInterface(RostelecomLoginActivity.this); 
      webView.addJavascriptInterface(javasriptInterface, "MyInterface"); 
      webView.loadUrl("javascript:(function(){document.getElementById('mA').click();})()"); 
     } 
    }); 
+0

Ich benutze API-Level 17, in der Dokumentation sah ich, dass ich Annotation hinzufügen sollte. Aber wenn ich @JavascriptInterface vor öffentlichem void onClick hinzufüge, funktioniert es immer noch nicht, weil ich JavascriptInterface jsint = new JavascriptInterface nicht erstellen kann (RostelecomLoginActivity.this); Kann nicht den Typ JavascriptInterface (Fehler) instanziiert – Valeriy

+0

@bakriOnFire Ich glaube, Sie verstehen nicht, was 'addJavascriptInterface' tut – njzk2

+0

@bakriOnFire Gibt es trotzdem ihren Wert nur ein Element zu erhalten? Es gibt keine ID oder Klasse. – LUKER