jQuery不会更改标签的Css,也可能找不到标签

时间:2012-06-25 08:02:14

标签: jquery css jquery-selectors

我有以下代码,我使用clone()delegate()。 代码正在带有链接的jQuery UI对话框中加载。 问题是Ajax被正确触发,它调用成功方法,但是没有显示Ok或noOk div,我的意思是警报触发但是div的css没有改变,你认为我的问题在哪里?选择器有问题吗?感谢

    <input id="TaskId" name="TaskId" type="hidden" value="18" />
    <div id="MainDiv">
        <div id="toClone">
            <div style="display: inline;">
                <select id="Tasksess">
                    <option value="">لطفاً کار را انتخاب کنيد</option>
                    <optgroup label="کار های جديد">
                            <option value="16"style="">q3fe</option>
                            <option value="18"style="">fjhv j</option>
                            <option value="19"style="">wref</option>
                            <option value="25"style="">ff</option>
                    </optgroup>
                    <optgroup label="کار های در دست اقدام">
                            <option value="13"style="">rr</option>
                            <option value="15"style="">yy</option>
                    </optgroup>
                    <optgroup label="کار های تمام شده">
                            <option value="14"style="">tt</option>
                            <option value="18"style="">fjhv j</option>
                    </optgroup>
                </select>
            </div>
            <div style="display: inline;">
                <select id="Statusess" name="Statusess">
                    <option value="">لطفاً وابستگی را انتخاب کنيد</option>
                    <option value="1">پيشنياز</option>
                    <option value="2">همنياز</option>
                </select>
            </div>
            <div style="display: none;" id="Ok">
                ok
            </div>
            <div style="display: none;" id="noOk">
                تکراری
            </div>
            <div id="loadingGif" style="display: none;">
                <img src="/Content/Images/ajax-loader/253L.gif" alt=""/>
            </div>
        </div>
    </div>
    <script type="text/javascript">
        $(document).ready(function () {

            var Maindiv = $("#MainDiv");
            var toClone = $("#toClone");

            //$("#Statusess").each(function () {
                $("#MainDiv").delegate('#Statusess', 'change', function () {
                    if ($(this).find(":selected").val() != "") {                    
                        if ($(this).parent().prev().find(":selected").val() != "") {
                            $(this).parent().parent().find("#loadingGif").attr("style", "display: inline;");
                            $.ajax({
                                url: '/ProjectAdmin/Project/AddTaskDependency?MainTaskId=' + $("#TaskId").val() + '&DependentTaskId=' + $(this).parent().prev().find(":selected").val() + '&Status=' + $(this).find(":selected").val(),
                                type: 'GET',
                                success: function (data, status) {
                                    if (data != "0") {
                                        $(this).parent().parent().find("#Ok").css('display', 'inline');
                                        $(this).parent().parent().find("#noOk").css('display', 'none');
  alert("1");
                                    }
                                    else if (data == "0") {
                                        $(this).parent().parent().find("#Ok").css('display', 'none');
                                        $(this).parent().parent().find("#noOk").css('display', 'inline');
  alert("2");
                                    }
                                    var div = $('div:eq(0)', Maindiv).clone();
                                    Maindiv.append(div);
                                }
                            });
                            $(this).parent().parent().find("#loadingGif").attr("style", "display: none;");

                        }
                    }
                });
            //});

        });
    </script>

3 个答案:

答案 0 :(得分:1)

我不能肯定这是问题,但肯定是你应该纠正的。如果我正确理解您的代码,那么您正在克隆#toClone div。但是,在该div中有许多具有id的孩子,包括#Ok#noOk ID应该是唯一到页面,因此一旦克隆,您将不再拥有唯一的项目。因此,您应该将它们全部更改为类:

  • id="toClone"class="toClone"
  • id="Tasksess"class="Tasksess"
  • id="Statusess"class="Statusess"
  • id="Ok"class="Ok"
  • id="noOk"class="noOk"
  • id="loadingGif"class="loadingGif"

(但是,如果您确实希望OknoOkloadingGif成为toClone div的子项,或者您只是想要它们,我会有疑问成为MainDiv的独特子项。您的代码似乎如此。如果是后者,那么您需要更改</div> div的结束toClone标记,而不是包装唯一Ok div 1}},noOkloadingGif元素。在这种情况下,您可以为这些独特的孩子留下ID。)

更改后,您需要更改代码的其余部分以选择类,而不是ID;但也适用于新克隆的子类的特定类。更改为类可能会解决您的问题,因为克隆创建的多个id项可能会使您的jquery找不到项目。

