asp.net 페이지에 JavaScript 파일이 이미 포함되어 있는지 어떻게 알 수 있습니까?
-
05-09-2019 - |
문제
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 개의 제어 인스턴스가 있으면 심각한 문제가 발생할 수 있습니다.
다른 팁
클라이언트 측면 두 가지 중 하나를 할 수 있습니다 ...
- 확인하려는 JavaScript 파일에 해당하는 스크립트 태그의 DOM을 확인하십시오.
- 정의되지 않은 경우 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);
}