Javascript 从JSON属性中删除双引号
我正在尝试使用hopscotch.js创建一个交互式教程。JavaScript库要求教程工作的标准数据结构如下:Javascript 从JSON属性中删除双引号,javascript,c#,jquery,json,hopscotch,Javascript,C#,Jquery,Json,Hopscotch,我正在尝试使用hopscotch.js创建一个交互式教程。JavaScript库要求教程工作的标准数据结构如下: // Define the tour! var tour = { id: "hello-hopscotch", steps: [ { title: "My Header", content: "This is the header of my page.", target: "
// Define the tour!
var tour = {
id: "hello-hopscotch",
steps: [
{
title: "My Header",
content: "This is the header of my page.",
target: "header",
placement: "right"
},
{
title: "My content",
content: "Here is where I put my content.",
target: document.querySelector("#content p"),
placement: "bottom"
}
]
};
public class MockTourSteps
{
public string Title { get; set; }
public string Content { get; set; }
public string Target { get; set; }
public string Placement { get; set; }
}
将巡更步骤直接放入JavaScript库非常有效,但理想情况下,我希望能够将所有这些细节保存在数据库中,并使用AJAX将数据传递到hopsocch.js。(这样可以动态创建巡演,内容可以在不发布代码的情况下更改)
除了我的目标
正在使用document.querySelector()
元素选择器外,一切正常
我的每个巡演步骤的基本C#模型如下所示:
// Define the tour!
var tour = {
id: "hello-hopscotch",
steps: [
{
title: "My Header",
content: "This is the header of my page.",
target: "header",
placement: "right"
},
{
title: "My content",
content: "Here is where I put my content.",
target: document.querySelector("#content p"),
placement: "bottom"
}
]
};
public class MockTourSteps
{
public string Title { get; set; }
public string Content { get; set; }
public string Target { get; set; }
public string Placement { get; set; }
}
由于Target
是一个字符串,因此我必须用双引号传递该值
问题在于,将其序列化为JSON时,使用Chrome Developer工具查看页面时会出现以下错误:
语法错误,无法识别的表达式:document.querySelector(“.btn primary”)
通过查看已返回到页面的JSON数据,我可以看到我的document.querySelector()
周围的双引号导致了问题
当我通过document.querySelector()
指定目标时,我需要从我的目标中删除这些双引号,但当我基于HTML标记(如标题
)指定目标时,将保留双引号
有什么想法可以实现这一点吗?在提供的示例中,主要问题是您使用的是javascript对象,但您将从服务器获得JSON。您需要在客户端使用某种JSON处理
我认为您可以在模型中添加更多信息:
public class MockTourStep
{
public string Title { get; set; }
public string Content { get; set; }
public TargetC Target { get; set; }
public string Placement { get; set; }
public enum TargetType
{
ElementName,
QuerySelector
}
public class TargetC
{
[JsonConverter(typeof(StringEnumConverter))]
public TargetType Type { get; set; }
public string Value { get; set; }
}
}
和样本响应:
var tour = new
{
Id = "hello-hopscotch",
Steps = new List<MockTourStep>
{
new MockTourStep
{
Title = "My Header",
Content = "This is the header of my page.",
Target = new MockTourStep.TargetC
{
Type = MockTourStep.TargetType.ElementName,
Value = "header"
},
Placement = "bottom"
},
new MockTourStep
{
Title = "My content",
Content = "Here is where I put my content.",
Target = new MockTourStep.TargetC
{
Type = MockTourStep.TargetType.QuerySelector,
Value = "document.querySelector('#content p')"
},
Placement = "bottom"
}
}
};
var-tour=new
{
Id=“你好,跳房子”,
步骤=新列表
{
新步骤
{
Title=“我的标题”,
Content=“这是我的页面标题。”,
目标=新MockTourStep.TargetC
{
Type=MockTourStep.TargetType.ElementName,
Value=“header”
},
Placement=“底部”
},
新步骤
{
Title=“我的内容”,
Content=“这里是我放置内容的地方。”,
目标=新MockTourStep.TargetC
{
类型=MockTourStep.TargetType.QuerySelector,
Value=“document.querySelector('#content p')”
},
Placement=“底部”
}
}
};
然后,在客户端,您可以检查目标类型并将其设置为有效值:
$.getJSON("url", function (tour) {
for (var i = 0; i < tour.steps.length; i++) {
var step = tour.steps[i];
switch (step.target.type) {
case "ElementName":
step.target = step.target.value;
break;
case "QuerySelector":
step.target = eval(step.target.value);
break;
default:
throw Error;
}
}
hopscotch.startTour(tour);
});
$.getJSON(“url”,函数(教程){
对于(var i=0;i
请注意eval
用于QuerySelector
。使用eval
是危险的,因此您需要检查您为客户端提供的服务。您是否尝试使用JSON.stringify将javascript值转换为JSON字符串?在上面的JavaScript中,您实际上是在传递document.querySelector()的结果作为target的值,这真的是您想要的吗?如果可能,我想用我的C#处理双引号服务器端@DavidG-是的,我希望能够将document.querySelector()
作为值传递(当然,要选择的元素在括号内:-))@collapsar-不幸的是,在C#中,所有字符串都需要在双引号中定义。问题是这些C#双引号在到达客户端JavaScript时会给我带来问题。@Stu1986C我不确定你是否完全理解我的意思。Javascript传递的是HTML元素(在本例中是p
标记),而不是字符串document.querySelector(…)
。这就是你想要的吗?@Stu1986C我摸索了一下,除了使用javascripteval
,没有其他选择。谢谢Aleksandr。这个逻辑对我来说是有道理的。我会很快试一试,并让你知道它是否对我有效:)有效。谢谢Aleksandr!我唯一需要修改的代码就是switch语句;用各自的枚举整数替换字符串。请注意,我使用了JsonConverter(typeof(StringEnumConverter))
属性。在本例中,该值将被序列化为枚举字符串表示形式。我也有这个表示形式,但它没有将枚举作为字符串发送。这很奇怪,因为它在我的测试项目中起作用。我认为您应该尝试手动序列化您的模型来测试它。