1

我有大约十几个事件要检查,并且所有选择器的名称都类似(迭代地)。我怎样才能缩短这个程序?

$(document).ready(function() {
    $(document).on('click','#del_od1', function() {
        $('#change_od1').val('YES');
        $('#span_od1').html('(Deleted)');
        $('#status_od1').val('DELETED');
    });
    $(document).on('click','#del_od2', function() {
        $('#change_od2').val('YES');
        $('#span_od2').html('(Deleted)');
        $('#status_od2').val('DELETED');
    });
    $(document).on('click','#del_od3', function() {
        $('#change_od3').val('YES');
        $('#span_od3').html('(Deleted)');
        $('#status_od3').val('DELETED');
    });
});

这个问题名字不好。有人还可以建议一个更准确的标题,我会在接受答案之前将其更改为该标题。


编辑:

响应 ajax 调用会回显整个表结构。表的顶部是这样的:

$r = '
    <table id="DocTable">
        <tr>
            <th width="170">Document Title</th>
            <th width="170">MetShare FN</th>
            <th width="50">Action</th>
            <th width="50">Delete</th>
        </tr>';

随后是几行不相关的行,其中包含呼叫中请求的信息。然后将其附加到前一个位,整个内容回显为echo $r;.

$rest_docs =  $aProj['all_project_docs'];
$ocnt = 0;
if ($rest_docs !== ''){
    $ocnt = $ocnt + 1;
    $aRest_docs = explode('?',$rest_docs);
    foreach($aRest_docs as $doc){
        $aDoc_parts = explode('|',$doc);

        $r = $r . '
        <tr>
            <td>'.$aDoc_parts[0].'</td>
            <td>
                <span id="span_od' . $ocnt . '">
                    <a href="'.$aDoc_parts[1].'" target="blank">
                    '. $aDoc_parts[1] .'
                    </a>
                </span>
                <input type="hidden" id="status_od' . $ocnt . '" name="status_od' . $ocnt . '">
            </td>
            <td>
                <a id="change_od' . $ocnt . '" class="normal" href="#">change</a>
                <input type="file" id="if_od' . $ocnt . '" name="if_od' . $ocnt . '" style="display:none">
                <input type="text" style="display:none">
            </td>
            <td>
                <a href="#" id="del_od' . $ocnt . '">delete</a>
            </td>
        </tr>';
    }
}

echo $r;
4

4 回答 4

3

jsBin(仅举例)演示

所有这些名字的共同点......

   del_od1
change_od1
  span_od1
status_od1

is:      1      :)   (a number, and so for all other elements)

......所以我们需要抓住它!看:

$(document).ready(function() {
    $(document).on('click','[id^=del_od]', function() {//^="starts with selector"

        var num = this.id.split('od')[1];  // returns our number from the id!
        // from now on we can use our var "num" :

        $('#change_od'+ num).val ('YES');
        $('#span_od'  + num).html('(Deleted)');
        $('#status_od'+ num).val ('DELETED');
    });
});
于 2012-09-15T00:15:16.240 回答
2

显而易见的方法是

$(document).ready(function() {
    for(var i = 1; i < 10; ++i) {
        $(document).on('click','#del_od' + i, (function(index) {
            return function() {
                $('#change_od' + index).val('YES');
                $('#span_od' + index).html('(Deleted)');
                $('#status_od' + index).val('DELETED');
            };
        })(i));
    }
});

但是,通过使用类而不是 id 并利用您拥有的有关文档结构的信息,您极有可能在没有这种粗鲁的编码风格的情况下实现相同的效果。你能举个例子吗?

于 2012-09-14T23:46:03.860 回答
1

在 jQuery 中,您可以避免关闭并使用event.data。这对我来说看起来更干净。

jQuery(document).ready(function($) { 
    for(var i = 1; i < 10; ++i) {
        $(document).on('click','#del_od' + i,{'index': i},function(e) {
            var index = e.data.index;
            $('#change_od' + index).val('YES');
            $('#span_od' + index).html('(Deleted)');
            $('#status_od' + index).val('DELETED'); 
        })
    }
});

演示

参考

于 2012-09-15T05:39:59.943 回答
0

通过从 id 中解析 id 后缀,您可以使用一个事件处理程序为它们提供所有服务:

$(document).ready(function() {
    $(document).on('click','[id^="del_"]', function() {
        var suffix = this.id.replace(/^.*?_/, "");
        $('#change_' + suffix).val('YES');
        $('#span_' + suffix).html('(Deleted)');
        $('#status_' + suffix).val('DELETED');
    });
});

这也可以通过使用删除按钮与受影响项目的 HTML 关系来解决。

如果您可以修改 HTML 以使用各种目标的类,那么只需使用按下的按钮与所需目标的关系,就可以在没有任何 id 的情况下这样做:

    <tr>
        <td>'.$aDoc_parts[0].'</td>
        <td>
            <span id="span_od'  . $ocnt . '" class="spanTarget">
                <a href="'.$aDoc_parts[1].'" target="blank">
                '. $aDoc_parts[1] .'
                </a>
            </span>
            <input type="hidden" id="status_od' . $ocnt . '" class="statusTarget" name="status_od' . $ocnt . '">
        </td>
        <td>
            <a id="change_od' . $ocnt . '" class="changeTarget normal" href="#">change</a>
            <input type="file" id="if_od' . $ocnt . '" name="if_od' . $ocnt . '" style="display:none">
            <input type="text" style="display:none">
        </td>
        <td>
            <a href="#" id="del_od' class="deleteButton" . $ocnt . '">delete</a>
        </td>
    </tr>';

而且,这将是仅基于位置和类(无 id)的脚本:

$(document).ready(function() {
    $(document).on('click', '.deleteButton', function() {
        var parent = $(this).closest("tr");
        parent.find('.changeTarget').val('YES');
        parent.find('.spanTarget').html('(Deleted)');
        parent.find('.statusTarget').val('DELETED');
    });
});

这将获取单击的删除按钮所在的行,然后找到同一行中的更改、跨度和状态对象并对其进行操作。根本没有使用任何 ID。这使用单击按钮的位置来查找它操作的对象。

于 2012-09-14T23:56:15.200 回答