Eu sunt, folosind un Web Direct Remoting (DWR) bibliotecă JavaScript fișier și sunt obtinerea o eroare numai în Safari (desktop și iPad)
Se spune
Maxim call stack size depășit.
Ce înseamnă mai exact această eroare înseamnă și nu-l opri procesarea complet?
De asemenea, orice fix pentru "Safari" browser-ul (de Fapt pe iPad Safari`, se spune
JS:executarea depășit timeout
care presupun ca este aceeasi stiva de apeluri problema)
Aceasta înseamnă că undeva în codul dvs., vă sunt de asteptare o funcție care, la rândul său, solicită o altă funcție și așa mai departe, până când te-a lovit call stack limita.
Acest lucru este aproape întotdeauna pentru o funcție recursivă cu un caz de bază, care este't fi întâlnit.
Luați în considerare acest cod...
(function a() {
a();
})();
Aici este stivă după o mână de apeluri...
După cum puteți vedea, call stack crește până când se lovește de o limită: browser-ul hardcoded mărimea stack-ului de memorie sau epuizare.
În scopul de a se stabili, a se asigura că dvs. de funcție recursivă are un caz de bază, care este capabil să-l fi cunoscut...
(function a(x) {
// The following condition
// is the base case.
if ( ! x) {
return;
}
a(--x);
})(10);
În cazul meu, am fost trimiterea de elemente de intrare în loc de valorile lor:
$.post( '',{ registerName: $('#registerName') } )
În loc de:
$.post( '',{ registerName: $('#registerName').val() } )
Asta mi-a inghetat Chrome tab la un moment dat l-am't arăta chiar de mi 'Așteptați/Omor' de dialog pentru atunci când pagina a devenit nu raspund...
Există o buclă recursivă undeva în cod (de exemplu, o funcție care, în cele din urmă în sine din nou și din nou, până când stiva este plină).
Alte browsere, fie au stivele mai mare (astfel încât să obțineți un timeout în loc) sau înghițiți de eroare pentru un motiv oarecare (poate un prost plasate try-catch).
Utilizați depanatorul pentru a verifica stiva de apeluri atunci când eroarea se întâmplă.
În cazul meu, am fost convertirea unui mare matrice octet într-un șir utilizând următoarele:
String.fromCharCode.apply(null, new Uint16Array(bytes))
octeți
conținea mai multe milioane de intrări, care este prea mare pentru a încăpea pe stiva.
Problema cu detectarea stackoverflows este uneori stivei va relaxa și ai câștigat't fi capabil de a vedea ceea ce's întâmplă de fapt.
Am'am găsit unele de Chrome's mai noi instrumente de depanare util pentru acest lucru.
Lovit de Performanță tab`, asigurați-vă că Javascript probelor sunt activate și te'll obține ceva de genul asta.
L's destul de evident unde preaplin este aici! Dacă faceți clic pe extendObject
te'll fi capabil de a vedea exact numărul de linie în cod.
Puteți vedea, de asemenea, timpii de care poate sau nu poate fi de ajutor sau un hering roșu.
Un alt truc util dacă puteți't găsi de fapt, problema este de a pune o mulțime de consola.jurnal declarații în cazul în care crezi că e problema. Pasul anterior de mai sus vă poate ajuta cu asta.
În Chrome, dacă aveți în mod repetat de ieșire identice de date se va afișa așa arată în cazul în care problema este mai clar. În acest exemplu stiva lovit 7152 cadre înainte de a în cele din urmă sa prăbușit:
În cazul meu, faceți clic pe evenimentul a fost săditor pe copil element. Deci, am avut de a pune următoarele:
e.stopPropagation()
pe evenimentul click:
$(document).on("click", ".remove-discount-button", function (e) {
e.stopPropagation();
//some code
});
$(document).on("click", ".current-code", function () {
$('.remove-discount-button').trigger("click");
});
Aici este codul html:
<div class="current-code">
<input type="submit" name="removediscountcouponcode" value="
title="Remove" class="remove-discount-button">
</div>
Dacă aveți nevoie de un infinit de proces/recursivitate funcționare pentru un motiv oarecare, puteți utiliza un webworker într-un thread separat. http://www.html5rocks.com/en/tutorials/workers/basics/
dacă doriți pentru a manipula elemente dom și aspira, utilizarea de animație http://creativejs.com/resources/requestanimationframe/
Recent, am adăugat un câmp la un admin-ul suntem de lucru pe - contact_type... simplu nu? Ei bine, dacă te sun selectați "tip" și să încerce să trimită printr-un jquery ajax apel eșuează cu eroarea asta îngropat adânc în jquery.js Don't face acest lucru:
$.ajax({
dataType: "json",
type: "POST",
url: "/some_function.php",
data: { contact_uid:contact_uid, type:type }
});
Problema este că tipul:tip - cred că este ne numirea argument "tip" - având o valoare variabilă numită de tip e't problema. Am schimbat asta:
$.ajax({
dataType: "json",
type: "POST",
url: "/some_function.php",
data: { contact_uid:contact_uid, contact_type:type }
});
Și rescris some_function.php în consecință - a rezolvat problema.
Acest lucru poate provoca, de asemenea, un Maxim de apel mărimea stack-ului a depășit` eroare:
var items = [];
[].push.apply(items, new Array(1000000)); //Bad
La fel și aici:
items.push(...new Array(1000000)); //Bad
De Mozilla Docs:
Dar atenție: la utilizarea aplică în acest fel, tu a alerga riscul de depășire a motor JavaScript's argument limita de lungime. Consecințele aplica o funcție cu prea multe argumente (cred că mai mult decât zeci de mii de argumente) variază de motoare (JavaScriptCore a hard-coded argument limita de 65536), deoarece limita (într-adevăr, chiar natura de orice excesiv de mari-stiva de comportament) este nespecificat. Unele motoare se va arunca o excepție. Mai periculos, altele vor limita în mod arbitrar numărul de argumente de fapt a trecut la aplica funcția. Pentru a ilustra acest ultim caz: dacă un astfel de motor a avut o limită de patru argumente (real limite sunt, desigur, semnificativ mai mare), ar fi ca și cum argumentele 5, 6, 2, 3 a a fost trecut să se aplice în exemplele de mai sus, mai degrabă decât complet matrice.
Deci, încercați:
var items = [];
var newItems = new Array(1000000);
for(var i = 0; i < newItems.length; i++){
items.push(newItems[i]);
}
Aproape fiecare răspuns afirmă că acest lucru poate fi cauzat de o buclă infinită. Ca's nu-i adevărat, ai putea altfel peste-fug stiva prin profund apeluri imbricate (ca să nu spunem că's eficientă, dar's, cu siguranță, în domeniul de posibil). Dacă aveți controlul de JavaScript NEG, puteți ajusta mărimea stack-ului. De exemplu:
nod-stack-size=2000
Vezi de asemenea și: https://stackoverflow.com/questions/11332422/how-can-i-increase-the-maximum-call-stack-size-in-node-js
Știu că acest subiect este vechi, dar cred că's remarcat scenariu am găsit această problemă astfel încât să poată ajuta pe alții.
Să presupunem că aveți elemente imbricate astfel:
<a href="#" id="profile-avatar-picker">
<span class="fa fa-camera fa-2x"></span>
<input id="avatar-file" name="avatar-file" type="file" style="display: none;" />
</a>
Nu poti manipula copilul element de evenimente în interiorul evenimentului de mamă pentru că ea se propagă de la sine, de a face apeluri recursive până excepție este aruncat.
Deci, acest cod nu va reuși:
$('#profile-avatar-picker').on('click', (e) => {
e.preventDefault();
$('#profilePictureFile').trigger("click");
});
Aveți două opțiuni pentru a evita acest lucru:
Ambele invocații de cod identic de mai jos, dacă a scăzut cu 1 muncă în Chrome 32 pe calculatorul meu, de exemplu, 17905 vs 17904. În cazul în care alerga ca se vor produce eroare "RangeError: Maxim call stack size depășit". Se pare a fi această limită nu este hardcoded dar depinde de hardware-ul de masina ta. Se pare că, dacă invocat ca o funcție de auto-impuse limita este mai mare decât în cazul invocat ca o metodă de exemplu acest cod special utilizează mai puțină memorie atunci când este invocată ca o funcție.
Invocat ca o metodă:
var ninja = {
chirp: function(n) {
return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
}
};
ninja.chirp(17905);
Invocat ca o funcție:
function chirp(n) {
return n > 1 ? chirp( n - 1 ) + "-chirp" : "chirp";
}
chirp(20889);
M-am confruntat cu problema similara aici este detalii atunci când încărcarea logo-ul vertical folosind logo-ul de încărcare cutie
<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;
}
înainte de corecție codul meu a fost :
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]);
}
Eroare in consola:
Am rezolvat-o prin scoaterea `onclick="$('#filePhoto').faceți clic pe()" de tag-ul div.
Am fost confruntă cu aceeași problemă Am rezolvat-o prin scoaterea unui nume de câmp care a fost folosit de două ori pe ajax e.g
jQuery.ajax({
url : '/search-result',
data : {
searchField : searchField,
searchFieldValue : searchField,
nid : nid,
indexName : indexName,
indexType : indexType
},
.....