【问题标题】:Javascript for conditional URL append or redirect based on window.location.href基于 window.location.href 的条件 URL 附加或重定向的 Javascript
【发布时间】:2011-02-04 08:52:36
【问题描述】:

我正在尝试制作一个书签,单击该书签时将检查当前选项卡/窗口的 URL,以查看它是否包含“char1”和/或“char2”(给定字符)。如果两个字符都存在,它将重定向到另一个 URL,对于另外两个,它将分别附加当前 URL。

我相信肯定有一种比以下方式更优雅的方式来说明这一点(到目前为止,这对我来说非常有效),但我对 Javascript 的了解并不多。我的(笨重且重复的)工作代码(道歉):

if (window.location.href.indexOf('char1') != -1 &&
    window.location.href.indexOf('char2') != -1)
{
    window.location="https://website.com/";
}
else if (window.location.href.indexOf('char1') != -1)
{
    window.location.assign(window.location.href += 'append1');
}
else if (window.location.href.indexOf('char2') != -1)
{
    window.location.assign(window.location.href += 'append2');
}

完全符合我的需要,但是……至少可以说不是很优雅。

有没有更简单的方法来做到这一点,也许使用 vars 或伪对象?还是更好的代码?

【问题讨论】:

  • 感谢 roosteronacid 格式,我将代码保留为书签形式有点残忍。我非常感谢那些贡献时间和代码的人。没想到这么快就有这么多的输入。 -冬眠

标签: javascript url conditional append bookmarklet


【解决方案1】:

一种可扩展的代码。我疯了吗?

var loc = window.location.href;
var arr = [{
  url: "https://website.com/",
  chars: ["char1", "char2"]
}, {
  url: loc + "append1",
  chars: ["char1"]
}, {
  url: loc + "append2",
  chars: ["char2"]
}];

function containsChars(str, chars)
{
  var contains = true;
  for(index in chars) {
    if(str.indexOf(chars[index]) == -1) {
      contains = false;
      break;
    }
  }
  return contains;
}

for(index in arr) {
 var item = arr[index];
 if(containsChars(loc, item.chars)) {
    window.location.href = item.url;
    break;
 }
}

【讨论】:

  • 疯了吗?不,但可能习惯于煎更大的鱼 :) 如果在站点\域中实现这将非常棒,因为据我所见,它更加灵活和可扩展。我想这对于检查查询字符串和/或搜索特别有用,您可以将用户重定向到常见问题解答或与他们的浏览或站点搜索有关的特殊公告。不错,但对于我的需要,这就像用核武器杀死一只蚊子哈哈。
【解决方案2】:

对 dthorpe 建议的(某种)重构:

var hasC1  = window.location.href.indexOf('char1')!=-1
var hasC2  = window.location.href.indexOf('char2')!=-1
var newLoc = hasC1 
               ? hasC2 ? "https://website.com/" : window.location.href+'append1'
               : hasC2 ? window.location.href+'append1' : '';

if (newLoc)
    window.location = newLoc;

调用assign 与为window.location 赋值相同,无论如何,您都在方法中使用了加法赋值+= 运算符:

window.location.assign(window.location.href+='append2')

这实际上会在调用 assign 方法之前将“append2”分配到 window.location.href 的末尾,使其变得多余。

您还可以通过将 window.location 设置为 var 来减少 DOM 查找。

【讨论】:

  • "调用 assign 和给 window.location 赋值一样..." 这就是我的想法,但是脚本一直将附加的 URL 返回到文档窗口而不是地址栏,并且地址栏包含 javascript。 History-1 返回到地址栏中附加 URL 的前一页。所以我将它包装在分配函数中以尝试强制它使用结果。它起作用了,但是是多余的。顺便说一句,您的代码正在做同样的事情:将附加的 URL 返回到 doc win,而不是地址栏。
  • 感谢您抽出宝贵时间提供帮助。我试图自己制作一些变量,但它正在解决;我不确定我做错了什么,但我朋友的孩子当时把我的房子拆散了哈哈……我很感激你的意见。
  • @Wintermute:np。这似乎是你遇到的一个奇怪的问题。您可以将window.location = newLoc 更改为window.location.assign(newLoc),但正如我之前提到的,它们非常接近相同的东西。
  • 我认为这可能与Firefox中的Javascipt有关;它似乎将结果解释为字符串文字并将其加载到浏览器窗口中......? .assign(newLoc) 按预期返回,现在运行良好。还有一个新的 var:loc = window.location。它现在只是 loc.propertyloc.function。再次感谢 Andy E 的负责人。
【解决方案3】:

var location =window.location.href

if (location.indexOf('char1')!=-1 &&  location.indexOf('char2')!=-1)
{window.location="https://website.com/";} 
else if (location.href.indexOf('char1')!=-1) {window.location.assign(location+='append1');}
else if (location.indexOf('char2')!=-1) {window.location.assign(location+='append2');}

【讨论】:

  • 简洁明了,正是我喜欢的方式。使用 2 个变量进一步减少代码:loc=window.location & url=loc.href。这也违反了location="" 作为字符串而不是地址返回到文档窗口。 loc.assign()(带有上述变量)纠正了这一点。我认为这是因为将字符串附加到该位置会将其转换为点亮的字符串,而这又被视为文档内容,因此它会进入文档窗口。感谢您的意见!
【解决方案4】:

我能看到的唯一减少是将多余的 indexof 调用提取到 vars 中,然后测试 vars。但它不会对性能产生任何明显的影响。

var hasChar1 = window.location.href.indexOf('char1') != -1;
var hasChar2 = window.location.href.indexOf('char2') != -1;
if (hasChar1)
{
   if (hasChar2)
   {
      window.location="https://website.com/";
   }
   else
   {
      window.location.assign(window.location.href+='append1');
   }
} 
else if (hasChar2)
{
    window.location.assign(window.location.href+='append2');
}

【讨论】:

  • 感谢您的回复,非常感谢您的意见。这是一个结构更好的“如果”,并且比我的解决方案更合乎逻辑。我很想知道您是否有理由使用与我相同的 assign(loc.href+=) ......这是多余的,但我可以将结果强制到 location.href 而不是返回的唯一方法字符串到主文档窗口。
  • 这对我来说效果很好。我更进一步,正如 Andy E 建议的那样,添加了一个新的 var:loc = window.location。现在只是 loc.property 或 loc.function。
  • 我没有仔细查看 window.location 分配。替我向神经漫游者问好。 ;>
  • 他现在用 loa 运行,但我会尝试获取他的 Hash
  • 简单易懂,并且可以在 Firefox 上运行!我刚刚做了if (hasChar1) { window.location="https://website.com"; }
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多