Возвращение JSON в CFFUNCTION и добавление его на слой вызывает ошибку
-
24-10-2019 - |
Вопрос
Я использую плагин QTIP JQUERY для генерации динамической всплывающей панели инструментов. Я получаю ошибку в своем JS, и я не уверен, является ли его источником JSON или JS. Подсказка вызывает следующую функцию: (извините за весь этот код, но это необходимо)
<cffunction
name="fGameDetails"
access="remote"
returnType="any"
returnformat="JSON"
output="false"
hint="This grabs game details for the games.cfm page">
<!---Argument, which is the game ID--->
<cfargument
name="gameID"
type="numeric"
required="true"
hint="CFC will look for GameID and retrieve its details">
<!---Local var--->
<cfset var qGameDetails = "">
<!---Database query--->
<cfquery name="qGameDetails" datasource="#REQUEST.datasource#">
SELECT
titles.titleName AS tName,
titles.titleBrief AS tBrief,
games.gameID,
games.titleID,
games.releaseDate AS rDate,
genres.genreName AS gName,
platforms.platformAbbr AS pAbbr,
platforms.platformName AS pName,
creviews.cReviewScore AS rScore,
ratings.ratingName AS rName
FROM
games
Inner Join platforms ON platforms.platformID = games.platformID
Inner Join titles ON titles.titleID = games.titleID
Inner Join genres ON genres.genreID = games.genreID
Inner Join creviews ON games.gameID = creviews.gameID
Inner Join ratings ON ratings.ratingID = games.ratingID
WHERE
(games.gameID = #ARGUMENTS.gameID#);
</cfquery>
<cfreturn qGameDetails>
</cffunction>
Эта функция возвращает следующий JSON:
{
"COLUMNS": [
"TNAME",
"TBRIEF",
"GAMEID",
"TITLEID",
"RDATE",
"GNAME",
"PABBR",
"PNAME",
"RSCORE",
"RNAME"
],
"DATA": [
[
"Dark Void",
"Ancient gods known as 'The Watchers,' once banished from our world by superhuman Adepts, have returned with a vengeance.",
154,
54,
"January, 19 2010 00:00:00",
"Action & Adventure",
"PS3",
"Playstation 3",
3.3,
"14 Anos"
]
]
}
Проблема, которую я столкнулся, заключается в том, что каждый раз, когда я пытаюсь добавить JSON на слой #Catalog, я получаю синтаксисную ошибку с надписью «отсутствует в скобках». Это JavaScript, который я использую:
$(document).ready(function()
{
$('#catalog a[href]').each(function()
{
$(this).qtip( {
content: {
url: '/gamezilla/resources/components/viewgames.cfc?method=fGameDetails',
data: { gameID: $(this).attr('href').match(/gameID=([0-9]+)$/)[1] },
method: 'get'
},
api: {
beforeContentUpdate: function(content) {
var json = eval('(' + content + ')');
content = $('<div />').append(
$('<h1 />', {
html: json.TNAME
}));
return content;
}
},
style: {
width: 300,
height: 300,
padding: 0,
name: 'light',
tip: {
corner: 'leftMiddle',
size: {
x: 40,
y : 40
}
}
},
position: {
corner: {
target: 'rightMiddle',
tooltip: 'leftMiddle'
}
}
});
});
});
Есть идеи, где я ошибаюсь? Я пробовал много вещей в течение нескольких дней, и я не могу найти проблему.
Большое спасибо!
Решение 5
Оказывается, это отладчик Coldfusion, заставляющий Ajax стать странным. Я обнаружил это давным -давно, но сейчас только пересмотрел проблему. Первое, что нужно сделать при столкновении с ошибкой такого рода,-это отключение отладчика CF, чтобы проверить, вызывает ли это проблему.
Другие советы
Внизу вашего JavaScript есть дополнительный кронштейн, после того, как кронштейн «Положение» закрыта.
Делать console.log(arguments)
Для первой строки beforeContentUpdate
функция (до eval
), чтобы убедиться, что контент ARG - это то, что вы ожидаете?
Кажется, что beforeContentUpdate
не работает. Поэтому я бы предложил использовать onRender
перезвонить:
$(document).ready(function () {
$('#catalog a[href]').each(function () {
var link = $(this);
$(this).qtip({
content: 'loading...',
api: {
onRender: function () {
var self = this;
$.ajax({
url: '/gamezilla/resources/components/viewgames.cfc?method=fGameDetails',
dataType: 'json',
data: { gameID: link.attr('href').match(/gameID=([0-9]+)$/)[1] },
success: function (data) {
self.updateContent(data.DATA[0][0]);
}
});
}
},
style: {
width: 300,
height: 300,
padding: 0,
name: 'light',
tip: {
corner: 'leftMiddle',
size: {
x: 40,
y: 40
}
}
},
position: {
corner: {
target: 'rightMiddle',
tooltip: 'leftMiddle'
}
}
});
});
});
сдача var json = eval('(' + content + ')');
к var json = eval(content);
а также html: json.TNAME
к html: json.COLUMNS.TNAME