80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// addapted from the document.currentScript polyfill by Adam Miller
 | 
						|
// MIT license
 | 
						|
// source: https://github.com/amiller-gh/currentScript-polyfill
 | 
						|
 | 
						|
// added support for Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1620505
 | 
						|
 | 
						|
(function (root, factory) {
 | 
						|
  if (typeof define === 'function' && define.amd) {
 | 
						|
    define([], factory);
 | 
						|
  } else if (typeof module === 'object' && module.exports) {
 | 
						|
    module.exports = factory();
 | 
						|
  } else {
 | 
						|
    root.getCurrentScript = factory();
 | 
						|
  }
 | 
						|
}(typeof self !== 'undefined' ? self : this, function () {
 | 
						|
  function getCurrentScript () {
 | 
						|
    var descriptor = Object.getOwnPropertyDescriptor(document, 'currentScript')
 | 
						|
    // for chrome
 | 
						|
    if (!descriptor && 'currentScript' in document && document.currentScript) {
 | 
						|
      return document.currentScript
 | 
						|
    }
 | 
						|
 | 
						|
    // for other browsers with native support for currentScript
 | 
						|
    if (descriptor && descriptor.get !== getCurrentScript && document.currentScript) {
 | 
						|
      return document.currentScript
 | 
						|
    }
 | 
						|
  
 | 
						|
    // IE 8-10 support script readyState
 | 
						|
    // IE 11+ & Firefox support stack trace
 | 
						|
    try {
 | 
						|
      throw new Error();
 | 
						|
    }
 | 
						|
    catch (err) {
 | 
						|
      // Find the second match for the "at" string to get file src url from stack.
 | 
						|
      var ieStackRegExp = /.*at [^(]*\((.*):(.+):(.+)\)$/ig,
 | 
						|
        ffStackRegExp = /@([^@]*):(\d+):(\d+)\s*$/ig,
 | 
						|
        stackDetails = ieStackRegExp.exec(err.stack) || ffStackRegExp.exec(err.stack),
 | 
						|
        scriptLocation = (stackDetails && stackDetails[1]) || false,
 | 
						|
        line = (stackDetails && stackDetails[2]) || false,
 | 
						|
        currentLocation = document.location.href.replace(document.location.hash, ''),
 | 
						|
        pageSource,
 | 
						|
        inlineScriptSourceRegExp,
 | 
						|
        inlineScriptSource,
 | 
						|
        scripts = document.getElementsByTagName('script'); // Live NodeList collection
 | 
						|
  
 | 
						|
      if (scriptLocation === currentLocation) {
 | 
						|
        pageSource = document.documentElement.outerHTML;
 | 
						|
        inlineScriptSourceRegExp = new RegExp('(?:[^\\n]+?\\n){0,' + (line - 2) + '}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*', 'i');
 | 
						|
        inlineScriptSource = pageSource.replace(inlineScriptSourceRegExp, '$1').trim();
 | 
						|
      }
 | 
						|
  
 | 
						|
      for (var i = 0; i < scripts.length; i++) {
 | 
						|
        // If ready state is interactive, return the script tag
 | 
						|
        if (scripts[i].readyState === 'interactive') {
 | 
						|
          return scripts[i];
 | 
						|
        }
 | 
						|
  
 | 
						|
        // If src matches, return the script tag
 | 
						|
        if (scripts[i].src === scriptLocation) {
 | 
						|
          return scripts[i];
 | 
						|
        }
 | 
						|
  
 | 
						|
        // If inline source matches, return the script tag
 | 
						|
        if (
 | 
						|
          scriptLocation === currentLocation &&
 | 
						|
          scripts[i].innerHTML &&
 | 
						|
          scripts[i].innerHTML.trim() === inlineScriptSource
 | 
						|
        ) {
 | 
						|
          return scripts[i];
 | 
						|
        }
 | 
						|
      }
 | 
						|
  
 | 
						|
      // If no match, return null
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  return getCurrentScript
 | 
						|
}));
 |