2

私は codepen.io の演習に取り組んでいますが、入力領域で Enter キーを押すたびにプログラムが再起動する理由がわかりませんが、それを避けるためにいくつかの ifs ステートメントを追加しました。

ここで同じコードをstackoverflowとJavascriptで試しましたが、それ自体は再起動しません。コードペンへのリンクを添付して、実際の問題を確認してください。

http://codepen.io/rafahuelin/pen/qRdWBy?editors=0010

原因は自分の知らないところにあると思います。よろしければ、これが発生する原因と、このプログラムの動作を管理する方法を教えてください。

ありがとう!

$(document).ready(function() {

  // Appears the magnifier icon
  var initializeSearch = false;
  if (initializeSearch === false) {
    initializeSearch = true;
    $("#search").html("<div id='magnifier' class='search-init animated fadeIn'> <div id='magnifier-stick' class='stick-appears'></div> </div>");
    console.log("after #search");


    // When clicking on the icon appears the input form
    var magnifierClicked = false;
    $("#search").on("click", function() {
      if (magnifierClicked === false) {
        magnifierClicked = true;
        $("#magnifier-stick").addClass("animated fadeOut stick-disappears").removeClass("stick-appears");
        console.log("after magnifier-stick");
        $(".search-init").addClass("search-input").removeClass("search-init");
        console.log("after search-init");
        setTimeout(function() { //waits for 1.2s
          $("#search").html("<div id='search-input'><form><input id='input-form' class='animated fadeIn' type='text' name='searchContent' placeholder='Type Your Search Here...'></form></div>");
          console.log("after search-input");
          $("#input-form").focus();
        }, 1200);
      } // if(magnifierClicked === false) 
    });
  } // avoid for looping	if (initializeSearch === false)
  //After pressing Enter, 
  // $("#input-form").keypress("pressedKey", function(pressedKey){
  // 	if(pressedKey === 13){
  // 		//Disable textbox to prevent multiple submit
  //     $("#input-form").attr("disabled", "disabled");
  // 		console.log("key pressed");
  // 	}
  // });

  //send request to API


  //search-input moves up 
  // function moveItUp() {
  // 	$("#input-form").addClass("test");   //.addClass("animated fadeOut stick-disappears").removeClass("stick-appears");
  // }	


  //and the results appear down


}); // $(document).ready
html {
  height: 100%;
}
body {
  position: relative;
  width: 100%;
  height: 100%;
}
.search-init {
  height: 70px;
  width: 70px;
  border: 4px solid green;
  border-radius: 35px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  position: absolute;
  -webkit-animation-duration: 3s;
  -ms-animation-duration: 3s;
  -moz-animation-duration: 3s;
}
#magnifier-stick.stick-appears {
  height: 20px;
  width: 0;
  border: 2px solid green;
  transform: rotate(-45deg);
  top: 54px;
  left: 54px;
  position: absolute;
  transition: all 0.2s ease;
}
.search-input,
#search-input {
  height: 70px;
  width: 570px;
  border: 4px solid green;
  border-radius: 35px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  position: absolute;
  transition: all 400ms 400ms ease;
}
#magnifier-stick.stick-disappears {
  height: 0;
  width: 0;
  border: 2px solid green;
  transform: rotate(-95deg);
  top: 54px;
  left: 54px;
  position: absolute;
  transition: all 200ms ease;
  -webkit-animation-duration: 0.2s;
  -ms-animation-duration: 0.2s;
  -moz-animation-duration: 0.2s;
}
.search-input,
#search-input {
  line-height: 56px;
}
#input-form,
#input-form:focus {
  width: 100%;
  border-radius: 35px;
  outline: none;
  border: none;
  padding-left: 20px;
  padding-right: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="search">
</div>

4

2 に答える 2

2

を使用しているからですforms。スタック スニペットはフォームを送信しません。フォームを送信すると、コンソール、ブラウザー コンソールに次のように表示されます。

フォームのフレームがサンドボックス化されており、「allow-forms」権限が設定されていないため、「」へのフォーム送信がブロックされました。

これは、Stack Snippets に実装されたサンドボックス化されたセキュリティ機能であり、Stack Snippets から個人の Web サイトへのユーザー資格情報とデータの送信を回避します。

ここでフォームを送信してみると、エラーがスローされます。

<form action="">
  <input type="text" />
  <input type="submit" />
</form>

Chrome コンソールで:

コンソール

Stack Overflow ページのソース:

<iframe name="35ff969b-5580-7f20-bd3f-8c9fa41b341a" sandbox="allow-modals allow-scripts" class="snippet-box-edit" frameborder="0"></iframe>
于 2017-01-07T09:05:38.973 に答える
1

コメントでの議論に基づく新しい回答:

OPは尋ねました:

入力エリアでエンターキーを押すたびにプログラムが再起動する理由はわかりませんが、それを避けるためにいくつかの ifs ステートメントを追加しました。

だから私は彼がエンターキーを押したときにフォーム送信を無効にすることについて尋ねていると思いました. OPは、この動作がStackoverflowとCodepenで異なることを発見したためです。彼は Codepen でも同じコンセプトを真似したいと考えていました。

OP は、このコードが機能していなかったため、コメントアウトしました。

 //After pressing Enter, 
  // $("#input-form").keypress("pressedKey", function(pressedKey){
  //    if(pressedKey === 13){
  //        //Disable textbox to prevent multiple submit
  //     $("#input-form").attr("disabled", "disabled");
  //        console.log("key pressed");
  //    }
  // });

その理由は、OPがキーアップ(またはキーダウン)の代わりにキープレスを使用したためです。keypress イベントは、印刷可能な文字を処理します (Enter キーは含まれません)。したがって、私は以下の答えを提案しました。

古い答え:

次のようにフォーム送信を処理できます。

$("#search").on("submit", function() {
    // You can return false to stop it or handle anyway you like
    return false;
});

codepen スニペット: http://codepen.io/anon/pen/RKPQaO

于 2017-01-07T09:08:47.633 に答える