asp.net 페이지에 JavaScript 파일이 이미 포함되어 있는지 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/908425

문제

ASP.NET 사용자 컨트롤 (.ASCX 파일)이 있습니다. 이 사용자 컨트롤에서 .js 파일을 사용하고 싶습니다.

그래서 나는 포함한다 <script src="file.js" type"text/javascript"></script> 페이지에.

그러나 때로는 동일한 스크립트가 이미로드 된 웹 페이지 에서이 사용자 컨트롤을 사용합니다.

어떻게 추가 할 수 있습니까? <script /> 페이지에 페이지가 아직 다른 것을 포함하지 않은 경우에만 페이지에서 렌더링하는 선언 <script /> 같은 스크립트에 대한 태그?

도움이 되었습니까?

해결책

ASP.NET을 사용하면 JavaScript 파일에 대한 참조를 추가하기로 선택한 위치에있어서 Server 측면을 수행하는 것이 합리적입니다. .ASCX 파일에서 다음에 등록 할 수 있습니다.

this.Page.ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

... 페이지에서 ClientScript 객체를 직접 호출합니다.

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

'GlobalUniqueKey'는 모든 문자열이 될 수 있습니다 (나는 이것에 대해 JavaScript 파일의 URL을 사용합니다).

동일한 키 문자열로 스크립트를 등록하려고하면 아무것도하지 않습니다. 따라서 페이지, 컨트롤 또는 다른 곳에서이를 호출하면 페이지에서 하나의 참조만으로 끝납니다. 이것의 이점은 페이지에 여러 개의 제어 인스턴스를 가질 수 있다는 것입니다. 모두 동일한 스크립트를 등록하려고하더라도 최대 한 번만 수행됩니다. 그리고 그들 중 누구도 이미 등록 된 스크립트에 대해 걱정할 필요가 없습니다.

스크립트가 해당 키에 이미 포함되어 있는지 확인하는 데 사용할 수있는 'isclientscriptIncluderEgistered (stringkey)'메소드가 있지만 등록하려는 여러 시도로 등록하기 전에 예외를 제외하지 않거나 다른 원인을 유발하기 전에 확인하는 것은 상당히 중복되는 것 같습니다. 오류.

확인 클라이언트 측면을 수행한다는 것은 여러 JavaScript 참조가 브라우저에 의해 캐시되었다고 가정 할 때 (그렇지 않을 수 있음), 여전히 여러 개의 태그가 있고 각각의 헤드는 일부 JavaScript를 실행하게한다는 것을 의미합니다. 페이지에 20 개의 제어 인스턴스가 있으면 심각한 문제가 발생할 수 있습니다.

다른 팁

클라이언트 측면 두 가지 중 하나를 할 수 있습니다 ...

  1. 확인하려는 JavaScript 파일에 해당하는 스크립트 태그의 DOM을 확인하십시오.
  2. 정의되지 않은 경우 JavaScript 파일 내에있는 변수 또는 함수를 테스트하십시오.

다음은 JQuery를 사용하여 필요한 작업을 수행하는 빠른 JS 기능입니다.

function requireOnce(url) {    
    if (!$("script[src='" + url + "']").length) {
        $('head').append("<script type='text/javascript' src='" + url + "'></script>"); 
    }
}

다음과 같은 것을 사용하십시오.

if(typeof myObjectOrFunctionDecalredInThisScript != 'undefined') {
  // code goes here
  var myObjectOrFunctionDecalredInThisScript = { };
}

이는 객체 나 기능이 이미 존재하는 경우 테스트하므로 재검토를 방지합니다.

var storePath = [];
function include(path){
if(!storePath[path]){
    storePath[path]= true;
    var e = document.createElement("script");
    e.src = path;
    e.type = "text/javascript";
    document.getElementsByTagName("head")[0].appendChild(e);
    return false;
 } }

메인 페이지에서 이것을 사용하고 호출 기능을 사용하십시오 포함 인수 JavaScript 파일 이름

사이트의 한 페이지에만 JavaScript를 포함 시키려고합니다.
asp.net (4.0)을 사용하면 매우 쉽습니다.
다음 코드 만 포함하십시오

<script type="text/javascript" scr="filepath and name here"></script>

안에 ContentPlaceHolder 콘텐츠 페이지.

@shimmy 나는 오랫동안 이것을 만나고 있지만 아마도 여전히 유용하거나 적어도 다른 사람들이 뒤에서 오는 것을 도울 수 있습니다. jQuery가 이미로드되었는지 확인하려면이 작업을 수행하십시오

<script>window.jQuery || document.write('<script src="js/libs/jquery-1.x.x.min.js"><\/script>')</script>

문서에서 닫는 스크립트 태그에서 탈출 문자를 놓치지 마십시오.

@mysomic, 왜 내가 그것을 생각하지 않았습니까? 엄지 손가락

추신 : @shimmy가 jQuery 자체가로드하고 싶은 스크립트라고 썼던 줄 바로 아래에 이것을 쓰고 싶었을 것입니다. 그러나 거기에 글을 쓰는 방법을 모릅니다. 답장이나 유사한 링크를 볼 수 없습니다. 이것은 멍청하게 들릴지 모르지만 아마도 뭔가 빠졌을 수도 있습니다. pls는 그것을 지적합니다.

서버 측에서 필요한 경우, page.clientscript.registerClientscriptInclude가 다른 방법으로 포함 된 경우에 따라 작동하지 않는 경우 page.clientscript.registerClientscript (예 : page.header.controls.add (..). , 당신은 다음과 같은 것을 사용할 수 있습니다.

static public void AddJsFileToHeadIfNotExists(Page page, string jsRelativePath)
{
    foreach (Control ctrl in page.Header.Controls)
    {
        if (ctrl is HtmlLink htmlLink)
        {
            if (htmlLink.Href.ToLower().Contains(jsRelativePath.ToLower())) return;
        }
        if (ctrl is ITextControl textControl
          && (textControl is LiteralControl || textControl is Literal))
        {
            if (textControl.Text.ToLower().Contains(jsRelativePath.ToLower())) return;
        }
        if (ctrl is HtmlControl htmlControl)
        {
            if (htmlControl.Attributes["src"]?.ToUpper()
              .Contains(jsRelativePath.ToUpper())) return;
        }
    }

    HtmlGenericControl Include = new HtmlGenericControl("script");
    Include.Attributes.Add("type", "text/javascript");
    Include.Attributes.Add("src", page.ResolveUrl(jsRelativePath));
    page.Header.Controls.Add(Include);    
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top