【问题标题】:CL-WHO is always starting with a single quoteCL-WHO 总是以单引号开头
【发布时间】:2019-04-24 03:27:37
【问题描述】:

我的问题是 CL-WHO 在将 Lisp S 表达式转换为 html 输出时,以单引号市场开始每个表达式。大多数时候这没问题,但这是一个问题,因为我将我的文件链接到外部 javascript 文件。我试图让这个项目变得简单,因为我团队中的 javascript 开发人员都不知道 Common Lisp,所以使用 parenscript 可能是不可能的。这是我的问题的一个示例以及我的程序中的一个错误:

:onclick "alertUser('id')"

当在 html 文档中按下特定元素时,应该会触发一个名为 alertUser 的 JavaScript 函数,并且标签的 id 应该作为参数传递给 JavaScript 函数。但无论我做什么,CL-WHO 都会将该字符串转换为单引号,所以我最终得到一个无效的表达式。以下是该代码转换为的内容:

onclick='alertUser('id')'>

一切都是单引号,所以'alertUser('作为第一个字符串传递,这显然是无效的,我在我的开发人员工具中收到一个语法区域。我认为我可以通过使用带有转义字符的格式函数来解决这个问题. 这相当于:

CL-USER> (format t "\"alertUser('id')\"")
"alertUser('id')"
NIL
CL-USER> 

但是当我尝试使用 CL-WHO 时:

:onclick (format nil "\"alertUser('id')\"")

意思是:

onclick='"alertUser('locos-tacos-order')"'>

这也是无效的html。如您所见,无论如何,CL-WHO 都会以单引号开头。接下来我尝试了 CL-WHO fmt 功能:

:onclick (fmt "\"alertUser('locos-tacos-order')\"")

当我使用 fmt 函数时,它会在转换为 html 时完全摆脱我的 :onclick 表达式!:

id='id'"alertUser('id')">

最后我尝试了 str 函数,得到了与我最初尝试类似的无效输出:

onclick='"alertUser('id')"'

显然,如果我用纯 html 编写代码,它看起来像:

onclick="alertUser('id')">

这是有效的。 我的问题只是如何让 CL-WHO 在这些情况下使用双引号而不是单引号?

【问题讨论】:

  • 是否有可能使用 Javascript 而不是内联属性正确附加处理程序(由于这个原因,这些属性不受欢迎)?例如<somelement>.addEventListener('click', () => alertUser('id')),避免所有需要处理逃逸问题
  • cl-who 包的贴切显示有一个变量CL-WHO:*ATTRIBUTE-QUOTE-CHAR*。尝试将其设置为#\"

标签: javascript lisp common-lisp hunchentoot cl-who


【解决方案1】:

@jkiiski 在我的问题下方的 cmets 中有正确答案,但我想发布答案,以便将来遇到类似问题的任何人都可以解决问题。正如@jkiiski 所说,在 cl-who 包中有一个名为 ATTRIBUTE-QUOTE-CHAR 的变量,默认为#\'。您可以简单地将该变量设置为 #\" ,以便将默认引号用作双引号:

(setf *attribute-quote-char* #\")

在文件顶部附近添加该行代码后,我的 html 默认为:

onclick="alertUser('id')"

现在 javascript 可以正常执行了。感谢@jkiiski 的正确答案。

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2019-07-26
    • 2011-06-07
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多