我的页面顶部有'A-Z'字母。当用户点击一个字母时,我对CFC执行AJAX调用,该CFC根据所选字母执行缩略图图像目录的查询,并返回相应文件名的列表。
当列表返回到我在页面上的函数时,我正在使用split()
对文件名执行多个函数来提取某些信息。例如,文件名的格式如下:lastname_firstnameIMG_1234_RGB.jpg
我的目标是提取我的CFC中的姓氏,名字和号码,以便我可以标记缩略图图像并创建指向“真实”文件的链接,例如lastname_firstnameIMG_1234_CMYK.tif
等。
最初,我使用split()
构建了我的AJAX函数来处理返回的列表,但我在IE中遇到错误。为了缓解这个问题,我宁愿在我的CFC中执行字符串函数并返回准备好的数据。
如何在返回数据结构之前在CFC中执行字符串函数?
编辑这个设置在Safari和FF中很有名,但在IE中却出错了。我尝试修改split()
函数并取得了一些成功但当然,它在FF中无法正常工作。同样,我的目标是消除javascript字符串mods并在CFC中执行。
这是我的CFC:
<cffunction name="List" access="remote" output="no" returntype="struct">
<cfargument name="letter" required="yes" type="string">
<cfset local = StructNew()>
<cfset local.response = StructNew()>
<cfset local.response["error"] = "">
<cfset local.response["message"] = "">
<cfset local.data = #arguments.letter# & "*.jpg">
<cfdirectory
action="list"
directory="#thumbsdir#"
recurse="true"
listinfo="name"
name="qFile"
filter="#local.data#"
/>
<cfset local.response["message"] = #qFile#>
<cfreturn local.response>
</cffunction>
我的AJAX函数(包含在document.ready函数中......):
$('.lastname').click(function(e){
e.preventDefault();
$('#emptymessage').hide();
$('#searching').show();
$('#content').html("");
var alpha = $(this).attr('id');
$.getJSON("cfcengine.cfc?method=List&returnformat=json&queryFormat=column",
{letter:alpha},
function(res, code) {
var s = "";
if(res.message.ROWCOUNT > 0) {
$('#searching').hide();
for(var i=0; i<res.message.ROWCOUNT; i++) {
//This is all the stuff I want to get rid of...
var theFile = res.message.DATA.Name[i]
var theLastName = theFile.split(/_(.+)/)[0];
var theRest = theFile.split(/_(.+)/)[1];
var theFirstNameAll = theRest.split(/_(.+)/)[0];
var theFirstName = theFirstNameAll.split(/(?:IMG)/)[0];
var theImageAll = theRest.split(/_(.+)/)[1];
var theImage = theImageAll.split(/_(.+)/)[0];
var bw = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_BW.jpg';
var rgb = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_RGB.jpg';
//Right now I'm just returning the name to the page until debugging is complete...
s += '<p>' + res.message.DATA.Name[i] + '<\/p>';
}
} else {
var s = "Sorry, nothing matched your search.";
}
$("#content").html(s);
//End response
}
//End getJSON
);
//End plist click function
});
答案 0 :(得分:1)
对于JavaScript,我会废除正则表达式文字并简化split()
:
// replace with res.message.DATA.Name[i]
var theFile = 'lastname_firstnameIMG_1234_RGB.jpg';
// ['lastname', 'firstnameIMG', '1234', RGB.jpg']
var pieces = theFile.split('_');
//lastname
var theLastName = pieces[0];
//firstname
var theFirstName = pieces[1].slice(0, pieces[1].length - 3);
//1234
var theImage = pieces[2];
var bw = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_BW.jpg';
var rgb = theLastName + '_' + theFirstName + 'IMG_' + theImage + '_RGB.jpg';
// lastname_firstnameIMG_1234_BW.jpg'
alert(bw);
// lastname_firstnameIMG_1234_RGB.jpg'
alert(rgb);
以下是我在<cfscript>...</cfscript>
中执行此操作的方法:
theFile = 'lastname_firstnameIMG_1234_RGB.jpg';
// ['lastname', 'firstnameIMG', '1234', RGB.jpg']
pieces = theFile.split('_');
//lastname
theLastName = pieces[1];
//firstname
theFirstName = left(pieces[2], len(pieces[2]) - 3);
//1234
theImage = pieces[3];
bw = theLastName & '_' & theFirstName & 'IMG_' & theImage & '_BW.jpg';
rgb = theLastName & '_' & theFirstName & 'IMG_' & theImage & '_RGB.jpg';
// lastname_firstnameIMG_1234_BW.jpg'
writeOutPut(bw & "<br/>");
// lastname_firstnameIMG_1234_RGB.jpg'
writeOutPut(rgb);
答案 1 :(得分:0)
ColdFusion可以使用
在一行代码中完成ListFirst(list [, delimiters, includeEmptyValues ])
因为_在你的情况下确实充当了分隔符。
ListFirst和ListLast是非常方便的功能。