كيفية الحصول على مسار الملف لكود جافا سكريبت الذي يتم تنفيذه حاليًا

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

سؤال

أحاول أن أفعل شيئًا مثل C #include "filename.c", أو PHP include(dirname(__FILE__)."filename.php") ولكن في جافا سكريبت.أعلم أنه يمكنني القيام بذلك إذا كان بإمكاني الحصول على عنوان URL الذي تم تحميل ملف js منه (على سبيل المثال.عنوان URL الوارد في سمة src للعلامة).هل هناك أي طريقة لجافا سكريبت لمعرفة ذلك؟

وبدلاً من ذلك، هل هناك أي طريقة جيدة لتحميل جافا سكريبت ديناميكيًا من نفس المجال (دون معرفة المجال على وجه التحديد)؟على سبيل المثال، لنفترض أن لدينا خادمين متطابقين (ضمان الجودة والإنتاج) ولكن من الواضح أن لهما نطاقات URL مختلفة.هل هناك طريقة لفعل شيء مثل include("myLib.js"); حيث سيتم تحميل myLib.js من مجال تحميل الملف؟

آسف إذا كان هذا مصاغًا بشكل مربك بعض الشيء.

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

المحلول

داخل البرنامج النصي:

var scripts = document.getElementsByTagName("script"),
    src = scripts[scripts.length-1].src;

يعمل هذا لأن المتصفح يقوم بتحميل البرامج النصية وتنفيذها بالترتيب، لذلك أثناء تنفيذ البرنامج النصي الخاص بك، من المؤكد أن المستند الذي تم تضمينه فيه يحتوي على عنصر البرنامج النصي الخاص بك باعتباره العنصر الأخير في الصفحة.يجب أن يكون هذا الرمز بالطبع "عامًا" بالنسبة للبرنامج النصي، لذا احفظه src في مكان حيث يمكنك استخدامه لاحقًا.تجنب تسريب المتغيرات العامة عن طريق تغليفها بما يلي:

(function() { ... })();

نصائح أخرى

جميع المتصفحات باستثناء إنترنت إكسبلورر (أي إصدار) لديها document.currentScript, ، والذي يعمل دائمًا (بغض النظر عن كيفية تضمين الملف (غير متزامن، تطبيق مرجعي، إلخ)).

إذا كنت تريد معرفة عنوان URL الكامل لملف JS الذي تتواجد فيه الآن:

var script = document.currentScript;
var fullUrl = script.src;

تادا.

لا تعمل الإجابة المقبولة هنا إذا كان لديك نصوص برمجية مضمّنة في مستندك.لتجنب ذلك يمكنك استخدام ما يلي للاستهداف فقط <script> العلامات مع أ [src] يصف.

/**
 * Current Script Path
 *
 * Get the dir path to the currently executing script file
 * which is always the last one in the scripts array with
 * an [src] attr
 */
var currentScriptPath = function () {

    var scripts = document.querySelectorAll( 'script[src]' );
    var currentScript = scripts[ scripts.length - 1 ].src;
    var currentScriptChunks = currentScript.split( '/' );
    var currentScriptFile = currentScriptChunks[ currentScriptChunks.length - 1 ];

    return currentScript.replace( currentScriptFile, '' );
}

يؤدي هذا إلى التقاط آخر ملف .js خارجي بشكل فعال، مما يحل بعض المشكلات التي واجهتها مع قوالب JS المضمنة.

لقد قمت للتو بهذه الخدعة الصغيرة:

window.getRunningScript = () => {
    return () => {
        let err = new Error()
        let link = err.stack.split('(')
        link = link[1]
        link = link.split(')')[0]
        link = link.split(':')
        link.splice(-2, 2)
        link = link.join(':')

        return link
    }
}

console.log('%c Currently running script:', 'color: blue', getRunningScript()())

screenshot

يعمل على:كروم، فايرفوكس، إيدج

يتمتع !

من خلال تنقيح الإجابات الموجودة هنا توصلت إلى ما يلي:

getCurrentScript.js

var getCurrentScript = function () {
  if (document.currentScript) {
    return document.currentScript.src;
  } else {
    var scripts = document.getElementsByTagName('script');
    return scripts[scripts.length-1].src;

  }
};

module.exports = getCurrentScript;

getCurrentScriptPath.js

var getCurrentScript = require('./getCurrentScript');

var getCurrentScriptPath = function () {
  var script = getCurrentScript();
  var path = script.substring(0, script.lastIndexOf('/'));
  return path;
};

module.exports = getCurrentScriptPath;

بالمناسبة:أنا استخدم CommonJSتنسيق الوحدة والتجميع مع webpack.

لقد وجدت مؤخرًا طريقة أكثر وضوحًا لهذا الأمر، والتي يمكن تنفيذها في أي وقت، بدلاً من الاضطرار إلى القيام بذلك بشكل متزامن عند تحميل البرنامج النصي.

يستخدم com.stackinfo للحصول على تتبع مكدس في الموقع الحالي، والاستيلاء على info.file الاسم من أعلى المكدس.

info = stackinfo()
console.log('This is the url of the script '+info[0].file)

لقد قمت بترميز وظيفة بسيطة تسمح بالحصول على الموقع المطلق لملف جافا سكريبت الحالي، باستخدام طريقة المحاولة/التقاط.

بإمكانك رؤيته هنا.

ربما أسيء فهم سؤالك ولكن يبدو أنه يجب أن تكون قادرًا على استخدام مسار نسبي طالما أن خوادم الإنتاج والتطوير تستخدم نفس بنية المسار.

<script language="javascript" src="js/myLib.js" />

بغض النظر عما إذا كان برنامجًا نصيًا، أو ملف html (للإطار، على سبيل المثال)، أو ملف css، أو صورة، أو أيًا كان، إذا كنت لا تحديد خادم/مجال، سيكون مسار مستند html هو المسار الافتراضي، لذا يمكنك القيام، على سبيل المثال،

<script type=text/javascript src='/dir/jsfile.js'></script>

أو

<script type=text/javascript src='../../scripts/jsfile.js'></script>

إذا لم تقم بتوفير الخادم/المجال، فسيكون المسار مرتبطًا إما بمسار الصفحة أو البرنامج النصي لمسار المستند الرئيسي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top