2011-07-18 10 views

risposta

12

Quando ho risolto questo problema, ho inserito tali informazioni come un elemento dati sul tag.

<body data-base="http://mydomain.com"> ... 

e poi utilizzato che nel costruire il corretto URL per una determinata richiesta:

//If pathOrURL is a relative path (e.g. /users/1), then we return a qualified 
// URL, such as http://mydomain.com/users/1 
// otherwise, we return the URL as is 
var qualifyURL = function(pathOrURL) { 
    if (!(new RegExp('^(http(s)?[:]//)','i')).test(pathOrURL)) { 
    return $(document.body).data('base') + pathOrURL; 
    } 

    return pathOrURL; 
}; 

//Use this helper function when calling $.ajax 
$.ajax({ 
    url: qualifyURL(url), ... }); 

Questo ha lavorato molto per la mia esperienza con PhoneGap. Speriamo che questo aiuti.

+0

Grazie. La nostra applicazione funziona anche in modalità Phone Manager e in modalità browser. Quindi non voglio cambiare la generazione di URL e inserire funzioni di supporto aggiuntive. –

+0

Per essere onesti, questo funzionerà bene in entrambi i browser e in PhoneGap. Sta semplicemente facendo esplicitamente quello che stai cercando di fare con preFilter. – ghayes

+0

Il file che avevo era già in uso base href in testa. Quindi ho votato per questo e l'esempio base href. Naturalmente, ho appena preso $ (document.body) .data ('base') da questo esempio. Grazie! – Bretticus

29

Il modo semanticamente corretto per farlo è quello di utilizzare il tag <base>:

<head> 
    <base href="http://mydomain.com/"> 
</head> 

quindi recuperare il valore come questo (purtroppo jQuery.ajax() non raccogliere questo valore automaticamente):

$('head base').attr('href'); 

Elemento riferimento: http://www.w3.org/TR/html4/struct/links.html#edef-BASE

+0

Mentre sono d'accordo che questo è come dovresti fare questo, non mi piace sempre usare la base href in testa. Ho ancora votato per questo e la versione dei dati. Grazie. – Bretticus

+0

Modo pulito per farlo. Ha funzionato alla grande per me. Grazie!! – svrcoder

18

Entrambe le risposte stabiliti hanno gravi inconvenienti. Richiedere una funzione da chiamare per massaggiare l'URL ogni volta che si effettua una richiesta è un sacco di digitazione aggiuntiva. L'aggiunta di un tag di base a una pagina funziona molto spesso, ma causa alcuni problemi se si sta facendo un lavoro pesante con gli SVG. Ecco una soluzione semplice che corregge tutti gli URL contemporaneamente senza utilizzare il tag di base.

var baseUrl = 'http://my.hardcoded.url/'; 
$.ajaxSetup({ 
    beforeSend: function(xhr, options) { 
     options.url = baseUrl + options.url; 
    } 
}) 
+2

questa è una gemma nascosta di una risposta. ottimo se hai a che fare con codice legacy che non hai il controllo delle chiamate $ .ajax – corbin

+1

la risposta è corretta, cosa non funziona in Case la chiamata ajax definisce il callback beforeSend :( – sanjeev

+0

Questo è vero, quindi è necessario inserire questo JavaScript all'inizio del processo di bootstrap per l'applicazione – user393274

Problemi correlati