在从CFC返回结果之前,在AJAX查询上执行字符串函数

时间:2011-04-19 15:01:49

标签: javascript regex string coldfusion cfc

我的页面顶部有'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  
});

2 个答案:

答案 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是非常方便的功能。