Resolución de URL relativas en JavaScript

Estoy construyendo una biblioteca JS que tiene un requisito de mirar los valores de form [action] y a [href] y resolverlos en direcciones URL absolutas.

Por ejemplo, estoy en http: // a / b / c / d; p? Q y encuentro un valor href de "../g" (supongo que no hay elemento <base>). El valor absoluto resultante sería: http: // a / b / g .

¿Hay una biblioteca JS que hace esto ya? Tendría que creer eso.

Para get más información acerca de lo que se necesita, la especificación: http://tools.ietf.org/html/rfc3986#section-5.4

Resulta que el atributo .href de un elemento A (no .getAttribute('href') , sino .href ) devuelve el URL resuelto (absoluto).

Buena solución JS pura que funciona sin DOM: https://gist.github.com/1088850 (funciona en todas partes, pero especialmente útil para JS del lado del server).

En los browseres modernos, el constructor de URL incorporado maneja esto:

 u = (new URL("?newSearch", "http://a.example/with/a/long/path.file?search#fragment")).href 

(produce http://a.example/with/a/long/path.file?newSearch )

Si desea que la base sea relativa al documento actual, puede hacerlo explícitamente:

 u = (new URL("?newSearch", document.location)).href 

El object URL también le da acceso a todos los componentes de la URL (protocolo, host, ruta, búsqueda, hash, etc.).