2017-07-08 7 views
0

私は電卓をプログラミングして、同じ列のすべてのボタンが同じ幅を持つようにしようとしています。そのためには、jQueryを使用しています(私は数日で試験があり、私は練習したいので、このようにしています)。すべてのボタンは同じ幅を持っています - jQuery

私のHTMLコード:

<html> 
    <head> 
    <meta charset="UTF-8"> 
    <title>CORE2017 P3</title> 
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
    <script type="text/javascript" src="calculadora.js"></script> 
    <link href="calculadora.css" rel="stylesheet" type="text/css" media="all"> 
    </head> 
    <body onload="igualarBotones()"> 
    <header> 
     <p>Calculator</p> 
    </header> 
    <section id="main"> 
     <p> 
     Número: <input type="text" id="pantalla"> <button id="Limpiar">Limpiar</button> 
     </p> 

     <p> 
     <button id="suma" class="columna1">+</button> 
     <button id="resta" class="columna2">-</button> 
     <button id="cuadrado" class="columna3">x<sup>2</sup></button> 
     </p> 
     <p> 
     <button id="inverso" class="columna1">1/x</button> 
     <button id="raiz" class="columna2">sqrt(x)</button> 
     <button id="pentera" class="columna3">parte_entera(x)</button> 
     </p> 
     <p> 
     <button id="potencia2" class="columna1">2<sup>x</sup></button> 
     <button id="factorial" class="columna2">x!</button> 
     <button id="igual" class="columna3">=</button> 
     </p> 


    </section> 
    </body> 
</html> 

私のJavaScriptコード:

$(function() { 
    function igualarBotones(){ 
    var columna1 = $(".columna1"); 
    setMax(columna1);  
    var columna2 = $(".columna2"); 
    setMax(columna2); 
    var columna3 = $(".columna3"); 
    setMax(columna3); 
    } 

    function setMax(columna){ 
    var maxColumna = -1; 
    for(i=0; i<columna.length; i++){ 
     if(columna[i].css("width") > maxColumna){   
     maxColumna = columna[i].css("width"); 
     } 
    } 
    for(i=0; i<columna.length; i++){ 
     columna[i].css("width",maxColumna); 
    } 
    } 

}); 

それが働いてイマイチなぜ誰もが知っていますか?

編集:私は$(columna[i]).css代わりのcolumna[i].cssを使用し、それが働きました。しかし、私は身体をロードするときに私の関数igualarBotones()が定義されることを達成していません。私はJavascriptをこのよう記述する場合:

$(function() { 
    var columna1 = $(".columna1"); 
    setMax(columna1);  
    var columna2 = $(".columna2"); 
    setMax(columna2); 
    var columna3 = $(".columna3"); 
    setMax(columna3); 

    function setMax(columna){ 
    var maxColumna = -1; 
    for(i=0; i<columna.length; i++){ 
     if(parseFloat($(columna[i]).css("width")) > parseFloat(maxColumna)){   
     maxColumna = $(columna[i]).css("width"); 
     } 
    } 
    columna.css("width",maxColumna);  
    } 
}); 

をそれが動作しますが、私は体にロードされる機能igualarBotones()でそれをやってみたいです。どのようなアイデアを私は間違って何ですか?

ありがとう、ルイス。

+1

使用CSSのフレキシボックス...私が知っているこの – charlietfl

+0

を行うには、スクリプトは必要ありませんが、私は練習のjQueryをしたいと、これは方法だった:

var columna1 = $(".columna1"); 

は次のようになります私はjQueryをテストできました。 css()メソッド。私はポストに示したようにそれを行うことができますか? – Luiscri

+0

私はこのためにCSSを使用することをお勧めします。あなたのコードの問題は、非jqueryの方法をループしていることです。 'columna [i]の代わりに' $(columna [i]) ' ' - jqueryルートに行くなら、' .each'関数を使うことを強く勧めます。 –

答えて

1

問題は、要素およびJavaScriptでの "生" の要素のjQueryの表現の間で異なるが理解されます。

var columna1 = $(".columna1");を指定すると、セレクタ(この場合は.column1)が指定したすべての要素のコレクションであるjqueryオブジェクトが返されます。

このjqueryコレクション(columna[i])を反復すると、要素のjquery表現は得られませんが、実際には生の要素自体(または要素のネイティブJavaScript表現)が得られます。ネイティブのjavascript要素には.css関数がありません。

