2008-09-20 3 views
18

자바 스크립트 파일에 쿼리를 다시 보내야하는 코드가 있습니다. 문제는 내가 속한 스크립트의 URL을 어떻게 찾습니까? 아약스에 대한 적절한 요청 URL을 작성할 수 있습니다. 항상 /data.json에서 요청해야합니다 동안자바 스크립트 파일의 상대 URL

즉이 같은 스크립트, /, /help, /whatever, 등등에 포함되어 있습니다. 또한 동일한 사이트가 다른 서버에서 실행되며 / - 폴더가 다르게 배치 될 수 있습니다. 나는 자바 스크립트 파일 (ez-publish 템플릿)을 포함하는 상대 URL을 해결할 수있는 방법을 가지고 있지만 javascript 파일 자체에서는이를 해결할 방법이 없습니다.

여기에 만들어진 모든 브라우저에서 작동 할 작은 스크립트가 있습니까?

답변

23

이렇게하려면 <link> 요소를 페이지의 <head>에 넣고 요청에 사용할 URL을 포함 시키십시오.

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

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

가되어 함께 자바 스크립트 검색 할 수 있습니다 :

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

물론 아. 가장 간단한 답변을 놓친 것 같습니다 :). – Staale

+0

이것은 링크 태그를 잘 사용합니다. –

+0

나는 모든 스크립트 태그를 통과하고 내 자신의 스크립트를 찾고있는 솔루션을 imganing했다. 이것은 훨씬 쉽습니다. – Staale

3

document.location.href은 현재 URL을 제공하며 JavaScript의 문자열 기능을 사용하여 조작 할 수 있습니다.

+0

웹 응용 프로그램 루트 (서버마다 다를 수 있음)를 찾아야하므로 유용하지 않습니다 (이 경우 개발자 컴퓨터 설정). – Staale

+0

webapp는 어떤 서버 측 기술을 사용합니까? 이 경우에는 –

+0

아파치, PHP 및 ez-publish. 그러나 나는 servseride 기술을 불문하고 일할 순수한 자바 스크립트를 원한다. – Staale

3

가있어 그들이 항상 옳은보기를 가리 그래서 그들은 당신의 서버 측 언어에 의해 발생 될 수 있습니다 서버 구성에 대한 지식이 없으므로 클라이언트가 웹 응용 프로그램 루트를 확인할 수있는 방법이 없습니다. 넌 할 수있어 하나의 옵션 (그래서 각 서버의 관련 URL을 표시)을 생성하기 위해 서버를보다 동적보다는 하드 코딩, 헤드 요소 내에 기본 요소를 사용하는 것입니다

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

모든 URL은 다음 것이다 이것에 상대적으로 취급되어야한다. 따라서 /data.json에 요청하면됩니다. 그러나 응용 프로그램의 다른 모든 링크에서이를 염두에 두어야합니다.

/** 
* 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이 구성 옵션을 포함하는 글로벌 배열 :

+0

이 요소처럼 보이는 것이이 질문의 문제를 해결하기위한 것입니다. MDN은 잘 지원된다고 말합니다 : https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base – Phil

+0

' '을 보면 좀 더 중요한주의 사항이 있습니다. 알고 있어야합니다. '와 같은 앵커 링크는 예를 들어 깨질 것입니다. 참조 : http://stackoverflow.com/a/1889898/1299695 – Phil

0

는 내 도서관에서 다음 코드의 주요 진입 점 (main.php)를 포함한다. 따라서 site_suffix는 개발 상자의 "/ sites_working/thesite/public_html"과 가상 호스트 (도메인 이름)가있는 서버의 "/"와 같습니다.

누군가가 개발 상자의 IP 주소를 입력하면 동일한 IP 주소를 사용하여 "localhost"와 같은 URL 대신 javascript 폴더의 경로를 작성하기 때문에이 방법도 유용합니다. "localhost"는 "localhost"를 사용하여 URL을 작성합니다.

또한 SSL을 감지하기 때문에 서버에 SSL 지원을 추가 한 경우 날씨가 걱정되지 않아 리소스가 HTTP 또는 HTTPS를 통해 전송됩니다.

그런 다음, 템플릿,

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

또는

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

나는 후자가 더 빠른 것 가정 사용 중.

2

스크립트가 자신의 파일 이름을 알고 있으면 문서를 사용할 수 있습니다. getElementsByTagName(). 귀하의 스크립트와 일치하는 스크립트를 찾을 때까지리스트를 반복하고 전체 (또는 상대) URL을 추출하십시오.

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')); 

이 방법은 파일 이름 충돌 적용하고 있음을 고려 :

다음은 예입니다.

+0

차가움. 그러나 src 속성이없는 스크립트는 중단됩니다. 조건을'if (src && src.match (re))'로 조정하면 작동합니다. 코드를 보내 주셔서 감사합니다! –

+0

좋은 해결책. 얼마나 신뢰할 수있는 크로스 브라우저인가? – dkamins