¿Cómo puedo ignorar la ventana.onpopstate en la carga de la página? -- javascript campo con jquery campo con html camp Relacionados El problema

How can I ignore window.onpopstate on page load?


39
vote

problema

Español

Estoy jugando con window.onpopstate , y hay una cosa que me molesta un poco:

Los navegadores tienden a manejar el evento PopState de manera diferente en la carga de la página. Chrome y Safari siempre emiten un evento de Popstate en la carga de la página, pero Firefox no.

fuente

Lo probé, y sí, en Chrome y Safari 5.1+, el evento Popstate se enciende en la carga de la página, pero no en Firefox o IE10.

El problema es que quiero escuchar solo a popstate Eventos donde el usuario hizo clic en el botón Atrás o hacia adelante (o el historial fue cambiado a través de javascript), pero no quiere hacer nada en Pageload.

Por otras palabras, quiero diferenciar el evento popstate de Carga de página desde el otro popstate Eventos.

Esto es lo que intenté hasta ahora (estoy usando jQuery):

  git subtree pull0  

Básicamente, trato de unir mi función a git subtree pull2 lo suficientemente tarde como para no estar enlazado en la carga de la página, solo más tarde.

Esto parece funcionar, sin embargo, no me gusta esta solución. Quiero decir, ¿cómo puedo estar seguro de que el TimeOut elegido para Settimeout es lo suficientemente grande, pero no demasiado grande (porque no quiero que espere demasiado).

¡Espero que haya una solución más inteligente!

Original en ingles

I'm playing with window.onpopstate, and there is a thing that annoys me a little bit:

Browsers tend to handle the popstate event differently on page load. Chrome and Safari always emit a popstate event on page load, but Firefox doesn't.

source

I tested it, and yeah, in Chrome and Safari 5.1+ the popstate event is fired on page load, but not in Firefox or IE10.

The problem is, that I want to listen only to popstate events where user clicked the back or forward button (or the history was changed via javascript), but don't want to do anything on pageload.

By other words I want to differentiate the popstate event from page load from the other popstate events.