$(columna[i])を使ってそれぞれの要素を$(...)にラップすると、各要素のjquery表現が再び処理されるため、.cssを使用することができます。そのため、前者は機能せず、後者は機能します。

EXTRA SUGGESTION

あなたはjqueryの私は、これを追加してみましょう学習しているので:jqueryのは、あなたが実際の要素を含むjQueryオブジェクトをループに使うべき.each機能を持っています。

ので、この機能:

function setMax(columna){ 
    var maxColumna = -1; 
    for(i=0; i<columna.length; i++){ 
     if(parseFloat($(columna[i]).css("width")) > parseFloat(maxColumna)){   
      maxColumna = $(columna[i]).css("width"); 
     } 
    } 
    columna.css("width",maxColumna);  
} 

は/であるべきでした:

function setMax(columna){ 
    var maxColumna = -1; 
    columna.each(function(){ 
     // note the use of "this" to represent each 
     // element currently being iterated over. 
     // this = raw element, $(this) = jquery object representing element. 
     if(parseFloat($(this).css("width")) > parseFloat(maxColumna)){   
      maxColumna = $(this).css("width"); 
     } 
    }); 
    columna.css("width",maxColumna);  
} 

LAST TIP

私は個人的に助ける/自分が前に付けることで、私のjavascriptのコードでjQueryオブジェクトを思い出すのに役立ちます$は、jqueryオブジェクトであるすべての変数を忘れないようにします。

ので、この:

var $columna1 = $(".columna1"); 
+0

ありがとう、完全で徹底的な回答です。御時間ありがとうございます。 – Luiscri

+0

私は説明がうれしいです:) – Zuks

0

私はvanilla javascriptの.css関数に精通していません。私はそれをjQueryの.css関数を呼び出すように変更しました。また、少なくともペンでは、身体の装填時に機能が定義されていませんでした。あなたは最大サイズを見つける方法で何かはまだオフですが、これはあなたを開始する必要があります。

function igualarBotones(){ 
 
    var columna1 = $(".columna1"); 
 
    setMax(columna1);  
 
    var columna2 = $(".columna2"); 
 
    setMax(columna2); 
 
    var columna3 = $(".columna3"); 
 
    setMax(columna3); 
 
    } 
 

 
    function setMax(columna){ 
 
    var maxColumna = -1; 
 
    for(var i=0; i<columna.length; i++){ 
 
     if($(columna[i]).css("width") > maxColumna){   
 
     maxColumna = $(columna[i]).css("width"); 
 
     } 
 
    } 
 
    for(i=0; i<columna.length; i++){ 
 
     $(columna[i]).css("width",maxColumna); 
 
    } 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<html> 
 
    <head> 
 
    <meta charset="UTF-8"> 
 
    <title>CORE2017 P3</title> 
 
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
    <script type="text/javascript" src="calculadora.js"></script> 
 
    <link href="calculadora.css" rel="stylesheet" type="text/css" media="all"> 
 
    </head> 
 
    <body onload="igualarBotones();"> 
 
    <header> 
 
     <p>Calculator</p> 
 
    </header> 
 
    <section id="main"> 
 
     <p> 
 
     Número: <input type="text" id="pantalla"> <button id="Limpiar">Limpiar</button> 
 
     </p> 
 

 
     <p> 
 
     <button id="suma" class="columna1">+</button> 
 
     <button id="resta" class="columna2">-</button> 
 
     <button id="cuadrado" class="columna3">x<sup>2</sup></button> 
 
     </p> 
 
     <p> 
 
     <button id="inverso" class="columna1">1/x</button> 
 
     <button id="raiz" class="columna2">sqrt(x)</button> 
 
     <button id="pentera" class="columna3">parte_entera(x)</button> 
 
     </p> 
 
     <p> 
 
     <button id="potencia2" class="columna1">2<sup>x</sup></button> 
 
     <button id="factorial" class="columna2">x!</button> 
 
     <button id="igual" class="columna3">=</button> 
 
     </p> 
 

 

 
    </section> 
 
    </body> 
 
</html>

+0

ボディの読み込み中に関数が定義されていないことを修正する方法を知っていますか? – Luiscri

+0

私はポストを編集して、何を求めているのかを明確にしました。 – Luiscri

+0

@Luiscri関数はjQueryの準備コンテキストで定義されており、グローバルスコープでは使用できません。 https://stackoverflow.com/questions/1055767/why-can-i-not-define-functions-in-jquerys-document-ready – Russell

関連する問題