【发布时间】: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