This is what I tried so far (I'm using jQuery):

$(function() {   console.log('document ready');    setTimeout(function() {     window.onpopstate = function(event) {       // Do something here     }, 10); }); 

Basically I try to bind my listener function to popstate late enough to be not bound on page load, only later.

This seems to work, however, I don't like this solution. I mean, how can I be sure that the timeout chosen for setTimeout is big enough, but not too big (because I don't want it to wait too much).

I hope there is a smarter solution!

        
     
     

Lista de respuestas

44
 
vote
vote
La mejor respuesta
 

Compruebe la verdad booleana de const UNLEN = 256; // Maximum user name length function GetWindowsUsername: string; var UserName : string; UserNameLen : Dword; begin UserNameLen := UNLEN; SetLength(UserName, UserNameLen) ; if GetUserName(PChar(UserName), UserNameLen) then Result := Copy(UserName, 1, UserNameLen - 1) else Result := ''; end; 7 en const UNLEN = 256; // Maximum user name length function GetWindowsUsername: string; var UserName : string; UserNameLen : Dword; begin UserNameLen := UNLEN; SetLength(UserName, UserNameLen) ; if GetUserName(PChar(UserName), UserNameLen) then Result := Copy(UserName, 1, UserNameLen - 1) else Result := ''; end; 8 HANDERADOR:

  const   UNLEN = 256; // Maximum user name length  function GetWindowsUsername: string; var   UserName : string;   UserNameLen : Dword; begin   UserNameLen := UNLEN;   SetLength(UserName, UserNameLen) ;   if GetUserName(PChar(UserName), UserNameLen)   then Result := Copy(UserName, 1, UserNameLen - 1)   else Result := ''; end; 9  

Para asegurarse de que esto funcionará, siempre especifique un argumento de estado no orderNode **processQueue = malloc(sizeof(orderNode)*numcats) ; 20 cuando llame uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 1 o uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 2 . Además, considere usar una biblioteca de envoltura como Historia.js que proporciona un comportamiento consistente en todos los navegadores.

 

Check for boolean truth of event.state in popstate event handler:

window.addEventListener('popstate', function(event) {     if (event.state) {         alert('!');     } }, false); 

To ensure this will work, always specify a non-null state argument when calling history.pushState() or history.replaceState(). Also, consider using a wrapper library like History.js that provides consistent behavior across browsers.

 
 
         
         
7
 
vote

Tuve un problema similar y tuve que validar para asegurarme de que la página se cargó completamente.

Usé algo como esto:

  uses   TlHelp32;  type   TCardinalArray = array of Cardinal;  function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var   ContinueLoop: boolean;   FSnapshotHandle: THandle;   FProcessEntry32: TProcessEntry32;   UserName : string;   DomainName : string;   CurrentUser : string; begin   CurrentUser := GetWindowsUsername();    SetLength(Result, 0);   FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   FProcessEntry32.dwSize := SizeOf(FProcessEntry32);   ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);   while(ContinueLoop) do   begin     if(SameText(FProcessEntry32.szExeFile, AProcessName)) then     begin       if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then       begin         if(UserName = CurrentUser) then         begin           SetLength(Result, Length(Result) + 1);           Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID;         end;       end;     end;     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);   end;   CloseHandle(FSnapshotHandle); end; 3  
 

I had a similar problem and i had to validate to make sure if page was loaded completely.

I used something like this :

var page_loaded = false;     window.onpopstate = function(event){     if(!page_loaded){        page_loaded = true;        return false;      }     //Continue With Your Code } 
 
 
         
         
5
 
vote

Para reaccionar en el evento uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 4 , debe presionar algún estado al historial de sesión.

Por ejemplo, agregue esta línea a la sección Ready Document:

  uses   TlHelp32;  type   TCardinalArray = array of Cardinal;  function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var   ContinueLoop: boolean;   FSnapshotHandle: THandle;   FProcessEntry32: TProcessEntry32;   UserName : string;   DomainName : string;   CurrentUser : string; begin   CurrentUser := GetWindowsUsername();    SetLength(Result, 0);   FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   FProcessEntry32.dwSize := SizeOf(FProcessEntry32);   ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);   while(ContinueLoop) do   begin     if(SameText(FProcessEntry32.szExeFile, AProcessName)) then     begin       if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then       begin         if(UserName = CurrentUser) then         begin           SetLength(Result, Length(Result) + 1);           Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID;         end;       end;     end;     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);   end;   CloseHandle(FSnapshotHandle); end; 5  

No es ideal, pero también funciona en Chrome, Firefox y otros navegadores.

Luego, el evento se enciende correctamente cuando el usuario hace clic en el botón Atrás o hacia adelante , también cuando 99887776626 , uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 7 , uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 8 Los métodos se llaman manualmente. Cada vez que se invocó uses TlHelp32; type TCardinalArray = array of Cardinal; function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray; var ContinueLoop: boolean; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; UserName : string; DomainName : string; CurrentUser : string; begin CurrentUser := GetWindowsUsername(); SetLength(Result, 0); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while(ContinueLoop) do begin if(SameText(FProcessEntry32.szExeFile, AProcessName)) then begin if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then begin if(UserName = CurrentUser) then begin SetLength(Result, Length(Result) + 1); Result[Length(Result) - 1] := FProcessEntry32.th32ProcessID; end; end; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; 9 , tiene que volver a empujar otro estado para que funcione.

Ver también:

  • Aplicaciones de una sola página y HTML5 PushState
  • Cómo detectar el evento del botón Back Back Browser - Browser cruzado
 

To react on popstate event, you need to push some state onto the session history.

For example add this line to the document ready section:

history.pushState(null, null, window.location.pathname); 

Not ideal, but it works in Chrome, Firefox and other browsers as well.

Then the event is fired correctly when user clicks on Back or Forward button, also when history.back(), history.forward(), history.go() methods are called manually. Each time when popstate has been invoked, you have to push another state again to make it working.

See also:

  • Single-Page Apps and HTML5 pushState
  • How to Detect Browser Back Button event - Cross Browser
 
 
2
 
vote

Parece que ninguno de los navegadores está emitiendo el evento en la carga de la página más de hoy:

Los navegadores utilizados para manejar el evento PopState de manera diferente en la carga de la página, pero ahora se comportan de la misma manera. Firefox nunca emitió un evento de Popstate en la carga de la página. Chrome hizo hasta la versión 34, mientras que Safari hizo hasta la versión 10.0.

Fuente: https://developer.mozilla.org/en -US / DOCS / WEB / API / POPSTATEEVENTE

 

It seems none of the browsers are emitting the event on page load any more as of today:

Browsers used to handle the popstate event differently on page load, but now they behave the same. Firefox never emitted a popstate event on page load. Chrome did until version 34, while Safari did until version 10.0.

Source: https://developer.mozilla.org/en-US/docs/Web/API/PopStateEvent

 
 

Relacionados problema

5  Cómo alinear verticalmente una tabla en CSS  ( How to vertically align a table in css ) 
¿Cómo puedo alinear verticalmente una tabla en el centro de la pantalla con CSS? ...

80  ¿Cómo imprimo un documento HTML de un servicio web?  ( How do i print an html document from a web service ) 
Quiero imprimir HTML desde un servicio web C #. El control del navegador web está exagerado, y no funciona bien en un entorno de servicio, ni funciona bien en...

273  Múltiples botones de envío en un formulario HTML  ( Multiple submit buttons in an html form ) 
Digamos que crea un asistente en un formulario HTML. Un botón se remonta, y uno avanza. Dado que el botón Atrás aparece primero en el marcado cuando presion...

635  Determinar la zona horaria de un usuario  ( Determine a users timezone ) 
¿Hay una forma estándar para que un servidor web pueda determinar la zona horaria de un usuario dentro de una página web? Tal vez de un encabezado HTTP o pa...

76  Cómo romper la palabra después de un carácter especial como guiones (-)  ( How to break word after special character like hyphens ) 
Dado un CSS relativamente simple: div { width: 150px; } <div> 12333-2333-233-23339392-332332323 </div> ¿Cómo lo hago para que la cade...

303  ¿Por qué el ancho se colapsó en el elemento secundario del ancho porcentual en un padre absolutamente posicionado en Internet Explorer 7?  ( Why did the width collapse in the percentage width child element in an absolutel ) 
Tengo un double8 que contiene varios niños, uno de los cuales es un 99887776669 relativamente posicionado. Cuando uso un Form0 en el niño Form111111 , ...

4  ¿Cuál es el futuro de la web? Xhtml 2, html 5, o otra cosa?  ( Whats the future of the web xhtml 2 html 5 or something else ) 
Estoy confundido por la discusión y el avance de una nueva versión de HTML y una nueva versión de XHTML. ¿Son competidores? Si es así, ¿qué es lo más probable...

31  ¿Cómo doy a mis sitios web un icono para iPhone?  ( How do i give my websites an icon for iphone ) 
¿Cómo configuro el icono que aparece adecuado en el iPhone para los sitios web que he creado? ...

0  Deshacerse del disco en el artículo de la lista  ( Getting rid of disc in list item ) 
Estoy desarrollando un sitio usando jquery, y jquery ui Tabs. Por alguna razón, mis pestañas (lista desordenada) están mostrando sus balas en todos los navega...

142  ¿Cómo detectar cuál de las fuentes definidas se utilizó en una página web?  ( How to detect which one of the defined font was used in a web page ) 
Supongamos que tengo la siguiente regla de CSS en mi página: body { font-family: Calibri, Trebuchet MS, Helvetica, sans-serif; } ¿Cómo podría detec...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos