661

Direct Web Remoting (DWR) JavaScript ライブラリ ファイルを使用していますが、Safari (デスクトップおよび iPad) でのみエラーが発生します。

それは言う

最大呼び出しスタック サイズを超えました。

このエラーは正確には何を意味し、処理が完全に停止しますか?

Safariまた、ブラウザの修正(実際にはiPad Safari、それは言う

JS:実行がタイムアウトを超えました

これは同じコール スタックの問題であると想定しています)

4

35 に答える 35

765

これは、コードのどこかで、コール スタックの制限に達するまで、別の関数を呼び出す関数を呼び出していることを意味します。

これはほとんどの場合、基本ケースが満たされていない再帰関数が原因です。

スタックの表示

このコードを検討してください...

(function a() {
    a();
})();

いくつかの呼び出しの後のスタックは次のとおりです...

Web インスペクター

ご覧のとおり、コール スタックは制限に達するまで増加します。つまり、ブラウザーのハードコードされたスタック サイズまたはメモリの枯渇です。

それを修正するには、再帰関数に満たすことができる基本ケースがあることを確認してください...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
于 2011-05-23T10:05:44.163 に答える
95

同じ JavaScript ファイルを誤って 2 回インポート/埋め込みした場合に、これが発生することがあります。インスペクターの [リソース] タブで確認する価値があります。

于 2012-04-23T01:58:01.333 に答える
89

私の場合、値の代わりに入力要素を送信していました。

$.post( '',{ registerName: $('#registerName') } )

それ以外の:

$.post( '',{ registerName: $('#registerName').val() } )

これにより、Chromeタブがフリーズし、ページが応答しなくなったときの「待機/強制終了」ダイアログさえ表示されませんでした...

于 2016-08-13T23:55:35.887 に答える
34

コードのどこかに再帰ループがあります(つまり、スタックがいっぱいになるまで、最終的に何度も何度も呼び出す関数)。

他のブラウザは、スタックが大きいか(代わりにタイムアウトが発生します)、何らかの理由でエラーを飲み込んでしまいます(try-catchの配置が不適切な場合があります)。

エラーが発生した場合は、デバッガーを使用して呼び出しスタックを確認してください。

于 2011-05-23T09:55:25.313 に答える
5

何らかの理由で無限のプロセス/再帰を実行する必要がある場合は、別のスレッドでWebworkerを使用できます。 http://www.html5rocks.com/en/tutorials/workers/basics/

dom要素を操作して再描画する場合は、アニメーション http://creativejs.com/resources/requestanimationframe/を使用してください。

于 2012-11-15T05:41:49.263 に答える
5

Chrome dev ツールバー コンソールでエラーの詳細を確認してください。これにより、コール スタック内の関数が表示され、エラーの原因となっている再帰へと導かれます。

于 2012-05-28T08:48:19.557 に答える
2

私の場合、2 つの jQuery モーダルが重なり合って表示されていました。それを防ぐことで私の問題は解決しました。

于 2016-12-28T21:23:29.563 に答える
1

私も同様の問題に直面しました ここでは、ドロップダウンロゴアップロードボックスを使用してロゴをアップロードするときの詳細です

<div>
      <div class="uploader greyLogoBox" id="uploader" flex="64" onclick="$('#filePhoto').click()">
        <img id="imageBox" src="{{ $ctrl.companyLogoUrl }}" alt=""/>
        <input type="file" name="userprofile_picture"  id="filePhoto" ngf-select="$ctrl.createUploadLogoRequest()"/>
        <md-icon ng-if="!$ctrl.isLogoPresent" class="upload-icon" md-font-set="material-icons">cloud_upload</md-icon>
        <div ng-if="!$ctrl.isLogoPresent" class="text">Drag and drop a file here, or click to upload</div>
      </div>
      <script type="text/javascript">
          var imageLoader = document.getElementById('filePhoto');
          imageLoader.addEventListener('change', handleImage, false);

          function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {

                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }
      </script>
      </div>

CSS.css

.uploader {
  position:relative;
  overflow:hidden;
  height:100px;
  max-width: 75%;
  margin: auto;
  text-align: center;

  img{
    max-width: 464px;
    max-height: 100px;
    z-index:1;
    border:none;
  }

  .drag-drop-zone {
    background: rgba(0, 0, 0, 0.04);
    border: 1px solid rgba(0, 0, 0, 0.12);
    padding: 32px;
  }
}

.uploader img{
  max-width: 464px;
  max-height: 100px;
  z-index:1;
  border:none;
}



.greyLogoBox {
  width: 100%;
  background: #EBEBEB;
  border: 1px solid #D7D7D7;
  text-align: center;
  height: 100px;
  padding-top: 22px;
  box-sizing: border-box;
}


#filePhoto{
  position:absolute;
  width:464px;
  height:100px;
  left:0;
  top:0;
  z-index:2;
  opacity:0;
  cursor:pointer;
}

修正前の私のコードは次のとおりです。

function handleImage(e) {
              var reader = new FileReader();
              reader.onload = function (event) {
                  onclick="$('#filePhoto').click()"
                  $('.uploader img').attr('src',event.target.result);
              }
              reader.readAsDataURL(e.target.files[0]);
          }

コンソールのエラー:

ここに画像の説明を入力

onclick="$('#filePhoto').click()"divタグから削除することで解決しました。

于 2017-08-03T08:37:59.827 に答える
1

同じ問題に直面していましたが、ajax で 2 回使用されたフィールド名を削除することで解決しました。

    jQuery.ajax({
    url : '/search-result',
    data : {
      searchField : searchField,
      searchFieldValue : searchField,
      nid    :  nid,
      indexName : indexName,
      indexType : indexType
    },
.....
于 2017-11-08T07:57:42.447 に答える
1

私の場合の問題は、親と同じパスを持つ子ルートがあるためです。

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: '', redirectTo: 'home', pathMatch: 'prefix' },
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];

そのため、子供ルートの行を削除する必要がありました

const routes: Routes = [
  {
    path: '',
    component: HomeComponent,
    children: [
      { path: 'home', loadChildren: './home.module#HomeModule' },
    ]
  }
];
于 2018-07-25T17:06:02.237 に答える
0

私の場合、誤って同じ変数名を割り当ててしまい、val 関数 "class_routine_id" に

var class_routine_id = $("#class_routine_id").val(class_routine_id);

次のようにする必要があります:

 var class_routine_id = $("#class_routine_id").val(); 
于 2020-01-05T16:09:20.680 に答える
0

同じ名前の 2 つの JS 関数があったため、このエラーが発生しました

于 2018-01-05T12:33:54.313 に答える