2014-11-20 5 views
5

Mam kalkulator, który działa z przyciskami, aby przypisać wartości. Główną ideą jest generowanie formuł. Wartości są płynnie dodawane do "danych wejściowych". Wszystkie wsporniki po wpisaniu odpowiedniego przycisku, muszę się zdarzyć, aby kontynuować wprowadzanie wartości w nawiasachJak ustawić kursor pomiędzy dwoma nawiasami (nawiasy) za pomocą Jquery?

enter image description here

Jquery

$(document).ready(function() { 
    $("input:button").click(function() { 
     valor = $(this).val(); 
     actual = $("#ContentPlaceHolder1_formula").val(); 
     if (valor == "C") { 
      $("#ContentPlaceHolder1_formula").val(""); 
     } else { 
      if (valor == "=") { 
       $("#ContentPlaceHolder1_formula").val(eval(actual)); 
      } else { 
       $("#ContentPlaceHolder1_formula").val(actual + valor); 
      } 
     } 
    }); 
}); 

Html

    <div class="form-group"> 
        <input class="btn" type="button" value="()" id="parentesis" /> 
        <input class="btn" type="button" value="1" id="1" /> 
        <input class="btn" type="button" value="2" id="2" /> 
        <input class="btn" type="button" value="3" id="3" /> 
        <input class="btn" type="button" value="+" id="sumar" /><br /> 
        <input class="btn" type="button" value="4" id="4" /> 
        <input class="btn" type="button" value="5" id="5" /> 
        <input class="btn" type="button" value="6" id="6" /> 
        <input class="btn" type="button" value="-" id="restar" /><br /> 
        <input class="btn" type="button" value="7" id="7" /> 
        <input class="btn" type="button" value="8" id="8" /> 
        <input class="btn" type="button" value="9" id="9" /> 
        <input class="btn" type="button" value="*" id="multiplicar" /><br /> 
        <input class="btn" type="button" value="0" id="0" /> 
        <input class="btn" type="button" value="=" id="igual" /> 
        <input class="btn" type="button" value="C" id="C" /> 
        <input class="btn" type="button" value="/" id="dividir" /> 
        <asp:Button ID="btn_login" OnClick="docreateformula" CssClass="btn btn-primary btn-lg center-block" Text="Guardar" runat="server"/> 
       </div>  

Z tym kodem dzieje się to: 5+()3*()+5+3 i muszę: 5+(3*(5+3))

W jaki sposób można to zrobić?

+6

Hej, czy możesz rzucić to w jsfiddle? – philtune

+1

Może spróbuj zmienić tytuł pytania. Pytasz o operacje na ciągach, a nie o kursor i/lub ostrość. – hon2a

Odpowiedz

3

użyć następującego kodu, aby to działało

function occurrences(string, subString, allowOverlapping) { 

    string+=""; subString+=""; 
    if(subString.length<=0) return string.length+1; 

    var n=0, pos=0; 
    var step=(allowOverlapping)?(1):(subString.length); 

    while(true){ 
     pos=string.indexOf(subString,pos); 
     if(pos>=0){ n++; pos+=step; } else break; 
    } 
    return(n); 
} 

$("input:button").click(function() { 
    valor = $(this).val(); 
    actual = $("#ContentPlaceHolder1_formula").val(); 
    if (valor == "C") { 
     $("#ContentPlaceHolder1_formula").val(""); 
    } 
    else if(valor=="()") 
    { 
    var count1= occurrences(actual,'(',false); 
    var count2= occurrences(actual,')',false); 
     var count=count1+count2; 
     if(count%2==0) { $("#ContentPlaceHolder1_formula").val(actual+"("); 
         } 
     else { 
     $("#ContentPlaceHolder1_formula").val(actual+")"); 
     } 
       } 
    else { 
     if (valor == "=") { 
      $("#ContentPlaceHolder1_formula").val(eval(actual)); 
     } else { 
      $("#ContentPlaceHolder1_formula").val(actual + valor); 
     } 
    } 
}); 

Link Demo: http://jsfiddle.net/asimshahiddIT/6hje7nvh/

+0

bardzo dziękuję za pomoc! – cheloncio

+0

Twoje powitanie ........ – asimshahiddIT

1

Możesz zrobić 2 sposoby.

można oddzielić „(” przycisk z „)” lub można spróbować to:

