JavaScript可以访问它吗';谁有自己的源url?

JavaScript可以访问它吗';谁有自己的源url?,javascript,jquery,html,Javascript,Jquery,Html,假设我在HTML页面中嵌入javascript: <script type="text/javascript" src="www.mydomain.com/script.js?var1=abc&var2=def"></script> 有没有办法在脚本中获取src url并提取参数?我认为脚本中没有指向此url的属性 从脚本中,您可以读取DOM。因此,您可以查找脚本标记并检查其src属性,但是如果您有多个脚本(或者DOM被修改),则无法确定它是哪一个 我想它

假设我在HTML页面中嵌入javascript:

<script type="text/javascript" src="www.mydomain.com/script.js?var1=abc&var2=def"></script> 


有没有办法在脚本中获取src url并提取参数?

我认为脚本中没有指向此url的属性

从脚本中,您可以读取DOM。因此,您可以查找脚本标记并检查其
src
属性,但是如果您有多个脚本(或者DOM被修改),则无法确定它是哪一个

我想它是用来检查输入的。因此,要解决此问题,您可以:

  • 通过服务器端脚本(PHP)呈现脚本,并让它输出变量。缺点:消耗了更多的服务器资源,使缓存变得非常糟糕
  • 只需从域中加载的所有脚本中获取参数。也许这并不重要,或者你只有一个脚本。缺点:在这种情况下,这是可能的,但不太可靠,也不能抵抗变化
  • 我的首选:将变量添加到脚本标记(实际上,添加到另一个脚本标记)中,以使它们直接在Javascript中可用,而不是解析脚本url
像这样:

<script type="text/javascript">
  var1 = 'abc';
  var2 = 'def';
</script>
<script type="text/javascript" src="www.mydomain.com/script.js"></script>

var1='abc';
var2='def';

我认为脚本中没有指向此url的属性

从脚本中,您可以读取DOM。因此,您可以查找脚本标记并检查其
src
属性,但是如果您有多个脚本(或者DOM被修改),则无法确定它是哪一个

我想它是用来检查输入的。因此,要解决此问题,您可以:

  • 通过服务器端脚本(PHP)呈现脚本,并让它输出变量。缺点:消耗了更多的服务器资源,使缓存变得非常糟糕
  • 只需从域中加载的所有脚本中获取参数。也许这并不重要,或者你只有一个脚本。缺点:在这种情况下,这是可能的,但不太可靠,也不能抵抗变化
  • 我的首选:将变量添加到脚本标记(实际上,添加到另一个脚本标记)中,以使它们直接在Javascript中可用,而不是解析脚本url
像这样:

<script type="text/javascript">
  var1 = 'abc';
  var2 = 'def';
</script>
<script type="text/javascript" src="www.mydomain.com/script.js"></script>

var1='abc';
var2='def';

如果您在HTML源代码中使用了一个正则脚本元素,那么只需获取文档中的最后一个脚本元素即可。由于脚本元素(在没有示例中未使用的属性的情况下)处于阻塞状态,因此在执行此脚本元素之前,不会向文档中添加更多的元素

var scripts = document.getElementsByTagName('script');
var last_script = scripts[scripts.length - 1];
var url = script.src;

如果在使用DOM的最后一个脚本之前动态添加一个脚本元素,这将不起作用。

如果您在HTML源代码中使用的是一个常规脚本元素,那么只需获取文档中的最后一个脚本元素即可。由于脚本元素(在没有示例中未使用的属性的情况下)处于阻塞状态,因此在执行此脚本元素之前,不会向文档中添加更多的元素

var scripts = document.getElementsByTagName('script');
var last_script = scripts[scripts.length - 1];
var url = script.src;

如果在使用DOM的最后一个脚本之前动态添加一个脚本元素,这将不起作用。

以下两个解决方案将起作用,无论脚本如何加载(即使它们是动态加载或使用
async
defer
属性加载):

在脚本标记上放置一个id

<script id="myscript" type="text/javascript" src="www.mydomain.com/script.js?var1=abc&var2=def"></script>

第二,如果知道文件名,可以搜索包含该文件名的任何脚本标记:

function findScriptTagByFilename(fname) {
    $("script").each(function() {
        if (this.src.indexOf(fname) !== -1) {
            return this.src;
        }
    });
}

var url = findScriptTagByFilename("/script.js");

以下是两种其他解决方案,无论脚本如何加载(即使是动态加载或使用
async
defer
属性加载):

在脚本标记上放置一个id

<script id="myscript" type="text/javascript" src="www.mydomain.com/script.js?var1=abc&var2=def"></script>

第二,如果知道文件名,可以搜索包含该文件名的任何脚本标记:

function findScriptTagByFilename(fname) {
    $("script").each(function() {
        if (this.src.indexOf(fname) !== -1) {
            return this.src;
        }
    });
}

var url = findScriptTagByFilename("/script.js");

此小技巧使用错误处理从内部查找外部脚本的位置:

(function(){ // script filename setter, leaves window.__filename set with active script URL.
if(self.attachEvent){
 function fn(e,u){self.__filename=u;}
 attachEvent("onerror",fn);
 setTimeout(function(){detachEvent("onerror", fn)},20);
 eval("gehjkrgh3489c()");
}else{
 Object.defineProperty( window, "__filename", { configurable: true, get:function __filename(){
   try{document.s0m3741ng()}catch(y){
    return "http://" + 
     String(y.fileName || y.file || y.stack || y + '')
     .split(/:\d+:\d+/)[0].split("http://")[1];
    } 
 }})//end __filename
}//end if old IE?
}());
它在运行时设置一个全局“_文件名”属性,因此在外部脚本上,_文件名对整个脚本的执行有效


我非常喜欢从scr属性中嗅探url部分,但这在大多数浏览器中都有效,而且事先不知道url。

这个小技巧使用错误处理从内部查找外部脚本的位置:

(function(){ // script filename setter, leaves window.__filename set with active script URL.
if(self.attachEvent){
 function fn(e,u){self.__filename=u;}
 attachEvent("onerror",fn);
 setTimeout(function(){detachEvent("onerror", fn)},20);
 eval("gehjkrgh3489c()");
}else{
 Object.defineProperty( window, "__filename", { configurable: true, get:function __filename(){
   try{document.s0m3741ng()}catch(y){
    return "http://" + 
     String(y.fileName || y.file || y.stack || y + '')
     .split(/:\d+:\d+/)[0].split("http://")[1];
    } 
 }})//end __filename
}//end if old IE?
}());
它在运行时设置一个全局“_文件名”属性,因此在外部脚本上,_文件名对整个脚本的执行有效


我非常喜欢从scr属性中嗅探url部分,但这在大多数浏览器中都有效,而且事先不知道url。

如果异步加载脚本,它会起作用吗?@SharonHaimPour-不可靠,因此“在没有不使用的属性的情况下”。如果脚本是异步加载的,它会工作吗?@SharonHaimPour-不可靠,因此“在没有您不使用的属性的情况下”。这不会工作。带有
src
属性的脚本元素不能有内联脚本。@Quentin抱歉。这个问题很容易解决,但不起作用。带有
src
属性的脚本元素不能有内联脚本。@Quentin抱歉。这很容易修复。如果您知道脚本url的一部分,则可以搜索所有脚本标记的src attrib以查找冒烟的枪。如果您知道脚本url的一部分,则可以搜索所有脚本标记的src attrib以查找冒烟的枪。