如何在使用符号时使用lastIndexOf()函数

3

我刚开始使用indexOf()lastIndexOf()函数,我知道它们的用途,但结果并不令我感到满意 :)

let str = $('#info').html();

// WORKS
//alert(str.lastIndexOf('√'));

// DOESN'T WORK
alert(str.lastIndexOf('√'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="info">&#x0221A;</div>

问题是,我收到的警报结果为“-1”,这意味着在str变量中找不到&#x0221A;。使用简单符号可以解决问题,但是我不确定在这里使用这个符号是否是一个好习惯。
在我看来,另一种解决这个问题的方法是将符号编码在HTML中为&#x0221A;,这样使用“检查元素”功能时,您会看到&#x0221A;
你怎么看?
2个回答

3

没有直接实现这个目标的方法。但是如果你仍然想要这样做,那么你只需要创建ASCII值的十六进制表示:

let str = ascii_to_hexa($('#info').html());
str = '&#x0'+str.toUpperCase()+';';

alert(str.lastIndexOf('&#x0221A;'));

function ascii_to_hexa(str)
{
  var arr1 = [];
  for (var n = 0, l = str.length; n < l; n ++){
    var hex = Number(str.charCodeAt(n)).toString(16);
    arr1.push(hex);
  }
  return arr1.join('');
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="info">&#x0221A;</div>


哇,这么长的函数只是用来转换?:) 不错的解决方案,但对我来说太长了。 - Lukas Naujokaitis
刚刚添加了这个答案,希望它对你以及其他寻找相同解决方案的人有所帮助。 - Ankit Agarwal

1
当浏览器读取和解析你的HTML时,它会构建一个DOM,但不会保留你提供的确切HTML。稍后,如果你请求HTML,它将使用自己的规则构建一个新的HTML字符串。
这就是为什么 str.lastIndexOf('&#x0221A;') 不起作用:浏览器没有义务以与你提供时相同的形式将字符返回给你。它可以只返回一个字符()或一个命名字符引用(&radic;在这种情况下)或十进制数字字符引用(&#8730;),而不是你要找的十六进制数字字符引用。
你需要在目标浏览器上进行测试,看看它们给你什么,然后寻找那个字符。我怀疑大多数,如果不是全部,都将返回实际字符,因此你的str.lastIndexOf('√') (或str.lastIndexOf('\u221A')) 将是最好的选择。

<div>&radic;</div>


谢谢你的回答。你认为使用像这样的直接符号是一个好习惯,还是无所谓,或者我应该使用\u221A - Lukas Naujokaitis
@LukasNaujokaitis:没关系,做你/你的团队喜欢的。无论如何,您的堆栈需要正确设置,以确保在所有阶段使用相同的编码。如果您担心可能会出现编码不匹配,那么只需要使用\u221A。 (您可能因为风格而喜欢它,但这是您唯一需要它的原因。)但是,如果确实存在问题,则需要解决。 :-) - T.J. Crowder
感谢您的解释,我认为使用编码字符串更好,因为在某些浏览器中可能会出现\u221A映射可用但不支持 的情况。当然,我指的是非常老的浏览器。我的整个JavaScript代码在那里都不会起作用:D,所以无论如何都没有关系。 - Lukas Naujokaitis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接