3

我正在使用示例中的代码“我如何将来自多个国家的用户分别重定向到多个页面?”,来自Geobytes的免费 JavaScript 。

如果来自英国或挪威的访问者正在查看我的网站,他会被重定向到专门为这些国家/地区制作的页面,但如果访问者来自任何其他国家/地区(澳大利亚、美国),他不会被重定向到这些国家/地区的页面;我的网站(正在建设中)仍然是空白的。

我希望能够将这些非英国非挪威用户发送到正确的站点。

我的示例代码:

 <head>
    <script language="Javascript" src="http://gd.geobytes.com/Gd?after=-1"></script>
    <script language="javascript">
    var UK="UK";
    var Norway="NO";

    if(typeof(sGeobytesLocationCode)!="undefined")
    {
       var sCountryCode=sGeobytesLocationCode.substring(0,2);

          if(UK.indexOf(sCountryCode)>=0)
          {
             // UK Visitors would go here
             document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=http://www.google.co.uk'>");
          }
          else if(Norway.indexOf(sCountryCode)>=0)
          {
             // Norway Visitors would go here

             document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=http://www.google.no'>");
          }



else
          {
             // World Visitors would go here
             document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=http://www.google.com/ncr'>");
          }
       }
  //  }
    </script>
    </head>
4

6 回答 6

5

试试这个代码

//* init location codes for redirecting
var finded = false,
    redirections = {
        UK: 'http://www.adworkmedia.com/go.php?camp=3135&pub=13435&id=7547&sid=',
        US: 'http://www.adworkmedia.com/go.php?camp=2907&pub=13435&id=7038&sid=',
        CA: 'French.htm',   // Canada
        PH: 'Philippine.htm',   // Philippines
        KO: 'Korean.htm',   // Korea
        CH: 'Chinese.htm'   // China
    };
//* Checking location code
if(typeof(sGeobytesLocationCode) != "undefined")
{
    var sCountryCode = sGeobytesLocationCode.substring(0,2);
    for(var i in redirections) {
        if(i == sCountryCode) {
            document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=" + redirections[i] + "'>");
            finded = true;
        }
    }
}
//* location code not finded - redirect to default page
if(!finded) {
    document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=World.htm'>");
}

如您所见 - 我可以简单地添加/删除新的重定向页面,而无需复制大量 kB 代码。我提供的某些代码可能不正确,如果需要,请自行修复

于 2013-01-04T10:00:30.700 回答
5

您的问题是,在您当前的网站 (winappleiphone.info) 中,您正在检查具有以下变量的国家/地区:

  • 英国, 美国, 加拿大, sPhilippineLocations, sKoreanLocations, sChineseLocations

在这些变量中,您只声明了 UK 和 USA 变量,但您尝试使用其他变量而不声明它们并分配任何导致 JavaScript 错误的值,因此您的脚本有时会失败。

于 2013-01-01T12:22:55.453 回答
3

页面也变成白色

typeof(sGeobytesLocationCode) == undefined 
//It is actually undefined...

或者

 sGeobytesLocationCode.substring(0,2) 

引发错误。

所以放置一个 else 语句来处理实际上是未定义的情况并检查sGeobytesLocationCode的长度以确定它的长度实际上是0还是1

 if((typeof(sGeobytesLocationCode)!= "undefined") && (sGeobytesLocationCode.length > 1))
 {
      //bla bla
 }
 else
 {
      //Go to default page instead of showing white
 }

这些是基础知识,或者询问用户他们想要进入哪个站点而不是显示白页:)

于 2013-01-04T07:47:14.697 回答
2

您的逻辑不考虑sGeobytesLocationCode未定义时的情况。此外,当sGeobytesLocationCode不是字符串或少于两个字符时,可能会发生错误。下面的代码开始设置默认 url,假设用户不在英国或挪威。然后,只有sGeobytesLocationCode通过几个条件才会更改此 url。没有不会重定向用户的路径。substring我还添加了逻辑来检查并确保和中不会出现错误indexOf。此外,重定向的逻辑只发生在一个地方,而不是在每个 if-else 块中。