答案 1 :(得分:1)

我相信你的主要问题在于你的选择者,是的。您可以添加额外的警报以在每个引用处吐出值,以查看它出错的位置。

我对这种方法感到恼火,所以我对你的设置进行了一些修改,(除了没有你的AskTaskDependancy文件我无法测试的ajax片段)让它工作我相信你的预期。

首先,the jsFiddle

注意:我将所有文字都改为英文。这与你的代码无关,我只是非英语文盲,所以随意改回来,因为它对代码没有影响。

更改日志

  • 如果alert()的值为空,则添加错误select
  • $(this).find(":selected").val()只需$(this).val()
  • camelCase的几个引用名称
  • MainDiv中的所有ID到类
  • 将类名从select元素移动到包含每个
  • 的div
  • .parent.prev().parent.children(".tasksess")(及其他元素的类似参考方案)
  • 设置var以便于参考每个div / select
  • 将css()更改为attr()(隐藏/显示ok / notOk)
  • 我在单独的行上构建了ajax url以便于阅读。
  • clone()移到ajax请求之外以验证它是否正常工作(随意根据需要将其移回 - 请注意,如果您不先隐藏它,则仍然会在每个副本中显示loadingGif)< / LI>
  • 注释掉了ajax的测试请求

新HTML

<input id="TaskId" name="TaskId" type="hidden" value="18" />
<div id="MainDiv">
    <div class="toClone">
        <div class="tasksess" style="display: inline;">
            <select name="tasksess">
                <option value="">Select a Task</option>
                <optgroup label="Group 1">
                        <option value="16"style="">q3fe</option>
                        <option value="18"style="">fjhv j</option>
                        <option value="19"style="">wref</option>
                        <option value="25"style="">ff</option>
                </optgroup>
                <optgroup label="Group 2">
                        <option value="13"style="">rr</option>
                        <option value="15"style="">yy</option>
                </optgroup>
                <optgroup label="Group 3">
                        <option value="14"style="">tt</option>
                        <option value="18"style="">fjhv j</option>
                </optgroup>
            </select>
        </div>
        <div class="statusess" style="display: inline;">
            <select name="statusess">
                <option value="">Select a Status</option>
                <option value="1">opt8</option>
                <option value="2">opt9</option>
            </select>
        </div>
        <div class="ok" style="display: none;">
            Everything looks good!
        </div>
        <div class="notOk" style="display: none;">
            Something went wrong!
        </div>
        <div class="loadingGif" style="display: none;">
            Loading...
            <img src="/Content/Images/ajax-loader/253L.gif" alt=""/>
        </div>
    </div>
</div>​

新的jQuery / JavaScript

$(document).ready(function () {

    var Maindiv = $("#MainDiv");
    var toClone = $(".toClone");

    $("#MainDiv").delegate('.statusess', 'change', function () {
        var thisSel = $(this).children("select");
        var prevSel = $(this).parent().children(".tasksess").children("select");
        var divOk = $(this).parent().children(".ok");
        var divNotOk = $(this).parent().children(".notOk");
        var divLoad = $(this).parent().children(".loadingGif");

        if (thisSel.val() != "") {
            console.log("status changed to val " + thisSel.val());
            if (prevSel.val() != "") {
                console.log("task is val "+prevSel.val());

                divLoad.attr("style", "display: inline;");
                var url = '/ProjectAdmin/Project/AddTaskDependency';
                url += '?MainTaskId=' + $("#TaskId").val();
                url += '&DependentTaskId=' + prevSel.val();
                url += '&Status=' + thisSel.val();
                console.log("URL= "+url);
                /*
                $.ajax({
                    url: url, type: 'GET',
                    success: function (data, status) {
                        if (data != "0") {
                            divOk.attr("style","display:inline;");
                            divNotOk.attr("style","display:none;");
                        }
                        else if (data == "0") {
                            divOk.attr("style","display:none;");
                            divNotOk.attr("style","display:inline;");
                        }
                    }
                });
                */
                divLoad.attr("style", "display: none;");
                var div = $('div:eq(0)', Maindiv).clone();
                Maindiv.append(div);

            } else { alert("Select 1 val is empty"); }
        } else { alert("Select 2 val is empty"); }
    });

});​

答案 2 :(得分:0)

以下行不正确:

$$("#MainDiv").delegate('#Statusess', 'change', function () { 

$$("#MainDiv")更改为$("#MainDiv")