Pregunta

Tengo un código en un archivo javascript que necesita enviar consultas al servidor.La pregunta es, ¿cómo encuentro la URL del script en el que estoy para poder crear una URL de solicitud adecuada para ajax?

Es decir, el mismo guión se incluye en /, /help, /whatever, y así sucesivamente, aunque siempre será necesario solicitarlo a /data.json.Además, el mismo sitio se ejecuta en diferentes servidores, donde el /-La carpeta puede estar ubicada de manera diferente.Tengo medios para resolver la URL relativa donde incluyo Javascript (plantilla ez-publish), pero no dentro del archivo javascript en sí.

¿Existen pequeños scripts que funcionen en todos los navegadores creados para esto?

¿Fue útil?

Solución

Para esto me gusta poner <link> elementos en la página <head>, que contiene las URL que se utilizarán para las solicitudes.Pueden ser generados por el lenguaje del lado del servidor para que siempre apunten a la vista correcta:

<link id="link-action-1" href="${reverse_url ('action_1')}"/>

se convierte

<link id="link-action-1" href="/my/web/root/action-1/"/>

y puede recuperarse mediante Javascript con:

document.getElementById ('link-action-1').href;

Otros consejos

document.location.href le dará la URL actual, que luego podrá manipular usando las funciones de cadena de JavaScript.

No hay forma de que el cliente pueda determinar la raíz de la aplicación web sin que el servidor se lo indique, ya que no tiene conocimiento de la configuración del servidor.Una opción que puede probar es usar el elemento base dentro del elemento principal, haciendo que el servidor lo genere dinámicamente en lugar de codificarlo (para que muestre la URL relevante para cada servidor):

<base href="http://path/to/webapp/root/" />

Todas las URL se tratarán entonces como relativas a esto.Por lo tanto, simplemente deberá realizar su solicitud a /data.json.Sin embargo, debe asegurarse de que todos los demás enlaces de la aplicación tengan esto en cuenta.

Si el script conoce su propio nombre de archivo, puede utilizar document.getElementsByTagName().Repita la lista hasta que encuentre el script que coincida con el suyo y extraiga la URL completa (o relativa) de esa manera.

He aquí un ejemplo:

function getScriptUrl ( name ) {
    var scripts = document.getElementsByTagName('script');
    var re = RegExp("(\/|^)" + name + "$");
    var src;
    for( var i = 0; i < scripts.length; i++){
        src = scripts[i].getAttribute('src');
        if( src.match(re) )
            return src;
    }
    return null;
}

console.log( 'found ' + getScriptUrl('demo.js') );

Tenga en cuenta que este enfoque está sujeto a colisiones de nombres de archivos.

Incluyo el siguiente código en el punto de entrada principal de mi biblioteca (main.php):

/**
 * Build current url, depending on protocal (http/https),
 * port, server name and path suffix
 */
$site_root = 'http';
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") 
    $site_root .= "s";
$site_root .= "://" . $_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80")
    $site_root .= ":" . $_SERVER["SERVER_PORT"];
$site_root .= $g_config["paths"]["site_suffix"];

$g_config["paths"]["site_root"] = $site_root;

$g_config es una matriz global que contiene opciones de configuración.Entonces site_suffix podría verse así:"/sites_working/thesite/public_html" en su cuadro de desarrollo y simplemente "/" en un servidor con un host virtual (nombre de dominio).

Este método también es bueno, porque si alguien escribe la dirección IP de su cuadro de desarrollo, usará esa misma dirección IP para crear la ruta a la carpeta javascript en lugar de algo como "localhost", y si usa "localhost" utilizará "localhost" para construir la URL.

Y como también detecta SSL, no tendrá que preocuparse por si sus recursos se enviarán a través de HTTP o HTTPS si alguna vez agrega soporte SSL a su servidor.

Luego, en su plantilla, use

<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/>

O

<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>

Supongo que esto último sería más rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top