Estoy tratando de permitir que el usuario abra una pestaña para seguir permitiéndole usar el sistema mientras la pestaña actual realiza alguna solicitud al servidor.
así que abro una nueva pestaña y trato de usar $(window).load() o $(window.document).ready() para hacer clic en algún elemento cuando los elementos estén listos. Al probarlo con una solicitud de servidor grande, la ventana solo se carga cuando la solicitud ajax regresa con el resultado y finaliza la función exitosa aunque debería ser asíncrona. Me encantaría algunas ideas de por qué está sucediendo. g_SearchHandler.SearchPleaseWait(true); está llamando cubriendo la pantalla con un gif en espera y llamando a displayNewTab() que abre una nueva pestaña.
código para abrir una nueva pestaña:
displayInNewTab: function(){ try { var w = window.open(href = "/prod/php/home.php"); var loadingFunc = function(){ var devices = w.document.querySelector(`.sidebar-segment[data-segment-name="DEVICES"]`); var selDevice = getSelectedDeviceTreeData(); if(!selDevice){ return; } var selDeviceObj = w.document.getElementById(selDevice.name); //when the window is loaded keep trying until elements are available for clicking. if(devices && selDeviceObj){ devices.click() w.ClickOnItem(selDevice.name, false, true) }else{ setTimeout(loadingFunc,1000); } } $(w.document).ready(loadingFunc); }catch (e){ console.error(e) } }g_SearchHandler.SearchPleaseWait(verdadero); solicitud de ajax:
$.ajax({ type : "POST", dataType : "json", url : "commands.php", data : params, success : function(objJSON) { DisplayResults(objJSON); g_SearchHandler.SearchPleaseWait(false); } });Aparentemente sucedió porque la página tardó un tiempo en solicitar los recursos al servidor, por lo que el servidor atendió primero la solicitud ajax, y la solicitud de los recursos de la página estaba en una cola y se atendió después de que se realizó la solicitud ajax.
un parche rápido fue insertar la solicitud ajax en setTimeout() para que la nueva página primero haga una solicitud de los recursos y solo luego se envíe la solicitud ajax.
p.ej:
setTimeout(function(){ $.ajax({ type : "POST", dataType : "json", url : "commands.php", data : params, success : function(objJSON) { DisplayResults(objJSON); g_SearchHandler.SearchPleaseWait(false); } }) },5000);EDITAR
He buscado algunas soluciones mejores cuando me di cuenta de cuál es el problema.
dos soluciones era:
1. obtener los recursos de la página antes de abrir la pestaña y solo luego realizar la solicitud ajax
$.get("/prod/php/home.php") .done(function(){ // open new tab with fetched resources. //make ajax call here. })session_write_close(); Hizo el truco.