gpt4 book ai didi

javascript - 如何在 DOM `data` 属性中定义一个 JSON 对象?

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:03 27 4
gpt4 key购买 nike

我试图在 dataset 属性中设置一些 json 数据。

HTML 看起来像这样

<div data-switch="true" data-json="{'key1': 'value 1'}, {'key2': 'value 2'}">

data-json里面的数据我用JavaScript获取的是这样的:

var json = $("[data-json]").data("json").toString();
json = JSON.stringify(json);

无论我尝试什么,它都不会将其转换为对象。它只返回一个 string

使用 toString()stringify()

$(function() {
json = $("[data-json]").data("json").toString();
json = JSON.stringify(json);
json = JSON.parse(json);

console.log(json);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-json="{'key1': 'value 1'}, {'key2', 'value 2'}">

</div>

当我删除 toString()stringify() 函数时,出现以下错误:Uncaught SyntaxError: Unexpected token ' in JSON at position 1

没有 toString()stringify()

$(function() {
json = $("[data-json]").data("json");
json = JSON.parse(json);

console.log(json);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-json="{'key1': 'value 1'}, {'key2', 'value 2'}">

</div>

摆弄原始的 JavaScriptHTML

/**
* Switch content inside Metro UI blocks
*
* @requires {data-switch} Set data-switch="true" inside the dom
*/
$(function() {

/**
* Get all switch elements
*/
var switches = $("[data-switch]");
/**
* Sample data for each switch element
var switches_data = {
0: {
0: {
image: 'https://cdn.elegantthemes.com/blog/wp-content/uploads/2016/02/rules-good-ui-design-web-project-thumbnail.png',
content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
},
1: {
image: 'http://www.fujitsu.com/fts/Images/28618-workplace-manager580x224_tcm21-1830661.jpg',
content: 'Aliquam interdum sit amet nibh aliquet accumsan.'
},
2: {
image: 'http://cdn.moneycrashers.com/wp-content/uploads/2013/03/manager2.jpg',
content: 'Vestibulum sed metus eu justo sagittis congue.'
}
},
1: {
0: {
image: 'https://cdn.elegantthemes.com/blog/wp-content/uploads/2016/02/rules-good-ui-design-web-project-thumbnail.png',
content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
},
1: {
image: 'http://www.fujitsu.com/fts/Images/28618-workplace-manager580x224_tcm21-1830661.jpg',
content: 'Aliquam interdum sit amet nibh aliquet accumsan.'
},
2: {
image: 'http://cdn.moneycrashers.com/wp-content/uploads/2013/03/manager2.jpg',
content: 'Vestibulum sed metus eu justo sagittis congue.'
}
},
2: {
0: {
image: 'https://cdn.elegantthemes.com/blog/wp-content/uploads/2016/02/rules-good-ui-design-web-project-thumbnail.png',
content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'
},
1: {
image: 'http://www.fujitsu.com/fts/Images/28618-workplace-manager580x224_tcm21-1830661.jpg',
content: 'Aliquam interdum sit amet nibh aliquet accumsan.'
},
2: {
image: 'http://cdn.moneycrashers.com/wp-content/uploads/2013/03/manager2.jpg',
content: 'Vestibulum sed metus eu justo sagittis congue.'
}
}
};
*/
/**
* Check if elements exists
*/
if(switches.length > 0) {
/**
* Loop through objects
*
* @var c Object Key
* @var e Object Value
*/
$.each(switches, function(c, e) {
/**
* Get switches data current object
*/
var switches_data = $(this).data("switches");
console.log(switches_data);
/**
* Get next div
*/
var next = $(this).children().first()[0];
next = $(next);
/**
* Set type animation
*/
var animation = "flipInX";
/**
* Set index where to start from
*/
var index = 0;
/**
* Generate interval seconds, a random number so they will never be the same
*/
var x = Math.floor((Math.random() * 6000) + 3000);
/**
* Loop through switches
*
* @var i Object Key
* @var b Object Value
*/
$.each(switches_data, function(i, b) {
/**
* Create new element for each switches
*/
var el = $("<div />").attr({class: "metro-ui-column-content animated", id: "content-column-" + i});
/**
* Append el to next element, previous defined
*/
el.appendTo(next);
/**
* Set background image for el
*/
el.css({
"background": "url("+ b.image +") no-repeat",
"background-size": "cover"
});
/**
* Append html content
*/
el.html( "<div class=\"metro-ui-column-html\">" + b.content + "</div>");
});

/**
* Set static this
*/
var self = $(this);
/**
* Find all animated object
*/
var animated = $(this).find(".animated");
/**
* Generate random number between 2000 and 4000, it acts as seconds for interval
*/
var x = Math.floor((Math.random() * 8000) + 4000);
/**
* Loop through animated objects
*
* @var i Object Key
* @var e Object Value
*/
$.each(animated, function(i, e) {
/**
* Start with the first animated object in the current loop
*/
if(i === 0) {
/**
* Start with an timeout with random generated content, so no content will ever be loaded at the same time
*/
setTimeout(function() {
/**
* Gets visible by setting the z-index
*/
$(e).css("z-index", 2).addClass("flipInX");
}, x);
}
});
/**
* Set new index higher than first object
*/
var index = 3 ;
/**
* Set interval function to start looping the animation
*/
setInterval(function() {
/**
* Get next object from current object
*/
var next = self.find(".flipInX").next();
/**
* If there is no next object reset to first object
*/
if(next.length === 0) {
/**
* Update next to first object cause next doenst exist
*/
var next = self.find(".animated").first();
}
/**
* Set new index and add animation class
*/
next.css("z-index", index++).addClass("flipInX").siblings().removeClass("flipInX");
}, x);
});
}

});
@import url('https://fonts.googleapis.com/css?family=Roboto:400,700');
body {
background-color: #f1f1f1;
font-family: 'Roboto', sans-serif;
font-size: 14px;
}
* {
box-sizing: border-box;
}
/* Metro theme UI */
.metro-theme-ui {
max-width: 450px;
margin: 40px auto;
height: 250px;
}
.metro-ui-row {
position: relative;
width: 100%;
min-height: 1px;
/* Fix breaking when height is 0 */
}
.metro-ui-row:after,
.metro-ui-row:before {
display: table;
content: " ";
clear: both;
}
.metro-ui-column {
position: relative;
background: #12A7CC;
padding: 50px;
box-shadow: 1px 1px 2px #ccc;
overflow: hidden;
}
.metro-ui-column.fadeIn {
animation: fadeIn .33s ease;
}
.metro-ui-column.fadeOut {
animation: fadeOut .33s ease;
}
.metro-ui-column .metro-ui-column-content {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.metro-ui-column .metro-ui-column-html {
background: rgba(0, 0, 0, 0.5);
position: absolute;
color: #fff;
left: 0;
top: 0;
width: 100%;
height: 100%;
padding: 10px;
}
/* Calculate column width */
.metro-ui-col {
padding: 2px;
float: left;
}
.metro-ui-col-10 {
width: calc(100%);
}
.metro-ui-col-9 {
width: calc(11.11111111%);
}
.metro-ui-col-8 {
width: calc(12.5%);
}
.metro-ui-col-7 {
width: calc(14.28571429%);
}
.metro-ui-col-6 {
width: calc(16.66666667%);
}
.metro-ui-col-5 {
width: calc(20%);
}
.metro-ui-col-4 {
width: calc(25%);
}
.metro-ui-col-3 {
width: calc(33.33333333%);
}
.metro-ui-col-2 {
width: calc(50%);
}
.metro-ui-col-1 {
width: calc(100%);
}
/* Keyframes */
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.animated.flipOutX,
.animated.flipOutY,
.animated.bounceIn,
.animated.bounceOut {
-webkit-animation-duration: .75s;
animation-duration: .75s;
}
@keyframes flipInX {
from {
left: -100%;
}
to {
left: 0;
}
}
.metro-ui-column .metro-ui-column-content.flipInX {
-webkit-animation-name: flipInX;
animation-name: flipInX;
-webkit-backface-visibility: visible !important;
backface-visibility: visible !important;
}
@keyframes flipOutX {
from {
-webkit-transform: perspective(400px);
transform: perspective(400px);
}
30% {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 0deg);
transform: perspective(400px) rotate3d(1, 0, 0, 0deg);
opacity: 1;
}
to {
-webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
opacity: 0;
}
}
.flipOutX {
-webkit-animation-name: flipOutX;
animation-name: flipOutX;
-webkit-backface-visibility: visible !important;
backface-visibility: visible !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="metro-theme-ui">
<div class="metro-ui-row">
<div class="metro-ui-col metro-ui-col-10">
<div class="metro-ui-column"></div>
</div>
</div>
<div class="metro-ui-row">
<div class="metro-ui-col metro-ui-col-3" data-switch="true" data-switches='{"image": "https://cdn.elegantthemes.com/blog/wp-content/uploads/2016/02/rules-good-ui-design-web-project-thumbnail.png", "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."}, { "image": "http://www.fujitsu.com/fts/Images/28618-workplace-manager580x224_tcm21-1830661.jpg", "content": "Aliquam interdum sit amet nibh aliquet accumsan."}, { "image": "http://cdn.moneycrashers.com/wp-content/uploads/2013/03/manager2.jpg", "content": "Vestibulum sed metus eu justo sagittis congue." }'">
<div class="metro-ui-column"></div>
</div>
<div class="metro-ui-col metro-ui-col-3">
<div class="metro-ui-column"></div>
</div>
<div class="metro-ui-col metro-ui-col-3">
<div class="metro-ui-column"></div>
</div>
</div>
<div class="metro-ui-row">
<div class="metro-ui-col metro-ui-col-3">
<div class="metro-ui-column"></div>
</div>
<div class="metro-ui-col metro-ui-col-3">
<div class="metro-ui-column"></div>
</div>
<div class="metro-ui-col metro-ui-col-3">
<div class="metro-ui-column"></div>
</div>
</div>
</div>

最佳答案

您实际上可以只传递一个有效的 json 对象,它应该可以正常工作。

json = $("[data-json]").data("json");

console.log(typeof(json))
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div data-switch="true" data-json='[{"key1": "value 1"}, {"key2": "value 2"}]'>

关于javascript - 如何在 DOM `data` 属性中定义一个 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com