【问题标题】:Using Only Single Quotes in a QuerySelector在 QuerySelector 中仅使用单引号
【发布时间】:2019-02-11 16:29:53
【问题描述】:

我正在使用一个使用 querySelectors 来抓取 DOM 的 Chrome 扩展程序。当输入到控制台时,以下 querySelector 会正确返回我想要的值(全名中的姓氏):

document.querySelector('[data-bind="text: 
PersonName.fullName"]').textContent.slice(document.querySelector('[data- 
bind="text: PersonName.fullName"]').textContent.indexOf(" ")+1)

然而,在扩展中,这些 querySelector 是通过 API 在 JSON 对象中提供的,双引号会导致 JSON 解析错误。是否有等效的方法来仅使用单引号编写上述查询选择器?或者以某种方式转义双引号以使 JSON 在解析时不会出现问题?

如果你想测试一个潜在的答案,这里是我试图抓取的 HTML 元素:

<span data-bind="text: PersonName.fullName">John Smith</span>

为了增加清晰度 - 我无法控制 HTML 页面,它位于最终用户的机器上。

这是生成的 JSON:

{"AtsMapping":[{"ID":"4"},{"atsCode":"ULT1"},{"atsName":"UltiPro"}, 
{"atsMapName":"UltiPro"},{"atsMapNotes":"John Smith (1)"}, 
{"firstName":"document.querySelector('[data-bind="text: 
PersonName.fullName"]').textContent.slice(0,document.querySelector('[data- 
bind="text: PersonName.fullName"]').textContent.indexOf(" "))"}, 
{"lastName":"document.querySelector('[data-bind="text: 
PersonName.fullName"]').textContent.slice(document.querySelector('[data- 
bind="text: PersonName.fullName"]').textContent.indexOf(" ")+1)"}, 
{"emailAddress":"document.querySelector(".email-address").innerText;"}, 
{"jobTitle":"document.querySelector('[data-bind="text: 
OpportunityTitle"]').textContent"},{"location":""},{"locationDefault":""}, 
{"effectiveDate":""},{"effectiveDateDefault":""},{"expirationDate":""}, 
{"expirationDateDefault":""},{"flsaStatus":""},{"flsaStatusDefault":""}, 
{"compGroup":""},{"compGroupDefault":""},{"benefitsGroup":""}, 
{"benefitsGroupDefault":""},{"offerTemplate":""},{"offerTemplateDefault":""}, 
{"confidentialFlag":""},{"confidentialFlagDefault":""}]}

而解析这个JSON的错误是:

未捕获的 SyntaxError:JSON 中第 184 位的意外标记 t 在 JSON.parse() 在 Object.$.get [成功] (inject.js:10390) 着火(inject.js:3274) 在 Object.fireWith [as resolveWith] (inject.js:3404) 完成后(inject.js:9311) 在 XMLHttpRequest。 (inject.js:9554)

谢谢!

【问题讨论】:

  • 在 JSON 编码时双引号应该被转义。 JSON 是什么样的?
  • 您在 JSON 中设置 javascript?似乎是个坏主意
  • 我同意,并且正在使用我得到的东西。我可以输入 API 将返回的值,并且可以确定 Chrome 扩展程序如何处理它们。我可以更改扩展以将 API 值包装在 querySelector 和其他代码中,但是每次我们加入新客户端时,我都可能必须创建一个新的扩展版本。
  • 使用转义字符转义引号,document.querySelector('[data-bind=\'text: PersonName.fullName\']')

标签: javascript


【解决方案1】:

你应该转义字符串。

请参阅下面我如何将您的代码转换为字符串并将其添加到 json。

当我使用/"/"时一定要注意

var d= {"firstName": ""}

var value = "document.querySelector('[data-bind=\"text: PersonName.fullName\"]').textContent.slice(document.querySelector('[data- bind=\"text: PersonName.fullName\"]').textContent.indexOf(' ')+1)";

d.firstName = value;
console.log(d)

【讨论】:

  • 完美!或者足够接近。第二个data-bind 中缺少一个空格。感谢您的帮助,我真的很挣扎,很惊讶没有人提供这个回复!我会尽快奖励赏金,上面说我还要再等 11 个小时。 :)
  • NP 很高兴我能帮上忙
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2011-03-23
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多