if(valor=="()"){ 
    for(i=0;i<actual.lenght;i++){ 
    var aux = actual.IndexOf("(",i); 
    if(aux){ 
    var aux2 = actual.IndexOf(")"); 
    if(aux2){ 
     i=aux2-1; 
    }else{ 
     valor=")"; 
    }else{ 
     valor="("; 
    } 
$("#ContentPlaceHolder1_formula").val(actual + valor); 
+0

Błąd składniowy ostatniego ostatniego: – cheloncio

0

Nie chcesz umieścić jednego przycisku () na kalkulatorze, bo to uniemożliwia pozostawiając nawiasy i kontynuowanie formuły. Po prostu utwórz dwa osobne przyciski: ( i ) i może dodaj kod do zliczania liczby otwartych nawiasów (aby automatycznie zakończyć formułę dla użytkownika po naciśnięciu klawisza = i aby zapobiec dodawaniu ), gdy nie ma otwartego ().

1

Utwórz dwa przyciski zamiast jednego, jeden dla ( i jeden dla ) i nie będzie problemu.

1

Można zrobić to tak

$(document).ready(function() { 
    var opened=0; 
    $("input:button").click(function() { 
     valor = $(this).val(); 
     actual = $("#ContentPlaceHolder1_formula").val(); 
     if (valor == "C") { 
      $("#ContentPlaceHolder1_formula").val(""); 
     } else { 
      if (valor == "=") { 
       $("#ContentPlaceHolder1_formula").val(eval(actual)); 
      } else {   
       $("#ContentPlaceHolder1_formula").val(actual + valor); 
       if(valor=="()") { 
        input = $("#ContentPlaceHolder1_formula"); 
        input[0].selectionStart = input[0].selectionEnd = input.val().length - 1; 
       } 
      } 
     } 
    }); 

});

1

można użyć '(' i ')' lepiej niż '()' http://jsfiddle.net/mazin/7yj20umu/

$(document).ready(function() { 
 
    $("input:button").click(function() { 
 
    valor=$(this).val(); 
 
     actual = $('#btn_login').val(); 
 
     if (valor == "C") { 
 
      $('#btn_login').val(""); 
 
     } else { 
 
      if (valor == "=") { 
 
       $('#btn_login').val(eval(actual)); 
 
      } else { 
 
       $('#btn_login').val(actual + valor); 
 
      } 
 
     } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="form-group"> 
 
        <input class="btn" type="button" value=")" id="parentesis" /> 
 
           <input class="btn" type="button" value="(" id="parentesis" /> 
 

 
        <input class="btn" type="button" value="1" id="1" /> 
 
        <input class="btn" type="button" value="2" id="2" /> 
 
        <input class="btn" type="button" value="3" id="3" /> 
 
        <input class="btn" type="button" value="+" id="sumar" /><br /> 
 
        <input class="btn" type="button" value="4" id="4" /> 
 
        <input class="btn" type="button" value="5" id="5" /> 
 
        <input class="btn" type="button" value="6" id="6" /> 
 
        <input class="btn" type="button" value="-" id="restar" /><br /> 
 
        <input class="btn" type="button" value="7" id="7" /> 
 
        <input class="btn" type="button" value="8" id="8" /> 
 
        <input class="btn" type="button" value="9" id="9" /> 
 
        <input class="btn" type="button" value="*" id="multiplicar" /><br /> 
 
        <input class="btn" type="button" value="0" id="0" /> 
 
        <input class="btn" type="button" value="=" id="igual" /> 
 
        <input class="btn" type="button" value="C" id="C" /> 
 
        <input class="btn" type="button" value="/" id="dividir" /> 
 
      <input ID="btn_login" type="text" OnClick="docreateformula" CssClass="btn btn-primary btn-lg center-block" Text="Guardar"/> 
 
</div>

1

Wystarczy dodać flagę na stanowisko punkt wstawienia. I nie zapomnij zresetować go, gdy jest to konieczne.

$(document).ready(function() { 
    var flag = 0; // the insert point 
    $("input:button").click(function() { 
     valor = $(this).val(); 
     actual = $("#ContentPlaceHolder1_formula").val(); 
     if (valor == "C") { 
      $("#ContentPlaceHolder1_formula").val(""); 
      flag = 0; // reset the flag 
     } else if (valor == "=") { 
      $("#ContentPlaceHolder1_formula").val(eval(actual)); 
      flag = 0; // reset the flag 
     } else { 
      // split current valor at the insert point and concat with insertion 
      $("#ContentPlaceHolder1_formula").val(actual.slice(0, flag) + valor + actual.slice(flag)); 
      flag++; // increase flag by 1 
     } 
    }); 
}); 
Powiązane problemy