每次调用一个新函数。每个循环3次

时间:2012-09-22 07:56:08

标签: jquery ajax each

我有一个Jquery脚本,它加载XML文件并吐出内容。但是,我想将这些内容格式化为一个表,每行3列。目前,它有一个很长的行,我没有在google上找到任何关于在.each加载了几个项目之后调用新函数的内容。

重申一点,我想在之后执行 function newrow() if(hideproduct ==“”){} 已成功执行3次。

var product_xml = "xml/products_loaded.xml"
function xmlParser() {
$.ajax({
    type: "GET",
    url: product_xml,
    dataType: "xml",
    success: function(xml) {

        function newrow(){
            $("#output").append("</tr><tr>")
        }

        $(xml).find("SAVED_EXPORT").each(function(){

            var productcode = $(this).find("productcode").text()
            var productname = $(this).find("productname").text()
            var productprice = $(this).find("productprice").text()
            var hideproduct = $(this).find("hideproduct").text()

            if(hideproduct == ""){
                $("#output").append("<td class='product' id='" + productcode + "'>"
                + "<a href='/i/" + productcode + ".htm' title='" + productname + ", " + productcode + "'>" + productname + "</a><br>"
                + "<span><font class='text colors_text'><b><span class='price'>Our Price</span>: </b></font> $" + productprice + "</span><br>"
                + "<img src='/v/vspfiles/photos/" + productcode + "-1.jpg' border='0' alt='" + productname + "'>"
                + "</td>");;

            }
        })      
    }
})
}

提前感谢任何想知道如何解决这个问题的人。

2 个答案:

答案 0 :(得分:2)

关键是你需要一个.each之外的计数器变量来存储状态:

var count = 0;

因为您无法使用var回调函数中的本地.each声明来存储状态变量。

然后,在if (hideproduct ...)块内,计算它被调用的次数:

++count;

如有必要,请调用函数

if (count === 3) {
    newRow();
    count = 0;
}

碰巧您的newRow()功能无法正常工作,因为您无法使用.append创建不平衡的HTML代码。

更好的解决方案是:

var tr = null;
var count = 0;

$(xml).find("SAVED_EXPORT").each(function() {
     if (hideproduct === "") {
         if (tr === null) {    // create a new row
             tr = $('<tr>').appendTo('#output');
         }

         tr.append(...);       // add your content

         if (++count % 3 === 0) {
             tr = null;        // force a new <tr> on the next iteration
         }
     }
});

请注意,只有在必要时才会创建新的<tr>,然后<td>元素中的新内容会直接添加到#output元素中,而不会添加到{{1}}。

答案 1 :(得分:0)

这个怎么样?

    var i = 1;
    $(xml).find("SAVED_EXPORT").each(function(){

        [...]

        if(hideproduct == ""){
            [...]
            if(i%3 == 0)
                newRow();
            i++;
        }
    });

我不确定你想要测试“3-test”的确切位置,但你明白了!基本上,i%3 == 0测试将检查我是否是3(0,3,6,9 ...)的倍数。