<head>
    <script language="Javascript" src="http://gd.geobytes.com/Gd?after=-1"></script>
    <script language="javascript">
        var UK="UK";
        var Norway="NO";

        // default url, if country is not uk or norway
        var url = "http://www.google.com/ncr";

        if(typeof(sGeobytesLocationCode) == "string" && sGeobytesLocationCode.length >= 2)
        {
            var sCountryCode = sGeobytesLocationCode.substring(0,2);

            if (UK.indexOf(sCountryCode) >= 0)
            {
                // UK Visitors would go here
                url = "http://www.google.co.uk";
            }
            else if (Norway.indexOf(sCountryCode) >= 0)
            {
                // Norway Visitors would go here
                url = "http://www.google.no";
            }
        }

        document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=" + url + "'>");
    </script>
</head>

注意:我提供的代码使用您的确切代码以及使您的案例工作所需的几个小改动。但是,您的代码可以写得更好。考虑以下:

  • 并非所有浏览器都支持indexOf. 您可能需要提供默认实现以支持所有浏览器。你可以谷歌这个,有几个地方给出了代码。话虽indexOf如此,在这种情况下似乎是多余的,因为您 substring以前只包含两个字母的国家/地区代码。考虑取出indexOf并检查国家代码是否相同。

  • 为了提高代码的可维护性,您可能需要考虑将所有国家/地区代码(到目前为止为“NO”和“UK”)及其对应的 url 添加到数组中。通过这种方式,您可以遍历数组并且只编写一个代码块来进行比较并设置 url。按照现在的方式,您需要一个 if 语句,其中包含您要检查的每个国家/地区代码的重复逻辑。现在还不错,但是如果您计划将来添加国家/地区代码,它会很快变得丑陋。

于 2013-01-07T18:36:45.220 回答
2

在 sGeobytesLocationCode 未定义的情况下,您不会重定向。此外,当您有很多要比较的位置时,您的 if else 语句将开始失控。br3t 有一个很好的解决方案。您还应该确保 sGeobytesLocationCode 是长度为 2 或更大的字符串,并将其转换为大写(以防万一)。

    redirections = {
        UK: 'http://www.adworkmedia.com/go.php?camp=3135&pub=13435&id=7547&sid=',
        US: 'http://www.adworkmedia.com/go.php?camp=2907&pub=13435&id=7038&sid=',
        CA: 'French.htm',   // Canada
        PH: 'Philippine.htm',   // Philippines
        KO: 'Korean.htm',   // Korea
        CH: 'Chinese.htm'   // China
    };
if(typeof(sGeobytesLocationCode) === 'string' && sGeobytesLocationCode.substring.length > 1)
{
    var sCountryCode = sGeobytesLocationCode.substring(0,2).toUpperCase();
    for(var i in redirections) {
        if(i == sCountryCode) {
            document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=" + redirections[i] + "'>");
           return;
        }
    }
}
//* location code not redirected - redirect to default page
    document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=World.htm'>");
于 2013-01-07T02:56:17.637 回答
1

这似乎工作得很好,而且更紧凑。

<head>
    <script language="Javascript" src="http://gd.geobytes.com/Gd?after=-1"></script>
    <script language="javascript">
        var countrySuffix = {
            //add more specific countries here if you want
            "UK": 'http://www.google.co.uk',
            "NO": 'http://www.google.no',
            //The default location we'll go to if we're not in any of the above
            //   locations
            "DEFAULT": 'http://www.google.com/ncr'
        };

        var sCountryCode;

        if(sGeobytesLocationCode && sGeobytesLocationCode.length > 1){
            sCountryCode = sGeobytesLocationCode.substring(0,2);
        }

        var targetSite = countrySuffix[(sCountryCode || "DEFAULT").toUpperCase()] || countrySuffix.DEFAULT;
        document.write("<META HTTP-EQUIV='Refresh' CONTENT='0; URL=" + targetSite + "'>");
    </script>
</head>
于 2013-01-08T08:33:16.467 回答