2016-04-25 8 views
0

Wie erhalte ich ein Attribut aus einem div-Elemente definierte in meinem UIWebView in meinen iOS-App?Get Attribut unter mehrfachen Div-Elementen in meinen iOS-App von UIWebView W/Swift

weiter zu erläutern ...

Ich habe ein sehr einfaches HTML-Dokument, das ich in eine UIWebView laden. Es ermöglicht einem Benutzer zu klicken, um Schaltflächen ein- oder auszuschalten. Ich setze ein Attribut auf den divs auf wahr oder falsch. Siehe meinen Code unten.

<html> 
<head> 
    <title>Tire Selection Template</title> 
    <style> 
     .front_truck_box{ 
      display:flex; 
      flex-wrap: wrap; 
      border:1px solid black; 
      height:80px; 
      flex: 0 1 80px; 
      padding:10px; 
     } 
     .middle_truck_box, .back_truck_box { 
      display:flex; 
      flex-wrap: wrap; 
      border:1px solid black; 
      height:80px; 
      flex: 1 1 120px; 
      max-width:250px; 
      padding:10px; 
     } 
     .wrapper{ 
      display:flex; 
      flex-direction: row; 
      flex-wrap: nowrap; 
      align-items:center; 
      justify-content: center; 
     } 
     .tire_box{ 
      flex: 0 0 10px; 
      height:30px; 
      width:10px; 
      border:1px solid black; 
      cursor:pointer; 
     } 
     .tire_set{ 
      display: flex; 
      flex: 0 0 35px; 
      justify-content: space-around; 
     } 
     .front_tire_set{ 
      display:flex; 
      flex: 0 1 100%; 
      justify-content: space-around; 
     } 
     .first_row,.second_row{ 
      display:flex; 
      flex: 1 0 100%; 
      flex-direction: row; 
      flex-wrap: wrap; 
      align-items: center; 
      justify-content: space-around; 
     } 
    </style> 
</head> 
<body> 
    <div class="wrapper"> 
     <div class="front_truck_box"> 
      <div class="first_row"> 
       <div class="front_tire_set"> 
        <div class="tire_box" tire="1" active="false"></div> 
        <div class="tire_box" tire="2" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="front_tire_set"> 
        <div class="tire_box" tire="3" active="false"></div> 
        <div class="tire_box" tire="4" active="false"></div> 
       </div> 
      </div> 
     </div> 
     <div class="middle_truck_box"> 
      <div class="first_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="5" active="false"></div> 
        <div class="tire_box" tire="6" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="7" active="false"></div> 
        <div class="tire_box" tire="8" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="9" active="false"></div> 
        <div class="tire_box" tire="10" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="11" active="false"></div> 
        <div class="tire_box" tire="12" active="false"></div> 
       </div> 
      </div> 
     </div> 
     <div class="back_truck_box"> 
      <div class="first_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="13" active="false"></div> 
        <div class="tire_box" tire="14" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="15" active="false"></div> 
        <div class="tire_box" tire="16" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="17" active="false"></div> 
        <div class="tire_box" tire="18" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="19" active="false"></div> 
        <div class="tire_box" tire="20" active="false"></div> 
       </div> 
      </div> 
     </div> 
    </div> 
    <script src="https://code.jquery.com/jquery-2.2.3.min.js" integrity="sha256-a23g1Nt4dtEYOj7bR+vTu7+T8VP13humZFBJNIYoEJo=" crossorigin="anonymous"></script> 
    <script> 
     $(document).ready(function(){ 
      $(".wrapper").on('click', '.tire_box', function() { 
       var tire = $(this).attr("tire"); 
       var active = $(this).attr("active"); 
       console.log(active); 
       //console.log(tire); 
       if(active == "false"){ 
        $(this).css("background-color","black"); 
        $(this).attr("active","true"); 
       }else{ 
        $(this).css("background-color","white"); 
        $(this).attr("active","false"); 
       } 
      }); 

      function test(){ 
       return "test" 
      } 
     }); 
    </script> 
