0

我有一个接受参数的函数,需要将该参数作为原始字符串的子字符串返回:

var $ = function (selector) {
  var elements = [];

  var selectorSubstr = selector.substr(selector.lastIndexOf(".") || selector.lastIndexOf("#") + 1);

  return selectorSubstr;
};

参数都是 html 元素:

$("div")=> “div”

&

$("img.some_class")=> “some_class”

&

$("div.some_class#some_id")=> “some_id”

&

$("div#some_id.some_class")=> “some_class”

我需要 lastIndexOf 从“。”的最后一个实例开始。用于 html 类或 '#' 用于 html id。

目前 lastIndexOf 仅适用于第一个参数,不考虑 '||' for ' 或其他论点。

有什么建议么?

4

3 回答 3

2

总是第一个条件为真,因为两个选择器都有.,因此最后一个索引总是在第一个条件中定义。

var classSelector = selector.lastIndexOf('.')? -1 : selector.lastIndexOf('.');
var idSelector = selector.lastIndexOf('#')? -1: selector.lastIndexOf('#');
if(idSelector>classSelector)
selector.subStr(idSelector+1);
else
selector.subStr(classSelector+1);
于 2016-06-26T13:58:52.720 回答
1
var $ = function (selector) {
  return selector.match(/[#\.][^\.#]+$/);
}

$("img.some_class")[0]; // ==> '.some_class'
$("div.some_class#some_id")[0]; // ==> #some_id
$("asbasifhwaehf"); // ==> null, no match

编辑:解决@Joe 的要求,我进行此编辑以返回整个输入字符串,以防它不包含 # 或 。

var $ = function (selector) {
  var arr = selector.match(/[#\.][^\.#]+$/);
  return arr ? arr[0] : selector
}

$("img.some_class"); // ==> '.some_class'
$("div.some_class#some_id"); // ==> '#some_id'
$("asbasifhwaehf"); // ==> 'asbasifhwaehf', no match

获取没有 . 或 # 前缀,只需调用

$("div.some_class#some_id").slice(1); // ==> 'some_id'

您也可以return arr ? arr[0].slice(1) : selector在函数中,但是您无法仅从返回值判断它是类还是 id 或整个字符串(不匹配大小写)

于 2016-06-26T14:03:50.147 回答
1

对于这些问题以及许多其他库,如lodash,非常方便。他们将为您节省大量时间。例如,指向 lastIndexOf 的链接支持 fromIndex 告诉它从哪里开始等。

您也可以轻松地在您的情况下执行此操作,但最终您会遇到许多其他类似的问题,其中 1 个对 lodash 的函数调用可以解决它,最好将其添加为工具带 imo 的一部分.

于 2016-06-26T13:57:24.473 回答