2014-11-20 14 views
5

Ho una calcolatrice che funziona con i pulsanti per assegnare valori. L'idea principale è generare formule. I valori sono aggiunti senza soluzione di continuità in un "input". Tutte le staffe quando si entra in vostro rispettivo pulsante, ho bisogno che accada è quello di continuare a inserire i valori tra parentesiCome mettere a fuoco il cursore tra due parentesi (parentesi) con 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>  

Con quel codice questo succede: 5+()3*()+5+3 e ho bisogno: 5+(3*(5+3))

Come posso fare questo?

+6

Ehi, potresti gettarlo in un jsfiddle? – philtune

+1

Forse prova a cambiare il titolo della domanda. Stai chiedendo informazioni sulle stringhe, non sul cursore e/o sul focus. – hon2a

risposta

3

si utilizza il seguente codice per farlo funzionare

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); 
     } 
    } 
}); 

collegamento demo: http://jsfiddle.net/asimshahiddIT/6hje7nvh/

+0

grazie per il tuo aiuto! – cheloncio

+0

il benvenuto ........ – asimshahiddIT

1

È possibile eseguire 2 modi.

possibile separare i '(' pulsante da ')' o si può provare questo:

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

Errore di sintassi nell'ultimo valore – cheloncio

0

Non si vuole mettere un singolo pulsante () sulla calcolatrice, perché questo impedisce di lasciare il parentesi e continuando la formula. È sufficiente creare due pulsanti separati ( e ) e magari aggiungere del codice per il conteggio del numero di parentesi aperte (per completare automaticamente la formula per l'utente premendo = e per evitare l'aggiunta di ) quando non è aperto ().

1

Creare due pulsanti anziché uno, uno per ( e uno per ) e non avrete alcun problema.

1

si può fare in questo modo

$(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

si può usare '(' e ')' che sia meglio di '()' 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

Basta aggiungere una bandiera per la posizione del punto di inserimento. E non dimenticare di resettarlo quando necessario.

$(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 
     } 
    }); 
}); 
Problemi correlati