</body> 
</html> 

Sie können es in Aktion sehen hier: https://jsfiddle.net/x11joex11/0d92ao80/1/

Ich bin der der folgenden Codezeile in schnellen bewusst.

theWebView.stringByEvaluatingJavaScriptFromString("document.documentElement.outerHTML") 

Diese Linie wird alle HTML zurück. Nun könnte ich das vielleicht durchgehen und analysieren, aber ich denke, dass es möglich sein sollte, da ich jquery verwende, um einen Befehl auszuführen, um alle Felder zu erhalten, auf die geklickt wurde. Wenn auf jede Box geklickt wird, ändere ich ihr "aktives" Attribut auf "wahr" oder "falsch". Wie mache ich das?

beispielsweise ein Array mit Werten der "Reifen" -Attribut Rückkehr I auf jedem div (.tire_box) haben, die angeklickt wird ("active = true").

Eine Antwort mit jQuery (da ich es auf meinem HTML haben) oder Javascript ist in Ordnung. Nur nicht sicher, was in der stringByEvaluatingJavascriptFromString() Funktion

Update ::

ich den Wert von ‚Eins‘ bekommen konnte setzt der Reifen mit diesem Befehl.

document.getElementsByClassName('tire_box')[0].getAttribute('tire') 

Ich muss in der Lage, die Liste der Reifen ausgewählt bekommen und irgendwie damit in schnellen etwas tun. Nicht sicher beste Weg, dies noch zu tun ...

Was interessant ist, ich scheinen in der Lage zu sein jQuery-Code auszuführen. Ich habe einen Funktionstest() in einer Variablen außerhalb Javascript mit einem alert ('test') in es in meinem html und lief diesen Code ...

Swift Javascript Ich lief

$(document).ready(function(){ 
    test(); 
}); 

Hinzu HTML außerhalb document.ready()

var test = function(){ 
      alert("test function ran"); 
      return "test"; 
     }; 

auf der stringByEvaluatingJavaScriptFromString Funktion und den Alarm genannt, aber ich scheine nicht jedes Ergebnis zu kommen aus dem stringByEvaluatin gJavaScriptFromString Funktion ... einfach leer?

Ich frage mich nur, wie 'die Funktion der Javascript gibt und was habe ich in dem JavaScript-Befehl zu tun, um es etwas zurückgeben zu machen?

Antwort

0

Nach viel Forschung, die ich dachte, endlich die Antwort aus.Stellt fest, dass stringByEvaluatingJavaScriptFromString das Ergebnis der auszuführenden Anweisung zurückgibt.

Das sagte ich änderte meine HTML die folgende unten.

<html> 
<head> 
    <title>Tire Selection Template</title> 
    <style> 
     .front_truck_box{ 
      display:flex; 
      flex-wrap: wrap; 
      border:1px solid black; 
      height:80px; 
      flex: 0 1 80px; 
      padding:10px; 
     } 
     .middle_truck_box, .back_truck_box { 
      display:flex; 
      flex-wrap: wrap; 
      border:1px solid black; 
      height:80px; 
      flex: 1 1 120px; 
      max-width:250px; 
      padding:10px; 
     } 
     .wrapper{ 
      display:flex; 
      flex-direction: row; 
      flex-wrap: nowrap; 
      align-items:center; 
      justify-content: center; 
     } 
     .tire_box{ 
      flex: 0 0 10px; 
      height:30px; 
      width:10px; 
      border:1px solid black; 
      cursor:pointer; 
     } 
     .tire_set{ 
      display: flex; 
      flex: 0 0 35px; 
      justify-content: space-around; 
     } 
     .front_tire_set{ 
      display:flex; 
      flex: 0 1 100%; 
      justify-content: space-around; 
     } 
     .first_row,.second_row{ 
      display:flex; 
      flex: 1 0 100%; 
      flex-direction: row; 
      flex-wrap: wrap; 
      align-items: center; 
      justify-content: space-around; 
     } 
    </style> 
