jQuery - 从单击事件更改功能到页面加载

时间:2010-10-27 20:44:42

标签: jquery

我在ascx中有一个jQuery代码,它从gridview获取一个单元格内容并对其进行操作,然后将其写入其他单元格。

通过单击gridview行激活它。

(每行有一个带有Word文件名的第一个单元格。用户点击一行 - jQuery获取第一个单元格中的文件名并将扩展名更改为flv / mp3 - 检查是否有一个带有新名称的文件 - 如果有文件,则会创建指向该文件的图像链接)

我在这段代码上努力工作,但现在客户端希望在页面加载时发生事件(意味着图像链接显示是否存在带有flv / mp3的文件)。

我不想再写一遍,并认为应该有一种方法来改变点击事件。

问题是我对jQuery的效率不高:)

有些jQuery热门可以帮助解决这个问题吗?

这是代码(我对这段代码并不感到自豪,但是它完成了这项工作):

    <script type="text/javascript">
    jQuery(function() {
        jQuery(".SearchResultsGV > tbody > tr:not(:has(table, th))")
            .css("cursor", "pointer")
            .one("click", function(e) {

                var jQuerycell = jQuery(e.target).closest("td");


                var jQuerycurrentCellText = jQuerycell.text();
                var jQueryleftCellText = jQuerycell.prev().text();
                var jQueryrightCellText = jQuerycell.next().text();
                var jQuerycolIndex = jQuerycell.parent().children().index(jQuerycell);
                var jQuerycolName = jQuerycell.closest("table")
                    .find('th:eq(' + jQuerycolIndex + ')').text();
                //Check media 1
                jQuery.ajax({
                    url: 'http://dtora.org.il/Portals/0/Shiurim/' + jQuerycell.parent().children().first().text().replace('.doc', '.mp3'),
                    type: 'HEAD',
                    error:
                        function() {
                            //do something depressing
                            jQuery(jQuerycell.parent().children().last()).append("<img src=http://dtora.org.il/Portals/0/images/noFiles.png />");

                        },
                    success:
                        function() {
                            //do something cheerful :)
                            var jQueryMedia1Name = ('<a href=http://dtora.org.il/Portals/0/Shiurim/' + jQuerycell.parent().children().first().text().replace('.doc', '.mp3') + '><img class="soundFile" src=http://dtora.org.il/Portals/0/images/Music.png /></a>')
                            jQuery(jQuerycell.parent().children().last()).append(jQueryMedia1Name);

                        }
                });
                //Check media 2
                jQuery.ajax({
                    url: 'http://dtora.org.il/Portals/0/Shiurim/' + jQuerycell.parent().children().first().text().replace('.doc', '.flv'),
                    type: 'HEAD',
                    error:
                        function() {
                            //do something depressing
                            jQuery(jQuerycell.parent().children().last()).append("<img src=http://dtora.org.il/Portals/0/images/noFiles.png />");

                        },
                    success:
                        function() {
                            //do something cheerful :)
                            var jQueryMedia2Name = ('<a href=http://dtora.org.il/Portals/0/Shiurim/' + jQuerycell.parent().children().first().text().replace('.doc', '.flv') + '><img class="videoFile" src=http://dtora.org.il/Portals/0/images/Video.png /></a>')
                            jQuery(jQuerycell.parent().children().last()).append(jQueryMedia2Name);

                        }
                });
            });
    });
</script>

2 个答案:

答案 0 :(得分:0)

在页面加载事件上做一些事情会让我觉得更简单。有些事情会改变:

  • 使用选择器,您可以找到您所追求的td元素(单元格),而不必使用event.target属性查找元素(只需将td附加到末尾您的选择器主体)
  • 我不明白为什么你依赖jQuery.index(el)来引用你的元素,为什么不使用id属性?即:

    <th id="th_5"></th> <td id="td_5"></td>

然后当您对td元素进行操作时,您可以执行以下操作:

