كيف يمكنني معرفة ما إذا كان قد تم بالفعل تضمين ملف JavaScript بالفعل في صفحة ASP.NET؟

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

سؤال

لدي عنصر تحكم مستخدم ASP.NET (ملف .ascx). في عنصر تحكم المستخدم هذا أريد استخدام ملف .js.

لذلك أنا أدرج <script src="file.js" type"text/javascript"></script> على الصفحة.

ومع ذلك، في بعض الأحيان، استخدم عنصر تحكم المستخدم هذا في صفحة ويب حيث تم بالفعل تحميل هذا البرنامج النصي هذا بالفعل.

كيف يمكنني إضافة <script /> الإعلان الذي سيعرض على الصفحة فقط إذا كانت الصفحة لا تحتوي بالفعل على آخر <script /> علامة لنفس البرنامج النصي؟

هل كانت مفيدة؟

المحلول

كما كنت تستخدم ASP.NET، فمن المنطقي القيام بجانب خادم الاختيار كما سيكون من حيث تختار إضافة المرجع إلى ملف JavaScript. من ملف .ascx الخاص بك يمكنك التسجيل مع ما يلي:

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

... من صفحتك، يمكنك فقط استدعاء كائن Clientscript مباشرة:

ClientScript.RegisterClientScriptInclude("GlobalUnqiueKey", UrlOfJavascriptFile);

يمكن أن تكون "Globaluniquekey" أي سلسلة (يمكنني استخدام عنوان URL الخاص بملف JavaScript لهذا أيضا)

إذا حاولت تسجيل برنامج نصي بنفس السلسلة الرئيسية، فهذا لا يفعل أي شيء. لذلك إذا اتصلت بهذا في صفحتك، فإن عنصر تحكمك أو في أي مكان آخر، فسوف ينتهي بك الأمر إلى مرجع واحد فقط في صفحتك. إن استفادة من ذلك هو أنه يمكنك الحصول على مثيلات متعددة للتحكم في الصفحة، وعلى الرغم من أنهم جميعا يحاولون تسجيل نفس البرنامج النصي، إلا أنه تم القيام به فقط بحد أقصى وقت واحد. ولم يحتاج أي منهم إلى القلق بشأن تسجيل البرنامج النصي بالفعل.

هناك طريقة "isclescriptIccriptIncludergistered (stringkecriptIncludergistered (stringkey) التي يمكنك استخدامها لمعرفة ما إذا كان قد يتم بالفعل تضمين البرنامج النصي ضمن هذا المفتاح، ولكن يبدو أنه لا يلزم أن يفعل ذلك التحقق قبل التسجيل كحاولات متعددة للتسجيل لا ترمي استثناءات أو تسبب أي شيء آخر أخطاء.

يعني القيام بعملي Check Client أنه، على افتراض أن مراجع JavaScript المتعددة يتم تخزينها مؤقتا من قبل المتصفح (قد لا يكون)، لا يزال لديك علامات متعددة وأكثر من ذلك من كل واحد يسبب تشغيل بعض JavaScript. إذا كان لديك 20 حالة من سيطرتك على صفحة، فيمكنك الحصول على مشاكل خطيرة.

نصائح أخرى

يمكنك القيام بأحد شيئين جانبين؟

  1. تحقق من DOM للحصول على علامة البرنامج النصي المقابلة لملف JavaScript الذي تريد التحقق منه
  2. اختبار متغير أو وظيفة تعرفها / سيتم تعريفها داخل ملف JavaScript ل undefined.

إليك وظيفة JS سريعة التي تستخدم JQuery للقيام بما تحتاجه:

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;
 } }

استخدم هذا في صفحتك الرئيسية ووظيفة الاتصال تتضمن مع حجة اسم ملف جافا سكريبت

كما تريد تضمين جافا سكريبت على صفحة واحدة من موقعك فقط.
إذا كنت تستخدم ASP.NET (4.0)، فمن السهل جدا.
فقط تشمل التعليمة البرمجية

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

في ContentPlaceHolder من صفحة المحتوى.

لا أحب هذه التغريدة ردا على ذلك بعد فترة طويلة ولكن ربما لا يزال من المفيد أو على الأقل مساعدة أخرى تأتي من الخلف. للتحقق مما إذا كان JQuery تحميل بالفعل القيام بذلك

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

لا تفوت شخصية الهروب في علامة البرنامج النصي الختامي في بيان الوثيقة.

mysomic، لماذا لم أفكر في ذلك. ممتاز

ملاحظة: كنت قد أحببت أن أكتب هذا الحق ضمن الخط حيث كتب shimmy أن jQuery نفسه هو البرنامج النصي الذي يريد تحميله. لكن لا أعرف كيف تكتبها هناك. لا أستطيع رؤية الرد أو أي شيء رابط مماثل. قد يبدو هذا غبي ولكن ربما أفتقد شيئا ما. الثابتة والمتنقلة توجيه ذلك، أي شخص؟

إذا كنت في حاجة إليها من جانب الخادم، و Page.Clientscript.RegisterClientcriptIrcriptInclude لن تعمل لك في حالة إدراج البرنامج النصي من خلال طريقة أخرى أخرى ثم الصفحة.Clientscript.registerClientcript (على سبيل المثال الصفحة. ، يمكنك استخدام شيء مثل هذا:

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