</head> 
<body> 
    <div class="wrapper"> 
     <div class="front_truck_box"> 
      <div class="first_row"> 
       <div class="front_tire_set"> 
        <div class="tire_box" tire="1" active="false"></div> 
        <div class="tire_box" tire="2" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="front_tire_set"> 
        <div class="tire_box" tire="3" active="false"></div> 
        <div class="tire_box" tire="4" active="false"></div> 
       </div> 
      </div> 
     </div> 
     <div class="middle_truck_box"> 
      <div class="first_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="5" active="false"></div> 
        <div class="tire_box" tire="6" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="7" active="false"></div> 
        <div class="tire_box" tire="8" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="9" active="false"></div> 
        <div class="tire_box" tire="10" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="11" active="false"></div> 
        <div class="tire_box" tire="12" active="false"></div> 
       </div> 
      </div> 
     </div> 
     <div class="back_truck_box"> 
      <div class="first_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="13" active="false"></div> 
        <div class="tire_box" tire="14" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="15" active="false"></div> 
        <div class="tire_box" tire="16" active="false"></div> 
       </div> 
      </div> 
      <div class="second_row"> 
       <div class="tire_set"> 
        <div class="tire_box" tire="17" active="false"></div> 
        <div class="tire_box" tire="18" active="false"></div> 
       </div> 
       <div class="tire_set"> 
        <div class="tire_box" tire="19" active="false"></div> 
        <div class="tire_box" tire="20" active="false"></div> 
       </div> 
      </div> 
     </div> 
    </div> 
    <script src="https://code.jquery.com/jquery-2.2.3.min.js" integrity="sha256-a23g1Nt4dtEYOj7bR+vTu7+T8VP13humZFBJNIYoEJo=" crossorigin="anonymous"></script> 
    <script> 
     var returnToIOS = function(){ 

      //Calculate which tires are 'active=true' and 'active=false' to the array. 
      var tires = []; 
      var tireObj = {}; 

      $(".tire_box").each(function(index){ 
       tireObj = {};//create new object. 
       tireObj["number"] = $(this).attr("tire"); 
       tireObj["active"] = $(this).attr("active"); 
       tires.push(tireObj);//add to our tire array the object. 
      }); 

      var jsonString = JSON.stringify(tires); 
      return jsonString; 
     }; 
     $(document).ready(function(){ 
      $(".wrapper").on('click', '.tire_box', function() { 
       var tire = $(this).attr("tire"); 
       var active = $(this).attr("active"); 

       if(active == "false"){ 
        $(this).css("background-color","black"); 
        $(this).attr("active","true"); 
       }else{ 
        $(this).css("background-color","white"); 
        $(this).attr("active","false"); 
       } 
      }); 
     }); 
    </script> 
</body> 
</html> 

Beachten Sie die Funktion returnToIOS. Ich habe es so gemacht, dass es eine JSON-Zeichenfolge mit den gewünschten Daten aus der Vorlage zurückgeben würde.

Als nächstes in Swift habe ich den folgenden Code.

let javascript = "returnToIOS();" 
let value = self.theWebView.stringByEvaluatingJavaScriptFromString(javascript) 

Dies wird die JSON-Zeichenfolge mit allen Daten zurückgeben!

dies noch besser zu machen, inklusive ich eine Bibliothek in mein iOS Projekt Swift Json genannt (https://github.com/dankogai/swift-json/)

Ich lief dann diese Befehle.

let data = value!.dataUsingEncoding(NSUTF8StringEncoding) 

       let json = JSON(data:data!) 

       for tires in json.asArray! { 
        print(tires["number"].asString!+" : "+tires["active"].asString!) 
       } 

und Wha La Ich hatte alle meine Daten in einem schönen Array, dass ich mit manipulieren kann!

Verwandte Themen