2016-07-12 18 views
2

Ich arbeite an einer iOS-App, die einige Aktionen in einem Webview mit injiziertem Javascript durchführt. Ich versuche, eine Submit-Taste auf der Weboberfläche eines Routers zu drücken (also kann ich Ihnen keine URL geben). Ich habe viele andere vorgeschlagene Lösungen online versucht, aber nichts funktioniert. Eine Sache, die ich tun muss, ist einen Eingabeknopf des Typs = SUBMIT zu klicken und aus irgendeinem Grund reagiert es nicht. Ich habe versucht, .click() zusammen mit dem OnClick-Ereignishandler zu verwenden, aber nichts funktioniert. Jede Hilfe wird geschätzt. Der HTML-Code ist unten:Kann nicht auf HTML-Eingabeknopf mit Javascript und WebView klicken (möglicherweise ein Iframe-Problem, nicht sicher)

<div class="fix_button"> 
    <table width="100%" border="0" cellpadding="0" cellspacing="2"> 
    <tbody> 
     <tr> 
     <td nowrap="" colspan="2" align="center"> 
      <input class="cancel_bt" type="RESET" name="Cancel" value="Cancel" onclick="doCancel();" languagecode="51"> 
      &nbsp; 
      <input class="apply_bt" type="SUBMIT" name="Apply" value="Apply" onclick="return checkData();" languagecode="50"> 
     </td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

Die Eingabe-Taste die mit dem class="apply_bt" ist. Dieses div befindet sich in einem iframe und übergibt Daten innerhalb eines anderen iframes innerhalb dieses Rahmens. Die Struktur ist so etwas wie folgt aus:

<iframe> 
    // Contains the Apply Button 
    <div class="fix_button"></div> 

    // Contains the iframe where the info to be submitted is 
    <div id="main" class="main_top_button"> 
     // Contains data to be submitted 
     <iframe src="WLG_2g_wireless2.htm&amp;todo=wifi_primary_init" id="2g_setting" name="wl2gsetting" onload="SetCwinHeight(this.id)" marginheight="0" marginwidth="0" scrolling="no" width="100%" frameborder="0" height="288px"> 
     </iframe> 
    </div> 
</iframe> 

Dies ist der Code, den ich auf den Knopf klicken bin mit:

// Gets the outer iframe 
iframe1 = document.getElementById("formframe"); 
// Gets the html within the iframe 
var innerDoc=iframe1.contentDocument || iframe1.contentWindow.document; 
// Gets iframe within the iframe 
innerframe = innerDoc.getElementById("2g_setting"); 
// Gets the html within the inner iframe 
var innerDoc2=innerframe.contentDocument || innerframe.contentWindow.document; 

// I Enter some data in the inner iframe (not shown), this portion 
// of the code works perfectly. I can see fields being entered and 
// buttons being clicked. 
// Then I click the apply button... 
innerDoc.getElementsByName("Apply")[0].click() 
// And nothing happens 

ich in der Lage bin, das Element zu erhalten und Daten aus der Anwenden-Button lesen, etwa als Text, aber ich kann keine .click() Aktion auf der Schaltfläche ausführen. Außerdem bekomme ich keine Fehler. Ich habe keine Ahnung, warum es nicht funktioniert. Bitte helfen Sie!

Antwort

1

Die click Methode ist nur zuverlässig für <a> Tags. Sie sollten stattdessen ein synthetisches Ereignis auslösen. Dadurch wird auch sichergestellt, dass Event-Handler aufgerufen werden, unabhängig davon, ob sie als HTML-Attribute element.onclick, addEventListener oder eine eventuell verwendete Bibliothek festgelegt wurden.

Siehe How can I trigger a JavaScript event click

den Code aus der obigen Frage verwenden, die folgenden tun.

var button = innerDoc.getElementsByName("Apply")[0] ; 

fireEvent(button, 'click') 
+0

Danke für die schnelle Antwort. Ich habe Ihren Code versucht, aber leider funktioniert es nicht. Die Schaltfläche wird immer noch nicht angeklickt. Immer noch keine Fehler angezeigt. Der Code davor, der Daten in den inneren Rahmen eingibt, funktioniert großartig, aber das Ereignis wird immer noch nicht ausgelöst. Irgendeine Idee warum? Gibt es andere Lösungen? – metacore

0

Das Problem ist, dass das Skript innerhalb eines anderen iFrame ist, und so ist es nicht in der Lage, es zu greifen, wenn Sie nicht innerhalb dieser iFrame sind. Daher wird das Onclick-Ereignis fehlschlagen. Sie müssen die Funktionen zuerst vom inneren Iframe abrufen, um sie vom äußeren iFrame auszuführen.