我只是在学习javascript,所以我想这是相对简单的,但现在已经让我烦恼了一段时间。
我有一个函数,只显示我从AJAX响应中调用的一些文本。这是我的代码。
if(this.responseText != null)
{
var text = "<ul>";
var object = eval("(" + this.responseText + ")");
var track;
for (var i = 0; i < object.length; i++)
{
track = object[i];
text += "<li><img src=\"" + track.artwork_url + "\"/>";
text += track.title;
text += "<ul><li><a href=\"#\" onclick=\"playTrack(" + track + ");return false;\">Play</a></li>"
text += "<li><a href=\"" + track.download_url + "?client_id=" + clientId + "\">Download</a></li></ul>"
text += "</li>";
}
text += "</ul>";
document.getElementById("content").innerHTML = text;
}
function playTrack(track)
{
document.getElementById("content").innerHTML = "This has worked";
}
我不喜欢将track对象传递给playTrack函数(现在只显示一些文本的简单函数)。我收到错误“Uncaught SyntaxError:Unexpected identifier”
如果我传入track.id(或任何其他属性),一切正常,我不明白。
感谢您的帮助,
B先生。
答案 0 :(得分:2)
您无法传递此类对象。 track
正在转换为字符串,然后您的playTrack
函数调用失败,因为语法错误。它将被渲染(类似onclick=playTrack([Object object])
,显然不是有效的JavaScript)。传递track.id有什么问题,因为你知道它有用吗?
答案 1 :(得分:1)
@alpian和@Jim是对的,你需要将对象转换为json字符串,你可以使用http://www.json.org/js.html。
...
text += "<ul><li><a href=\"#\" onclick=\"playTrack('" + JSON.stringify(track) + "');return false;\">Play</a></li>"
...
答案 2 :(得分:0)
创建“playTrack”onclick事件时,您正在以错误的方式使用轨道变量。 “track”是一个对象,使用它作为字符串将是[Object object]。所以在你的“html”中你会有类似onclick =“playtrack([Object object])”的东西,这在语法上是错误的。
答案 3 :(得分:0)
我强烈建议使用JSON.parse()
代替eval
。我没有将列表条目构建为文本,而是使用document.createElement()
将它们作为DOM对象,并将单击处理程序添加为addEventListener
,这样您就不需要尝试包含JS对象作为HTML流中的文本。