var th_id = $(this).attr("id").replace("td", "th");
var th_text = $("#" + th_id).text();
  • jQuery为您提供$(this),a 处理指向当前 element(您的案例中为td),使用它
  • jQuery还提供了siblings()方法,因此您可以使用它而不是parent().children()

现在要改变页面加载时发生的事情,我会做这样的事情(我在上面做了一些修改,我希望他们可以帮助你):

$(document).ready(function() {
// being here means that the page is loaded, and we can start
// iterating over the elements

// you have to update your selector to choose td elements
// which I honestly can't tell how with ur selector, UPDATE THIS
  var my_elements = $(".SearchResultsGV > tbody > tr:not(:has(table, th))");

  $.each(my_elements, function() {
        // not needed anymore, we're using $(this)
        //var jQuerycell = jQuery(e.target).closest("td");

        var currentCellText = $(this).text();
        var leftCellText = $(this).prev().text();
        var rightCellText = $(this).next().text();

        // assuming that you have adapted to assigning ids as I have outlined above
        var colName = $("#" + $(this).attr("id").replace("td", "th")).text();

        // I assume this is the Word file you talked about, save it since you're using it often
        var files = { 
            mp3: $(this).siblings().first().text().replace('.doc', '.mp3'),
            flv: $(this).siblings().first().text().replace('.doc', '.flv')
        }

        //Check media 1
        jQuery.ajax({
            // I can't tell what you're referencing here, but I think you only have to update jQuerycell with $(this)
            url: 'http://dtora.org.il/Portals/0/Shiurim/' + files.mp3,
            type: 'HEAD',
            error: function() {
            //do something depressing

                // you're calling parent().children(), why not call siblings()? :)
            //jQuery(jQuerycell.parent().children().last()).append("<img src=http://dtora.org.il/Portals/0/images/noFiles.png />");
                $(this).siblings().last().append("<img src=http://dtora.org.il/Portals/0/images/noFiles.png />");

            },
            success: function() {
                //do something cheerful :)

                var media1Name = ('<a href=http://dtora.org.il/Portals/0/Shiurim/' 
                + files.mp3 
                + '><img class="soundFile" src=http://dtora.org.il/Portals/0/images/Music.png /></a>')
                $(this).siblings().last().append(media1Name)
                // same note here
                //jQuery(jQuerycell.parent().children().last()).append(jQueryMedia1Name);

            }
           });
            //Check media 2
            jQuery.ajax({
            url: 'http://dtora.org.il/Portals/0/Shiurim/' + files.flv,
            type: 'HEAD',
            error: function() {
                //do something depressing
                $(this).siblings().last()).append("<img src=http://dtora.org.il/Portals/0/images/noFiles.png />");
            },
            success: function() {
                //do something cheerful :)
                var media2Name = ('<a href=http://dtora.org.il/Portals/0/Shiurim/'
                    + files.flv
                    + '><img class="videoFile" src=http://dtora.org.il/Portals/0/images/Video.png /></a>')
                $(this).siblings().last().append(media2Name);
            }
        });
  });
});

我希望能回答你的问题,因为我仍然不确定该代码的某些部分,请仔细阅读!

更新:事实上,我不会考虑我描述如何引用thtd元素的方式,这是最好的做法。我在自己的应用程序中做的是获取父对象的引用,然后使用选择器来查找我感兴趣的其他元素(兄弟姐妹)。因此,而不是做:

$(this).attr("id").replace(...) 人们可以这样做: var parent = $(this).parent(); 并使用选择器从那里获得处理程序。

毋庸置疑,这样可以避免为每个元素生成“唯一”id字段的麻烦,而且,我认为jQuery选择器存在是出于这个原因;允许您使用DOM引用而不是您设置的任何属性。在你的应用程序中,你可能需要我没有看过的东西的id,所以如果你这样做,你现在知道两种方式:)

答案 1 :(得分:0)

由于您发布的功能将在$(document).ready运行,如果您只触发点击,这应该是最简单的方法。

只需观察代码的结尾,
实际上是:

            });
    });
</script>

<强>修饰:

                }).click();
    });
</script>