【问题标题】:conditional use of indexOf function有条件地使用 indexOf 函数
【发布时间】:2013-12-10 16:08:22
【问题描述】:

我正在使用一个脚本在 URL 中搜索查询字符串,如果找到则忽略该查询。该脚本有效,但仅当存在查询字符串时。我得到的错误是Uncaught TypeError: Cannot call method 'indexOf' of undefined,所以很明显错误发生在哪里,我只是不知道如何解决它。我只需要在找到查询字符串时执行indexOf,对吗?我怎样才能做到这一点?

这是导致错误的JS:

var href = jQuery(this).attr('href');
var fname = href;
var query = href.indexOf("?");

if (query !== -1) {
    fname = href.substr(0, query);
} 

我认为要解决这个问题,我只需要有条件地执行脚本的 href.indexOf("?"); 部分,但到目前为止我的所有尝试都失败了。

【问题讨论】:

  • 到目前为止我所有的尝试都失败了好吧,你尝试了什么?
  • 既然你在看href 属性,你应该可以只看search 属性,它代表href 的查询字符串。例如,var a = document.createElement("a"); a.href = "http://www.example.com/?var=val"; alert(a.search);
  • 您正在尝试调试一个错误,其中 OP 没有说出他想要做什么。此脚本是否在 A 标签上运行?您要查看window.location 吗?简单的var href = jQuery(this).attr('href') || ''; 将删除错误,但不会修复其背后的逻辑。
  • 在弱类型语言中,按摩通常比条件更快/更简单:href.indexOf("?") 可以安全地使用 String(href).indexOf("?");你也可以安全地使用调用形式:"".indexOf.call(href , "?" )
  • href && href.indexOf("?"); 解决您的核心问题。

标签: javascript url query-string


【解决方案1】:

“?”的测试应该可以 - 也许你的 href 是空的?

Live Demo

function getFName(link) {
  var href = link.href || "no href found";
  return href.split("?")[0];
}

var a = document.createElement("a");
a.href = "http://www.google.com/search?q=something";
var fname = getFName(a);
window.console && console.log(fname);
a.href = "http://www.google.com/search";
fname = getFName(a)
window.console && console.log(fname);

仅供参考,如果您必须知道是否有查询字符串,您可以测试链接的搜索属性

测试搜索属性而不是 href

var query = this.search;
var fname = query?this.href.split("?")[0]:this.href;

【讨论】:

  • 你的答案的第二部分工作得很好。谢谢!
【解决方案2】:

在调用 indexOf 之前检查 href 是否未定义。

【讨论】:

    【解决方案3】:

    http://jsfiddle.net/dqzhz/

    var url = getURL("http://www.example.com?q=1&x=2");
    alert(url);
    
    function getURL(link) {
        url = document.createElement('a');
        url.href = link;
        return url.protocol + "//" + url.host;
    }
    

    【讨论】:

      【解决方案4】:

      http://api.jquery.com/attr/

      从 jQuery 1.6 开始,.attr() 方法为尚未设置的属性返回 undefined。

      undefined.indexOf(...) 会崩溃,但你可以使用这样的空字符串:

      var query = (href || '').indexOf('?');
      

      意思是“真实的东西或空字符串”:

      undefined || '' -> ''
             "" || '' -> ''
            "a" || '' -> "a"
      

      【讨论】:

        【解决方案5】:

        此函数返回查询字符串的值,如果未找到则返回空字符串。

        function getQueryParameterByName(name) {
        
                    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/gi, "\\\]");
                    var regexS = "[\\?&]" + name + "=([^&#]*)";
                    var regex = new RegExp(regexS, "i");
                    var results = regex.exec(window.location.href);
                    if (results == null)
                        return "";
                    else
                        return decodeURIComponent(results[1].replace(/\+/gi, " "));
        }
        

        【讨论】:

        • 当你可以返回 link.search 时,正则表达式的疯狂浪费。在任何情况下,OP 都不对查询字符串感兴趣,而是对没有它的 URL 感兴趣
        • 嗯,这很容易。我猜我读这个问题时很累。
        猜你喜欢
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2011-07-18
        • 2010-12-02
        • 2021-05-28
        • 1970-01-01
        • 2018-01-11
        相关资源
        最近更新 更多