【问题标题】:JavaScript url variablesJavaScript 网址变量
【发布时间】:2011-10-20 03:06:08
【问题描述】:

我有

<script type="text/javascript" src="http://doamin.com/js/whatever.js?ref=images"></script>

注意网址末尾的ref=images。我的问题是,我如何从 url 获取 ref 变量并在同一个 js 文件中使用它。

【问题讨论】:

  • 我相信这是一个重复的问题:stackoverflow.com/questions/1403888/…
  • 一种方法是使用服务器端技术读取请求参数并将其动态注入到所服务的 JS 中。这是一个选择吗?
  • 我正在使用 php。 ref 取决于生成的 php 变量。我想将该变量传递给 js 文件。服务器端对我来说没问题。我认为最好的方法是将其作为 url 变量放在 js 文件的末尾。但我不知道如何访问它。其他方法我都可以

标签: javascript jquery url variables


【解决方案1】:

简化 mrtsherman 的想法,只需找到具有正确 src 的脚本(来自 whatever.js 内):

var whatever = $('script[src*=http://domain.com/js/whatever.js]')

if (whatever.length){
    var ref = whatever.attr('src').match(/\?ref=(.*)/)
    if (ref && ref[1]){
        ref = ref[1] // ref == 'images'
    }
}

更新:因为您只想从 PHP 输出一些内容并在脚本中使用它,所以您有一个更好的选择:

<script id="whatever" src="http://domain.com/whatever.js" data-ref="images"></script>

然后从您的脚本中(假设 jQuery >= 1.4):

var ref = $('#whatever').data('ref') // "images"

这是在客户端脚本中从服务器端获取数据的推荐和标准方法。

http://html5doctor.com/html5-custom-data-attributes/http://dev.w3.org/html5/spec/elements.html#embedding-custom-non-visible-data

【讨论】:

  • 我没有尝试过,但似乎也是一个优雅的解决方案。
【解决方案2】:

如果whatever.js是一个just js文件,你不能。

如果只是一个请求uri,使用服务端脚本输出javascript内容,可以从get参数中获取变量。

如果你想将变量传递给whatever.js,你可以在include whatever.js之前定义变量,然后在whatever.js中使用变量。

<script type="text/javascript">
<!--// 
  ref = 'images';
//-->
</script>

【讨论】:

  • 这是一个很棒又简单的解决方案。
  • 这就是你真正想要的。休息似乎完全误解了问题。
  • 是的,就是这样。我们在这里有很多正确的答案。这个赢了它的灵活性。我用php设置ref后,页面上的任何js文件现在都可以读取了。
  • 请注意,这会污染全局范围,您可能需要选择更具体的变量名称,或者将其添加为另一个对象的属性以避免冲突。
【解决方案3】:

我不知道如何仅获取当前块脚本元素的 src 属性。但是您可以获取页面上的所有脚本,然后对其进行解析。

//untested
var scripts = $('script[src]');
//loop through scripts and somehow identify the one that is yours
for (var script in scripts) {
  if (myscript) {
    var refvalue = getRef($(script).attr('src'), 'ref');
  }
}

//gup the parameter
function getRef(url, name) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( url );
  if( results == null )
    return "";
  else
    return results[1];
}

希望这足以继续下去

【讨论】:

    【解决方案4】:

    试试这个http://jsfiddle.net/fnE6w/

    $("script[src*='ref=']").each(function(){
        var src=$(this).attr("src");
        var start=src.indexOf("ref=");
        var end=-1;
    
    
        if(start>0)
            end = src.indexOf("&",start+4);
        if(end==-1) end=src.length-1;    
        alert(src.substring(start+4,end));
    
    });
    

    【讨论】:

      【解决方案5】:

      我似乎记得有一种方法可以在某些浏览器中获取调用脚本标记,但我找不到对它的引用。

      接下来最好的做法是遵循以下内容:http://snipplr.com/view/354/

      您可以使用您喜欢的来源搜索脚本标签,然后提取字符串。 小心!如果您根据用户输入设置此值,您的用户可能会注入您的扫描仪可能会误解的查询字符串,从而产生风险。应该使用与常规查询字符串相同的偏执 URL 解析方法。

      【讨论】:

        【解决方案6】:

        您的问题是,您无法从脚本的 URL 获取查询:

        <script src="http://doamin.com/js/whatever.js?ref=images">
             //Want to get the query here, but you can't
        </script>
        

        你说:

        I'm using php. ref depends on the generated php variable. I want to pass that variable to the js file. Server side is ok with me. I thought the best way to do it is to put it as a url variable at the end of the js file. But i don't know how to access it. Other methods are ok with me

        让我们回到你的目的,将 php 变量传递给脚本... 为什么不将 php 变量传递给包含脚本的 php 页面呢?然后使用此处其他海报提供的脚本获取它。包含脚本的 PHP 页面的 URL:

        http://domain.com/ThePHPPageContainingTheScript.php?ref=images
        

        那么这个页面包含脚本:

        <script src="http://doamin.com/js/whatever.js">
             //Get the query from window.location, it's possible!
        </script>
        

        【讨论】:

          【解决方案7】:

          以防万一它对搜索类似内容的任何人有用,这里有一个不使用 AJAX 将大量数据发送到脚本的方法示例。

          <script src="test.js" name="testjs">
          {
            "here"    : "is",
            "another" : "way",
            "of"      : "passing",
            "larger"  : "amounts",
            "of"      : "data",
            "to"      : "a script"
          }
          </script>
          

          然后在您的外部test.js 脚本中,您只需要以下内容:

          (function(){
            var script = document.scripts.namedItem('testjs'), obj, data;
            if ( script && (data = script.innerHTML) ) {
              if ( typeof JSON != 'undefined' ) {
                obj = JSON.parse(data);
              }
              else if ( typeof jQuery != 'undefined' ){
                obj = jQuery.parseJSON(data);
              }
              /// obj now contains the object representation of your data
              alert(obj);
            }
          })();
          

          【讨论】:

            【解决方案8】:

            您将需要类似于以下的代码。这得到了之后的一切?并将其分成基本的键/对数组。

            var GETDATA = new Array();
            
            // Get the string that follows the "?" in the window's location.
            var sGet = window.location.search;
            if (sGet) // if has a value...
            {
             // Drop the leading "?"
             sGet = sGet.substr(1);
            
             // Generate a string array of the name value pairs.
             // Each array element will have the form "foo=bar"
             var sNVPairs = sGet.split("&");
            
             // Now, for each name-value pair, we need to extract
             // the name and value.
             for (var i = 0; i < sNVPairs.length; i++)
             {
              // So, sNVPairs[i] contains the current element...
              // Split it at the equals sign.
              var sNV = sNVPairs[i].split("=");
            
              // Assign the pair to the GETDATA array.
              var sName = sNV[0];
              var sValue = sNV[1];
              GETDATA[sName] = sValue;
             }
            }
            

            【讨论】:

            • 注意:这主要适用于带有 ?var=foo 声明的 html 或 php 页面
            • 在这种情况下你不会和location.search打交道。
            • 这行不通。 window.location 适用于页面的来源,而不是包含的脚本文件的来源。即使您将该代码放在 JS 脚本文件中,它仍然会处理当前页面的 URL。
            • 这就是为什么我在 cmets 中添加了我的 not
            猜你喜欢
            • 1970-01-01
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-11
            • 2012-07-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多